AWS Chatbotで、異なるリージョンのCloudWatch Alarmを同じSlackチャンネルに通知する

AWS Chatbotで異なるリージョンのCloudWatch Alarmを扱います。
2023.10.10

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はあとで必要なのでメモしておきます。

AWS ChatbotとSlackワークスペースを連携する

通知先のSlackチャンネルを準備する

任意のSlackチャンネルを用意し、SlackチャンネルIDを取得します。 チャンネルIDは、チャンネルのリンクの最後の文字列です。

SlackチャンネルのURLを取得する

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トピックが登録されています。

AWS Chatbotで、異なるリージョンのSNSトピックが連携されている

動作を確認する

それぞれのリージョンのLambdaでERRORを発生させてみます。

  • 東京リージョン
  • バージニア北部リージョン

同じSlackチャンネルに、それぞれのリージョンのCloudWatch Alarmが通知されました。

同じSlackチャンネルに異なるリージョンのCloudWatch Alarmの通知がきた

さいごに

AWS Chatbotで、異なるリージョンのCloudWatch Alarmを同じSlackチャンネルに通知してみました。 少しでも参考になれば幸いです。

参考