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
us.yaml
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
tokyo.yaml
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チャンネルに通知してみました。 少しでも参考になれば幸いです。