みなさんこんにちは。SREチームの @kangaechu です。
8月23日に発生したAWSの障害は大丈夫でしたでしょうか?弊社のサービス crowdworks.jp は障害が発生したAZを使用していたものの、幸いにもサービス停止などの大きな被害を受けることなく乗り切ることができました。でも心臓にはよくないですね。
そんな障害時にも活躍するのがPersonal Health Dashboardです。 Personal Health Dashboardは自分のAWSアカウント上のリソースに影響する障害や、ハードウェアメンテナンスなどの対応が必要なイベントをお知らせしてくれる機能です。 AWSマネジメントコンソールの上部に表示されている🔔のアイコンですね。
Personal Health Dashboardは便利なのですが、AWSマネジメントコンソールにログインしないと見ることができません。メールでの通知はあるのですが、Slackのインテグレーション経由で見ると長々と文面が表示され、要点が掴みづらいという問題があります。また、SNS経由でメール通知も試してみましたがJSONが潰れて表示され、可読性がよくありませんでした。 2019年7月にAWS Chatbot のパブリックベータ版がリリースされました。
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に通知してみましょう!
概要
これから作成するフローはこのようなものになります。
Personal Health DashboardのイベントはCloudWatch Eventsで取得することができます。取得したイベントをSNS経由でChatbotに送ると、Slackに送信するという流れです。
手順
SNSトピックを作成する
まずはCloudWatch EventsとChatbot を仲介するSNSのトピックを作成します。
AWS SNS トピックのページに移動し、「トピックの作成」を選択します。
適当な名前を指定して、「トピックの作成」を選択します。
CloudWatch Events ルールを作成
次にCloudWatch Eventsのルールを作成して、Personal Health DashboardのイベントをSNSに送信する設定を行います。
CloudWatch Events ルールのページに移動して、「ルールの作成」を選択します。
次の画面は左側と右側の画面に分けられます。左側ではソースとなるイベントの指定、右側はターゲットを指定します。 左側の画面では、以下の通り設定を行い、Personal Health Dashboardからのイベントを受け取るように指定します。
- イベントソース: イベントパターン
- サービス名: Health
- イベントタイプ: 全てのイベント
今回は「全てのイベント」を選択しましたが、ここで特定のイベントのみにフィルタリングすることも可能です。
次に右側の画面でターゲットを指定します。今回は先ほど作成したSNSトピックへの送信を行う設定を行います。
設定後、下にある「設定の詳細」を選択します。
「ステップ 2: ルールの詳細を設定する」画面に遷移します。イベントのルール名と説明を入力して、「ルールの作成」を選択します。
Chatbot構成を作成する
最後にChatbotの構成を行い、アカウントやチャンネル名などのSlackの通知先を設定し、SNSのサブスクリプションとして登録します。
AWS Chatbotのページに移動します。
Configure chat client 画面でChat clientに「Slack」を選択して、「Configure client」を選択します。
OAuth2の認可画面に遷移します。権限が問題ないことを確認して「許可する」を選択します。
認証が成功するとSlack workspaceの画面に遷移します。「Configure channel」を選択します。
通知するSlackのチャンネルの設定を行います。
Slack channel
- チャンネルの種類 (Public / Private) とチャンネル名を指定します。 チャンネル名を選択したのに表示されない時は右側のリロードアイコンを押すと表示されました。
IAM Permissions
- 「Create an IAM role using a template」を選択し、テンプレートからIAM Roleを作成します。
- 「Role name」 に作成するIAM Role名を指定します。
SNS topics
通知のテスト
お疲れ様でした。作成自体はこれで完成しましたので、次にテストをしてみましょう。本来であればPersonal Event DashboardからSlackまでのテストを行いたいところですが、AWSに問題が発生しないとPersonal Event Dashboardのイベントが作成されません。 ですので、SNSにメッセージが来たらSlackに通知されるところまでを確認してみましょう。 CloudWatch Eventsのルール画面にイベント発生時に生成されるJSONのサンプルイベントがあるので、それを使用してSNSにメッセージを送信してみます。
まずはサンプルイベントをコピーします。 CloudWatch Events ルールのページに移動し、先ほど作成したルールを選択します。
右上の「アクション→編集」を選択します。 左側下部の「サンプルイベントの表示」を展開し、表示されるJSONのイベントを一件分コピーします。
次にコピーしたサンプルイベントを使用して、SNSトピックにメッセージを送信します。 SNSトピックの一覧ページから、今回選択したSNSトピックを選択します。
右上の「メッセージの発行」を選択します。
メッセージ本文に先ほどコピーしたサンプルイベントのJSONを貼り付け、「メッセージの発行」を選択します。
Slackにサンプルイベントが通知されていることを確認します。
必要な情報がコンパクトにまとまっていて見やすいですね。
まとめ
AWS Chatbotを使用することで、視認性の高いSlackメッセージを簡単に作成することができました。 Personal Health Dashboard以外にも様々なイベントの通知に役立ちますので、ぜひ使ってみてください。
クラウドワークスのSREチームはTerraform激推しなので、これらの手順をTerraform化しようと思ったのですが、現時点ではChatbotはTerraformどころかAWSのSDKにすら存在していませんでした。ざんねん!!
参考資料
We are Hiring!!
現在、クラウドワークス では、AWSの障害に負けないSREエンジニアも募集しております!!
話を聞いてみたい、などでも構いませんので、お気軽に遊びにきてください💪💪