クラウドワークス エンジニアブログ

日本最大級のクラウドソーシング「クラウドワークス」の開発の裏側をお届けするエンジニアブログ

AWS Chatbot を使って AWS Personal Health Dashboardの通知をいい感じにSlackに通知する

みなさんこんにちは。SREチームの @kangaechu です。

8月23日に発生したAWSの障害は大丈夫でしたでしょうか?弊社のサービス crowdworks.jp は障害が発生したAZを使用していたものの、幸いにもサービス停止などの大きな被害を受けることなく乗り切ることができました。でも心臓にはよくないですね。

そんな障害時にも活躍するのがPersonal Health Dashboardです。 Personal Health Dashboardは自分のAWSアカウント上のリソースに影響する障害や、ハードウェアメンテナンスなどの対応が必要なイベントをお知らせしてくれる機能です。 AWSマネジメントコンソールの上部に表示されている🔔のアイコンですね。

f:id:kangaechu:20190906091220p:plain:w200
AWS Personal Health Dashboard

Personal Health Dashboardは便利なのですが、AWSマネジメントコンソールにログインしないと見ることができません。メールでの通知はあるのですが、Slackのインテグレーション経由で見ると長々と文面が表示され、要点が掴みづらいという問題があります。また、SNS経由でメール通知も試してみましたがJSONが潰れて表示され、可読性がよくありませんでした。

f:id:kangaechu:20190909155038p:plain:w400
SNS経由でのメール通知で SlackにPostしたもの。みづらい⤵️
2019年7月にAWS Chatbot のパブリックベータ版がリリースされました。

aws.amazon.com

AWS ChatbotはSlackへの通知をサポートしています。またAWSの他サービスからの通知の受信をサポートしています。現時点では以下のサービスが対応しています。

  • AWS Billing and Cost Management (for AWS Budget Alerts)
  • AWS CloudFormation
  • Amazon CloudWatch
  • AWS Config
  • Amazon GuardDuty
  • AWS Health
  • AWS Security Hub
  • AWS Systems Manager

今回はAWS Personal Health Dashboardの通知をSlackに通知してみましょう!

f:id:kangaechu:20190906103256p:plain
AWS Chatbotを使用したPersonal Health Dashboardの通知。見やすい🎉

概要

これから作成するフローはこのようなものになります。

f:id:kangaechu:20190906105329p:plain
概要図

Personal Health DashboardのイベントはCloudWatch Eventsで取得することができます。取得したイベントをSNS経由でChatbotに送ると、Slackに送信するという流れです。

手順

SNSトピックを作成する

まずはCloudWatch EventsとChatbot を仲介するSNSのトピックを作成します。

AWS SNS トピックのページに移動し、「トピックの作成」を選択します。

f:id:kangaechu:20190906111916p:plain
SNSのトピック画面

適当な名前を指定して、「トピックの作成」を選択します。

f:id:kangaechu:20190906112123p:plain
「トピックの作成」画面

CloudWatch Events ルールを作成

次にCloudWatch Eventsのルールを作成して、Personal Health DashboardのイベントをSNSに送信する設定を行います。

CloudWatch Events ルールのページに移動して、「ルールの作成」を選択します。

f:id:kangaechu:20190906144306p:plain
「CloudWatch Eventsルール」画面

次の画面は左側と右側の画面に分けられます。左側ではソースとなるイベントの指定、右側はターゲットを指定します。 左側の画面では、以下の通り設定を行い、Personal Health Dashboardからのイベントを受け取るように指定します。

  • イベントソース: イベントパターン
  • サービス名: Health
  • イベントタイプ: 全てのイベント

f:id:kangaechu:20190906112835p:plain
イベントソースの設定

今回は「全てのイベント」を選択しましたが、ここで特定のイベントのみにフィルタリングすることも可能です。

次に右側の画面でターゲットを指定します。今回は先ほど作成したSNSトピックへの送信を行う設定を行います。

  • ターゲット: SNSトピック
  • トピック: (「SNSトピックを作成」で作成したSNSトピック)

f:id:kangaechu:20190906113752p:plain
ターゲットの設定

