AWS Chatbotで、異なるリージョンのCloudWatch Alarmを同じSlackチャンネルに通知する
AWS Chatbotを利用すると、CloudWatch AlarmのSlack通知などが手軽に構築できます。 しかし、AWS Chatbotはグローバルサービスのため、複数リージョンのCloudWatch Alarmを同じSlackチャンネルに通知するためには、少し工夫が必要です。 本記事では、異なるリージョンのCloudWatch Alarmを同じSlackチャンネルに通知する動作を試してみました。
おすすめの方
- AWS ChatbotをCloudFormationで作成したい方
- 異なるリージョンのCloudWatch Alarmを同じSlackチャンネルに通知したい方
AWS ChatbotとSlackワークスペースを連携する
WebコンソールでAWS Chatbotにアクセスし、ワークスペースを追加します。下記のワークスペースIDはあとで必要なのでメモしておきます。
通知先のSlackチャンネルを準備する
任意のSlackチャンネルを用意し、SlackチャンネルIDを取得します。 チャンネルIDは、チャンネルのリンクの最後の文字列です。
https://classmethod.slack.com/archives/xxx
バージニア北部リージョンでCloudWatch Alarmを作成する
CloudFormationのテンプレート
AWS Chatbot関連は、東京リージョンで作成します。
お試し用のCloudWatch Alarmは、適当なLambdaのERRORを監視しました。
- test-error-us-east-1-function
AWSTemplateFormatVersion: "2010-09-09" Description: AWS Chatbot region test Resources: # Slackのチャンネルに通知するための設定: 不要 # Chatbot用のIAMロール: 不要 # Chatbotに連携するためのSNSトピック NotifySlackChatbotTopic: Type: AWS::SNS::Topic Properties: TopicName: !Sub notify-slack-region-test-topic # CloudWatch Alarm TestFunctionErrorsAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmName: !Sub test-error-us-east-1-function-errors-alarm Namespace: AWS/Lambda Dimensions: - Name: FunctionName Value: test-error-us-east-1-function MetricName: Errors ComparisonOperator: GreaterThanOrEqualToThreshold Period: 60 EvaluationPeriods: 1 Statistic: Maximum Threshold: 1 TreatMissingData: notBreaching AlarmActions: - !Ref NotifySlackChatbotTopic OKActions: - !Ref NotifySlackChatbotTopic
デプロイする
us-east-1
リージョンを指定します。
aws cloudformation deploy \ --template-file us.yaml \ --stack-name notify-slack-region-test-stack \ --capabilities CAPABILITY_NAMED_IAM \ --region us-east-1 \ --no-fail-on-empty-changeset
東京リージョンでAWS Chatbotの設定とCloudWatch Alarmを作成する
CloudFormationのテンプレート
AWS Chatbotのチャンネル設定では、東京リージョンとバージニア北部リージョンのSNSトピックを指定します。
お試し用のCloudWatch Alarmは、適当なLambdaのERRORを監視しました。
- test-error-ap-northeast-1-function
AWSTemplateFormatVersion: "2010-09-09" Description: AWS Chatbot region test Parameters: SlackWorkspaceId: Type: String SlackChannelId: Type: String Resources: # Slackのチャンネルに通知するための設定 NotifySlackChatbot: Type: AWS::Chatbot::SlackChannelConfiguration Properties: ConfigurationName: !Sub notify-slack-region-test IamRoleArn: !GetAtt NotifySlackChatbotIamRole.Arn LoggingLevel: INFO SlackWorkspaceId: !Ref SlackWorkspaceId SlackChannelId: !Ref SlackChannelId SnsTopicArns: - !Ref NotifySlackChatbotTopic - !Sub arn:aws:sns:us-east-1:${AWS::AccountId}:notify-slack-region-test-topic # Chatbot用のIAMロール NotifySlackChatbotIamRole: Type: AWS::IAM::Role Properties: RoleName: !Sub notify-slack-region-test-role AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: chatbot.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess # Chatbotに連携するためのSNSトピック NotifySlackChatbotTopic: Type: AWS::SNS::Topic Properties: TopicName: !Sub notify-slack-region-test-topic # CloudWatch Alarm TestFunctionErrorsAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmName: !Sub test-error-ap-northeast-1-function-errors-alarm Namespace: AWS/Lambda Dimensions: - Name: FunctionName Value: test-error-ap-northeast-1-function MetricName: Errors ComparisonOperator: GreaterThanOrEqualToThreshold Period: 60 EvaluationPeriods: 1 Statistic: Maximum Threshold: 1 TreatMissingData: notBreaching AlarmActions: - !Ref NotifySlackChatbotTopic OKActions: - !Ref NotifySlackChatbotTopic
デプロイする
parameter-overrides
で、SlackのワークスペースIDとチャンネルIDを渡します。
aws cloudformation deploy \ --template-file tokyo.yaml \ --stack-name notify-slack-region-test-stack \ --capabilities CAPABILITY_NAMED_IAM \ --region ap-northeast-1 \ --parameter-overrides \ SlackWorkspaceId=111 \ SlackChannelId=xxx \ --no-fail-on-empty-changeset
AWS Chatbotの画面を確認すると、複数リージョンのSNSトピックが登録されています。
動作を確認する
それぞれのリージョンのLambdaでERRORを発生させてみます。
- 東京リージョン
- バージニア北部リージョン
同じSlackチャンネルに、それぞれのリージョンのCloudWatch Alarmが通知されました。
さいごに
AWS Chatbotで、異なるリージョンのCloudWatch Alarmを同じSlackチャンネルに通知してみました。 少しでも参考になれば幸いです。