はじめに
AWSアカウントを作成したその日から、 AWSアカウント上では様々なイベントが絶え間なく発生 します。これらのイベントを 適切にモニタリング することで、AWS上の システムやアプリケーションの健全性 や 可用性 を 追求することが可能となります。
そこで、2020年4月22日に晴れてGAとなった AWS Chatbot
と、AWS Chatbot 登場までは主流な実装方法であったAWS Lambda
とを組み合わせて、AWSで発生したイベントをSlackに通知 してみたいと思います。
もちろん、チャットサービスを介して、AWSで発生したイベントをリアルタイムにモニタリングすることが、全てのケースで正しいとは限りません。また、そもそも下記でご紹介するイベントが、イベントの特性上、リアルタイムに通知されるべきではない可能性や、ケースによってはSlackというサービス自体が不適な場合もあるかもしれません。あくまで、AWSをモニタリングするための手法の1つとご理解ください。
アーキテクチャ
今回作成したシステム のアーキテクチャは以下の通りです。いくつものアイコンが並んでいますが、実際に実装したのは、notification
と書かれた点線部分のみで、システムを構成するサービスは、 AWS Chatbot 、Amazon SNS 、 Amazon EventBridge と AWS Lambda です。
なお、上記のテンプレート等は、aws-cloudformation-templates/notification - GitHub にて公開しています。
- README(EN) - aws-cloudformation-templates/notification
- README(JP) - aws-cloudformation-templates/notification
準備
今回作成したシステムは、AWS SAM (Serverless Application Model) テンプレートで作成されており、後述のボタンから ワンクリックでデプロイ することが可能です。ただし、このテンプレートをAWS上で実行する前に、AWS Chatbotコンソール上で初回認証フローを行う必要があります。
1. AWS Management Console (Chatbot) 上で Slack を選択
AWS Chatbotは、Slack と Amazon Chime に対応していますが、今回はSlackを選択します。
2. 通知先のSlackワークスペースとの間で認証を行う
次のページに進むとSlackとの認証画面が表示されますので、任意のワークスペースを選択した上で「許可する」をクリック します。
3. Incoming Webhook URL の取得
AWS Lambda から通知を送信する際には、 Slack App の Incoming Webhook URL を取得する 必要があります。Your Apps - Slack API から既存のSlack App もしくは 新規のSlack App を選択し、Incoming Webhook URLを発行します。
4. Slackの ワークスペースID と チャンネルID の取得
デプロイする際に使用する際に必要なSlackの ワークスペースID と チャンネルID は、SlackのURLの以下の部分に該当します。
TL;DR
上記の作業で全ての準備が整いました。以下のCloudFormationテンプレートを実行することで、 AWSで発生したイベントをSlackに通知するシステムをお手軽に実現 します。
順序 | 内容 | 実行 |
---|---|---|
1 | セキュリティ関連サービスを有効化 するテンプレート (オプション) | |
2 | Slack通知を有効化 するテンプレート |
なお、本テンプレートは、 2つのSlackチャンネルに対して通知を送信することが可能です。便宜上、アラーム用とデプロイ用のAmazon SNS トピック、およびSlackチャンネルとしていますが、それぞれに機能の差や用途の制限はありません。
パラメータ名 | 内容 | 備考 |
---|---|---|
HookUrlForDeployment | Slack デプロイ用チャンネルのIncoming Webhook URL | 準備 の項の 手順3 を参照してください。**https://を除いて入力**してください。 |
HookUrlForAlert | Slack アラート用チャンネルのIncoming Webhook URL | 準備 の項の 手順3 を参照してください。**https://を除いて入力**してください。 |
SlackWorkspaceId | ワークスペースID | 準備 の項の 手順4 を参照してください。上の画像のXXXXXXXの部分に該当します。 |
SlackChannelIdForDeployment | デプロイ用チャンネルID | 準備 の項の 手順4 を参照してください。上の画像のYYYYYYYの部分に該当します。 |
SlackChannelIdForAlert | アラート用チャンネルID | 準備 の項の 手順4 を参照してください。上の画像のYYYYYYYの部分に該当します。 |
Slackメッセージ
上述した通り、本システムからSlackへは、2つの異なるルート で通知が送信されます。1つは AWS Chatbot を用いた方法、そしてもう1つは、 AWS Lambda を用いた方法です。前者は、AWS Chatbotによってあらかじめ定められたフォーマット(=英文)に基づいてメッセージが作成されます。
AWS Chatbotがリリースされたにも関わらず、従来のAWS Lambdaを経由した送信方法を残した理由は、本項執筆時点で、 AWS Chatbotが対応しているサービスが以下のサービスに限定される ためです。
- AWS Billing and Cost Management
- AWS CloudFormation
- AWS developer tools
- Amazon CloudWatch Alarms
- AWS Config
- Amazon GuardDuty
- AWS Health
- AWS Security Hub
- AWS Systems Manager
一方で、今回作成した AWS Lambdaは、以下のサービスに対応しています 。
- EventBridge Scheduled Events
- Amazon EBS Events
- Amazon EC2 Auto Scaling Events
- Amazon EC2 State Change Events
- AWS KMS Events
- AWS Management Console Sign-in Events
- Tag Change Events on AWS Resources
- AWS Trusted Advisor Events
AWS Chatbot 経由で送信される通知の例
AWS Lambda 経由で送信される通知の例
以上で、AWS Chatbot, Amazon SNS, Amazon EventBridge, AWS Lambda を用いて AWSで発生したイベントをSlackに通知するシステムをお手軽に実現 することができました。次回は、このSAMテンプレートの中身とその挙動についてご説明します。
関連リンク
- 準備篇 - AWSで発生したイベントを AWS Chatbot + Lambda で Slack にお手軽に通知する
- EventBridge篇 - AWSで発生したイベントを AWS Chatbot + Lambda で Slack にお手軽に通知する