設定後、下にある「設定の詳細」を選択します。

「ステップ 2: ルールの詳細を設定する」画面に遷移します。イベントのルール名と説明を入力して、「ルールの作成」を選択します。

f:id:kangaechu:20190906114019p:plain
ルールの作成

Chatbot構成を作成する

最後にChatbotの構成を行い、アカウントやチャンネル名などのSlackの通知先を設定し、SNSサブスクリプションとして登録します。

AWS Chatbotのページに移動します。

Configure chat client 画面でChat clientに「Slack」を選択して、「Configure client」を選択します。

f:id:kangaechu:20190906114625p:plain
Chat clientを選択

OAuth2の認可画面に遷移します。権限が問題ないことを確認して「許可する」を選択します。

f:id:kangaechu:20190906114731p:plain
OAuth2の認可画面

認証が成功するとSlack workspaceの画面に遷移します。「Configure channel」を選択します。

f:id:kangaechu:20190909162247p:plain

通知するSlackのチャンネルの設定を行います。

  • Slack channel

    • チャンネルの種類 (Public / Private) とチャンネル名を指定します。 チャンネル名を選択したのに表示されない時は右側のリロードアイコンを押すと表示されました。
  • IAM Permissions

    • 「Create an IAM role using a template」を選択し、テンプレートからIAM Roleを作成します。
    • 「Role name」 に作成するIAM Role名を指定します。
  • SNS topics

    • SNS Region」には「SNSトピックを作成」で作成したリージョンを指定します。
    • SNS topics」には「SNSトピックを作成」で作成したトピック名を指定します。

f:id:kangaechu:20190906131505p:plain
Slack チャンネルの設定

通知のテスト

お疲れ様でした。作成自体はこれで完成しましたので、次にテストをしてみましょう。本来であればPersonal Event DashboardからSlackまでのテストを行いたいところですが、AWSに問題が発生しないとPersonal Event Dashboardのイベントが作成されません。 ですので、SNSにメッセージが来たらSlackに通知されるところまでを確認してみましょう。 CloudWatch Eventsのルール画面にイベント発生時に生成されるJSONのサンプルイベントがあるので、それを使用してSNSにメッセージを送信してみます。

まずはサンプルイベントをコピーします。 CloudWatch Events ルールのページに移動し、先ほど作成したルールを選択します。

f:id:kangaechu:20190906144520p:plain
CloudWatch Eventsのルールを選択

右上の「アクション→編集」を選択します。 左側下部の「サンプルイベントの表示」を展開し、表示されるJSONのイベントを一件分コピーします。

f:id:kangaechu:20190906144624p:plain

次にコピーしたサンプルイベントを使用して、SNSトピックにメッセージを送信します。 SNSトピックの一覧ページから、今回選択したSNSトピックを選択します。

f:id:kangaechu:20190906133552p:plain
SNSトピックを選択

右上の「メッセージの発行」を選択します。

f:id:kangaechu:20190906133645p:plain
メッセージの発行を選択
メッセージ本文に先ほどコピーしたサンプルイベントのJSONを貼り付け、「メッセージの発行」を選択します。

f:id:kangaechu:20190906133940p:plain
トピックにメッセージを発行

Slackにサンプルイベントが通知されていることを確認します。

f:id:kangaechu:20190906103256p:plain
Slackに送信されたサンプルイベント

必要な情報がコンパクトにまとまっていて見やすいですね。

まとめ

AWS Chatbotを使用することで、視認性の高いSlackメッセージを簡単に作成することができました。 Personal Health Dashboard以外にも様々なイベントの通知に役立ちますので、ぜひ使ってみてください。

クラウドワークスのSREチームはTerraform激推しなので、これらの手順をTerraform化しようと思ったのですが、現時点ではChatbotはTerraformどころかAWSSDKにすら存在していませんでした。ざんねん!!

参考資料

We are Hiring!!

現在、クラウドワークス では、AWSの障害に負けないSREエンジニアも募集しております!!

話を聞いてみたい、などでも構いませんので、お気軽に遊びにきてください💪💪

jobs.forkwell.com

© 2016 CrowdWorks, Inc., All rights reserved.