AWS Chatbotで複数リージョンのAWS Health Dashboardの内容をSlackに通知する

AWS Chatbotは便利ですね。
2022.08.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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を確認する

Slackチャンネル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テンプレート

今回は、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でデプロイする

流れるままに進んでいきます。

CloudFormation StackSets

StackSets名は「notify-slack-health-dashbord-topic」としました。

CloudFormation StackSets名を入力する

リージョンは、東京とバージニア北部を選択します。

CloudFormation StackSetsの対象リージョンを決める

なお、最近追加されたリージョンは、デフォルトで無効状態です。そのため、「すべてのリージョン」を選択した場合は、必要に応じて除外してください。 無効化されたリージョンに対してCloudFormation StackSetsを実行すると、「無効なリージョンのため実行できません」的なエラーが出ます。

  • 中東 (バーレーン)
  • アフリカ (ケープタウン)
  • アジアパシフィック (香港)
  • 欧州 (ミラノ)

新しいリージョンは、デフォルトで無効になっている

準備ができたので、実行します。ステータスが SUCCEEDED になるまで待ちます。

CloudFormation StackSetsでデプロイ待ち

CloudFormation StackSetsでデプロイが終わった

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を見ると、サンプルイベントが分かります。 このサンプルイベントをコピーします。

EventBridgeのサンプルイベント

SNSトピックでメッセージを送信する

東京リージョン

まずは、東京リージョンのSNSトピックで確認します。 作成したSNSトピックにメッセージを送信します。 メッセージは、さきほどコピーしたサンプルイベントです。 分かりやすいようにリージョン部分だけを東京に書き換えています。

東京リージョンのSNSトピックにメッセージを送信する

バージニア北部リージョン

続いて、バージニア北部リージョンのSNSトピックにアクセスして、同様にメッセージを送信します。 リージョン部分をバージニア北部に書き換えています。

バージニア北部リージョンのSNSトピックにメッセージを送信する

Slackに通知がきた!

バッチリです。

SlackにAWS Health Dashboardの通知がきた

さいごに

AWS Health Dashboardの内容をSlackに通知してみました。 何かあったときに見に行くよりは、自動で教えてくれる(Slackに通知がくる)ので便利です。

参考