目次
前提
AWSの障害情報を確認しようと思うと、まずは AWS Personal Health Dashboard
の情報をAmazonSNS経由でSlackに通知するという、確実でお手軽な方法を検討するかと思います。
これはこれで設定を行い Design for Failure
を意識して他の手段も用意してみたいと思います。
どこまで気にするかという部分はあるので、今回は誰でも確認できる AWS Service Health Dashboard
の情報もSlackに通知されるようにしたいと思います。
RSS Feed URLが分割されている
AWS Service Health Dashboard
を確認するとわかるのですが、対象のリージョンとサービスの組み合わせでRSS FeedのURLが分割されています。
SlackにRSS Feedを登録するには、RSSアプリをワークスペースにインストールして /feed subscribe [RSS Feed URL]
のスラッシュコマンドを入力する必要があります。
この分割されたURLが数十個というレベルではないので、手動で登録するというのは非現実的な対応となります。
1つのURLに情報が集約されているものがあれば解決しそうなのですが.・・・調べてみると http://status.aws.amazon.com/rss/all.rss
というURLが存在するようです。
Service Health DashboardのRSSページについて
https://forums.aws.amazon.com/thread.jspa?threadID=181220forums.aws.amazon.com
実際に http://status.aws.amazon.com/rss/all.rss
を確認してみると
- 全リージョンの情報が配信されているように見える
- 直近15件の情報が配信されているように見える
という感じになっていそうなので、この情報で必要十分な場合には問題解決となります。
しかし、実際には利用しているリージョンが限られていて、全リージョンの情報よりも必要なものだけを選んで登録しておく方が使い勝手が良さそうです。
リージョンとサービスの組み合わせでURLが個別化されているので、整理する場合もリージョンとサービスを軸にして整理するとスッキリしそうです。
AWS Service Health Dashboardをスクレイピングして整理する
数の問題で手動は無理そうなのは分かったので、自動でどうにかする方法を考えます。 まずは、全部のRSS Feed URLを取得して必要な情報を選び出せるようにします。
ということで、久しぶりに手を動かせる機会なのでgolangで作ってみました。
やっていることは単純で AWS Service Health Dashboard
のWebからRSSのURLをスクレイピングして、リージョン単位とサービス単位で整理した状態で ファイルに出力します。
ファイルの内容はSlackのRSS Feed登録用のリストとなっていて /feed subscribe [RSS Feed URL]
の形式で1行単位で出力されています。
# GLOBAL /feed subscribe https://status.aws.amazon.com/rss/awsiotdevicemanagement.rss /feed subscribe https://status.aws.amazon.com/rss/awswaf.rss /feed subscribe https://status.aws.amazon.com/rss/billingconsole.rss /feed subscribe https://status.aws.amazon.com/rss/chatbot.rss /feed subscribe https://status.aws.amazon.com/rss/chime.rss /feed subscribe https://status.aws.amazon.com/rss/cloudfront.rss /feed subscribe https://status.aws.amazon.com/rss/globalaccelerator.rss /feed subscribe https://status.aws.amazon.com/rss/iam.rss /feed subscribe https://status.aws.amazon.com/rss/import-export.rss /feed subscribe https://status.aws.amazon.com/rss/interregionvpcpeering.rss /feed subscribe https://status.aws.amazon.com/rss/management-console.rss /feed subscribe https://status.aws.amazon.com/rss/marketplace.rss /feed subscribe https://status.aws.amazon.com/rss/organizations.rss /feed subscribe https://status.aws.amazon.com/rss/resourcegroups.rss /feed subscribe https://status.aws.amazon.com/rss/route53.rss /feed subscribe https://status.aws.amazon.com/rss/route53domainregistration.rss /feed subscribe https://status.aws.amazon.com/rss/supportcenter.rss /feed subscribe https://status.aws.amazon.com/rss/trustedadvisor.rss # # af-south-1 /feed subscribe https://status.aws.amazon.com/rss/apigateway-af-south-1.rss /feed subscribe https://status.aws.amazon.com/rss/autoscaling-af-south-1.rss /feed subscribe https://status.aws.amazon.com/rss/certificatemanager-af-south-1.rss ... more
これで情報が整理できたので、必要なものだけを選んで登録できるようになりました。 しかし、Slackへの登録も数が多ければ手動で行うのは難しい作業となるので可能な限り自動化を試みようと思います。
スクレイピングした結果をSlackに自動登録する
上記で作成したファイルを元にして、Slackへの自動登録を考えます。 まずSlackのAPIで登録できれば、それが簡単なので確認してみます。
Google先生に聞いてみると chat.command
という公式ドキュメントに記載がないAPIエンドポイントがあるらしい。
そのエンドポイントをレガシートークンを使って呼び出せば、スラッシュコマンドを送信でできるらしい。
しかし、2020年5月5日以降はこのレガシートークンの作成が行えない。。。
ということで、他の方法を考えるのですが今回はサーバーサイドで画面なしで登録したいという要件ではなく、手元のPCで自動登録ができれば必要十分という状態です。
そうなると、手軽にできるのはブラウザを操作して自動登録を行う方法で、Google Chromeなら手軽に実現出来そうです。
スクレイピングに続き、Google Chromeの自動操作もgolangで作ってみました。
こちらもやっていることは単純で、前述した /feed subscribe [RSS Feed URL]
形式で記載されたファイルを読み込んで、Slackの指定チャンネルにメッセージを送信するだけです。
事前にGoogle Chromeのインストールが必要なことと、メッセージを送信したいSlackのチャンネルにアクセスできる準備は必要ですが、そのほか自動で実行できます。
実際に手元のMacで AWS Service Health Dashboard
に記載されている全てのRSS Feed URLを登録した場合、以下のような結果になりました。
% ./cmd2s 2020/06/15 17:25:56 -------start cmd2s -------2020/06/15 17:25:56 -> loadConfig(): 0.000103454 sec 2020/06/15 17:25:56 -> cmdCount: 18892020/06/15 17:25:56 -> readCommands(): 0.000439254 sec 2020/06/15 17:26:07 -> loginToSlack(): 10.781574362 sec 2020/06/15 17:56:02 -> sendCmdToSlack(): 1794.885672638 sec 2020/06/15 17:56:17 -> checkResultToSlack(): 14.794882938 sec 2020/06/15 17:56:17 -> writeCheckResult(): 0.000645365 sec 2020/06/15 17:56:17 ==========================2020/06/15 17:56:17 -> total: 1820.464321942 sec 2020/06/15 17:56:17 ------- end cmd2s -------
1,889個もURLあったのかよ。。。という驚きの方がw Google Chromeを表示させて実行しているので、30分近く時間がかかったのかなぁーと。Headlessモードでも試してみましたが、うまく動かず。。。今後確認したいとおもいます。
また、今回は実行結果を確認する手段として最後に /feed list
を実行して出力結果を取得しています。
Only visible to you Slackbot 8:28 PM ID: 1210548705408 - Title: Amazon Virtual Private Cloud (Osaka-Local) Service Status URL: https://status.aws.amazon.com/rss/vpc-ap-northeast-3.rss ID: 1186712303954 - Title: Amazon Simple Workflow Service (Osaka-Local) Service Status URL: https://status.aws.amazon.com/rss/swf-ap-northeast-3.rss ID: 1185333543893 - Title: Amazon Simple Queue Service (Osaka-Local) Service Status URL: https://status.aws.amazon.com/rss/sqs-ap-northeast-3.rss ... more
これは1実行単位で結果を取得していると、途中で止まったりさらに時間がかかったりしたためですが、最終的には実行されていることが確認できれば問題ないので今回はこれで必要十分でした。
また、仕組み的にはどんな文字列もSlackに送信できますが、今回は /feed subscribe [RSS Feed URL]
に特化しています。
利用しているSlackが Azure AD によるログインが必須となるとめ、この部分も特化して作成しています。
まとめ
- AWS Service Health Dashboardの情報をSlackで通知したかった
- 調べてみたらRSS Feed URLがすごい数があった
- 自動で登録しないと厳しいが、API経由で登録する術がなかった
- 結果としてGoogle Chromeを操作して自動登録してみた
- 自動登録に利用するためのファイルをAWS Service Health Dashboardをスクレイピングして作成した
- どちらもCLIだけで完結できそうですが、今回はgolangで作成してみた
- 何とか自動登録できたので結果としては問題なし
- Headlessモードでの対応とか今後確認していきたい
以上になります。