AWS Service Health Dashboard のRSS Feed をSlack に自動登録する #aws #slack

f:id:uchimanajet7:20200617165853p:plain

目次

前提

AWS の障害情報を確認しようと思うと、まずは AWS Personal Health Dashboard の情報をAmazon SNS 経由でSlackに通知するという、確実でお手軽な方法を検討するかと思います。

aws.amazon.com

docs.aws.amazon.com

これはこれで設定を行い Design for Failure を意識して他の手段も用意してみたいと思います。

どこまで気にするかという部分はあるので、今回は誰でも確認できる AWS Service Health Dashboard の情報もSlackに通知されるようにしたいと思います。

status.aws.amazon.com

RSS Feed URLが分割されている

AWS Service Health Dashboard を確認するとわかるのですが、対象のリージョンとサービスの組み合わせでRSS FeedのURLが分割されています。

SlackにRSS Feedを登録するには、RSSアプリをワークスペースにインストールして /feed subscribe [RSS Feed URL] のスラッシュコマンドを入力する必要があります。

slack.com

この分割されたURLが数十個というレベルではないので、手動で登録するというのは非現実的な対応となります。

1つのURLに情報が集約されているものがあれば解決しそうなのですが.・・・調べてみると http://status.aws.amazon.com/rss/all.rss というURLが存在するようです。

Service Health DashboardRSSページについて
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で作ってみました。

github.com

やっていることは単純で AWS Service Health Dashboard のWebからRSSのURLをスクレイピングして、リージョン単位とサービス単位で整理した状態で ファイルに出力します。

ファイルの内容はSlackのRSS Feed登録用のリストとなっていて /feed subscribe [RSS Feed URL] の形式で1行単位で出力されています。

github.com

# 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エンドポイントがあるらしい。

stackoverflow.com

そのエンドポイントをレガシートークンを使って呼び出せば、スラッシュコマンドを送信でできるらしい。

api.slack.com

しかし、2020年5月5日以降はこのレガシートークンの作成が行えない。。。

api.slack.com

ということで、他の方法を考えるのですが今回はサーバーサイドで画面なしで登録したいという要件ではなく、手元のPCで自動登録ができれば必要十分という状態です。

そうなると、手軽にできるのはブラウザを操作して自動登録を行う方法で、Google Chromeなら手軽に実現出来そうです。

developers.google.com

スクレイピングに続き、Google Chromeの自動操作もgolangで作ってみました。

github.com

こちらもやっていることは単純で、前述した /feed subscribe [RSS Feed URL] 形式で記載されたファイルを読み込んで、Slackの指定チャンネルにメッセージを送信するだけです。

事前にGoogle Chromeのインストールが必要なことと、メッセージを送信したいSlackのチャンネルにアクセスできる準備は必要ですが、そのほか自動で実行できます。

実際に手元のMacAWS 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: 1889
2020/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 によるログインが必須となるとめ、この部分も特化して作成しています。

まとめ

f:id:uchimanajet7:20200617170251p:plain

  • AWS Service Health Dashboard の情報をSlackで通知したかった
  • 調べてみたらRSS Feed URLがすごい数があった
  • 自動で登録しないと厳しいが、API経由で登録する術がなかった
  • 結果としてGoogle Chromeを操作して自動登録してみた
  • 自動登録に利用するためのファイルをAWS Service Health Dashboardスクレイピングして作成した
  • どちらもCLIだけで完結できそうですが、今回はgolangで作成してみた
  • 何とか自動登録できたので結果としては問題なし
  • Headlessモードでの対応とか今後確認していきたい

以上になります。

Following is in English

medium.com