AWS Chatbotを使ってAWS Health Dashboardの内容をSlackに通知してみました。 何かあったときに見に行くよりは、自動で教えてくれる(Slackに通知がくる)ので便利です。
画面ポチポチでも簡単に実現できますが、複数のAWSアカウントや複数のリージョンで実施することを想定して、CloudFormationで作成します。
本記事では、複数リージョンのAWS Health Dashboardの内容をひとつのSlackチャンネルに通知します。
おすすめの方
- AWS Health Dashboardの内容をAWS ChatbotでSlackに通知したい方
- Amazon EventBridgeの内容をAWS ChatbotでSlackに通知したい方
重要
EventBridgeのルールは、リージョン毎に作成する必要があります。 グローバルサービスの場合は、バージニア北部です。
本記事では、東京とバージニア北部の2つのリージョンを扱います。
AWS Chatbotを準備する
Slackワークスペースの認証とワークスペースID取得
WebコンソールでAWS Chatbotにアクセスし、ワークスペースを追加します。下記のワークスペースIDはあとで必要なのでメモしておきます。
SlackチャンネルIDを取得
任意のチャンネルのリンクを取得します。
このリンクの最後の文字列を使います。下記例だとABCD1234
がチャンネルIDです。
https://classmethod.slack.com/archives/ABCD1234
EventBridgeとSNSトピックを各リージョンにデプロイする
まずは、EventBridgeとSNSトピックを各リージョンにデプロイします。 今回は、CloudFormation StackSetsを利用して、2つのリージョンにデプロイします。
もしもリージョン毎に通知条件を変えたい場合は、CloudFormation StackSetsを使わずに個別デプロイしてください。 (リージョンAは全てのサービス、リージョンBはSESのみ、など)
CloudFormation StackSetsの事前準備
次を参考にして、2つのIAMロールを作成します。
- CloudFormation StackSetsを指示するIAMロール
- CloudFormation StackSetsを実行するIAMロール
CloudFormationテンプレート
今回は、AWS Health Dashboardのすべてのイベントを通知します。 一部のイベントのみを通知したい場合は、EventBridgeでフィルタリングしてください。
sns_topic_for_health_dashboard.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: SNS Topic and EventBridge for Health Dashboard
Parameters:
Env:
Type: String
Default: dev
Resources:
HealthDashboardForChatbotTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: !Sub notify-slack-health-dashbord-topic-${Env}
HealthDashboardForChatbotTopicPolicy:
Type: AWS::SNS::TopicPolicy
Properties:
PolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: events.amazonaws.com
Action: sns:Publish
Resource: '*'
Topics:
- !Ref HealthDashboardForChatbotTopic
SubscribeHealthDashboardEventRule:
Type: AWS::Events::Rule
Properties:
EventPattern:
source:
- aws.health
Targets:
- Id: HealthDashboardForChatbotTopic
Arn: !Ref HealthDashboardForChatbotTopic
CloudFormation StackSetsでデプロイする
流れるままに進んでいきます。
StackSets名は「notify-slack-health-dashbord-topic」としました。
リージョンは、東京とバージニア北部を選択します。
なお、最近追加されたリージョンは、デフォルトで無効状態です。そのため、「すべてのリージョン」を選択した場合は、必要に応じて除外してください。 無効化されたリージョンに対してCloudFormation StackSetsを実行すると、「無効なリージョンのため実行できません」的なエラーが出ます。
- 中東 (バーレーン)
- アフリカ (ケープタウン)
- アジアパシフィック (香港)
- 欧州 (ミラノ)
準備ができたので、実行します。ステータスが SUCCEEDED になるまで待ちます。
EventBridgeとSNSトピックのデプロイが終わりました。
AWS Chatbotのチャンネル設定をデプロイする
続いて、各リージョンのSNSトピックを受け取ってSlackに通知する部分をデプロイしていきます。
CloudFormationテンプレートファイル
SNSトピックは各リージョンにあるため、ARNを直接記載しています。
また、次のパラメータをデプロイ時に渡しています。必要に応じてパラメータストアを使うなどしてください。
- Env
- SlackWorkspaceId
- SlackHealthDashboardChannelId
chatbot_health_dashboard.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: AWS Chatbot and Health Dashboard
Parameters:
Env:
Type: String
Default: dev
SlackWorkspaceId:
Type: String
SlackHealthDashboardChannelId:
Type: String
Resources:
NotifySlackChatbot:
Type: AWS::Chatbot::SlackChannelConfiguration
Properties:
ConfigurationName: !Sub notify-slack-health-dashbord-${Env}
IamRoleArn: !GetAtt NotifySlackChatbotIamRole.Arn
LoggingLevel: INFO
SlackWorkspaceId: !Ref SlackWorkspaceId
SlackChannelId: !Ref SlackHealthDashboardChannelId
SnsTopicArns:
# リージョンの数だけ記載する
- !Sub arn:aws:sns:ap-northeast-1:${AWS::AccountId}:notify-slack-health-dashbord-topic-${Env}
- !Sub arn:aws:sns:us-east-1:${AWS::AccountId}:notify-slack-health-dashbord-topic-${Env}
NotifySlackChatbotIamRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub notify-slack-health-dashbord-role-${Env}
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service: chatbot.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess
デプロイ
ここでは、parameter-overrides
でパラメータを渡しています。
aws cloudformation deploy \
--template-file chatbot_health_dashboard.yaml \
--stack-name notify-slack-health-dashbord-chatbot-stack \
--capabilities CAPABILITY_NAMED_IAM \
--parameter-overrides \
Env=dev \
SlackWorkspaceId=xxx \
SlackHealthDashboardChannelId= ABCD1234 \
--no-fail-on-empty-changeset
動作を確認する
サンプルイベントを取得する
マネジメントコンソールのEventBridgeを見ると、サンプルイベントが分かります。 このサンプルイベントをコピーします。
SNSトピックでメッセージを送信する
東京リージョン
まずは、東京リージョンのSNSトピックで確認します。 作成したSNSトピックにメッセージを送信します。 メッセージは、さきほどコピーしたサンプルイベントです。 分かりやすいようにリージョン部分だけを東京に書き換えています。
バージニア北部リージョン
続いて、バージニア北部リージョンのSNSトピックにアクセスして、同様にメッセージを送信します。 リージョン部分をバージニア北部に書き換えています。
Slackに通知がきた!
バッチリです。
さいごに
AWS Health Dashboardの内容をSlackに通知してみました。 何かあったときに見に行くよりは、自動で教えてくれる(Slackに通知がくる)ので便利です。