CloudWatch AlarmをAmazon SNSとAWS Chatbotを使って、Slackチャンネルに投稿

記事タイトルとURLをコピーする

はじめに

最近、花粉の影響かわかりませんが、涙と鼻水がどこからともなく、発生して困っております。
アプリケーションサービス部の森です。

今回は、CloudWatch AlarmをSlackに投稿する仕組みの紹介となります。
これまで、アラームが発生したら、Amazon SNS経由でE-Mailに送ってなどのやり方がありましたが、
CloudWatch Alarmでアラームが発生したら、Amazon SNS経由でAWS Chatbotを使って、
Slackチャンネルにアラーム情報を投稿するやり方を書きます。

前提条件

その1:Slackに関する情報収集

まずは、Slackに関する情報を集めます。
必要なものは以下の2つ

- ワークスペースID - 使われるSlackワークスペースのID - チャンネルID - アラーム情報を投稿するSlackチャンネルのID

確認方法は以下になります。
① SlackにWebブラウザでアクセス ② 投稿したいSlackチャンネルをクリック(今回は例として #random チャンネル

以下の画像のようになります。
赤線と緑線を引いています。
赤線が「ワークスペースID」(例として、「T」から始まり、「/」の前までが対象)
緑線が「チャンネルID」(例として、「C」から始まり、URLの最後までが対象)
となります。

001
これをメモしておいてください。
後ほど利用します。

その2:AWS ChatbotからSlackへのアクセスを許可

次に、AWS ChatbotとSlackを連携させるためのアクセス許可を実施します。

① AWSマネジメントコンソールにログインし、AWS Chatbotを開きます。
② 右上にある「新しいクライアントを設定」をクリックします。

002
③新しいクライアントとして、「Slack」を選択肢、「設定」をクリックします。
003
④許可してよいかという画面になるので、「Allow」をクリックします。
004
⑤画面上部に「Slack は AWS Chatbot を正常に承認しました。」というメッセージが表示されればOKです。
 念の為、メモしたワークスペースIDと同じかも確認してください。
005

アラームをSlackに通知するための準備

Slack通知までできる状態になりましたので、Amazon SNSとAWS Chatbotのデプロイをしていきます。

Amazon SNS

最近、IaCで作業することが多いため、CloudFormation Templateを用意しました。
SNSのARNは他でも利用するため、エクスポートする設定にしています。

AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  SystemName:
    Type: String
    Default: templateproject
  Environment:
    Type: String
    Default: dev
    AllowedValues:
      - prd
      - stage
      - dev

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: General
        Parameters:
          - SystemName
          - Environment

Resources:
  ChatbotSNS:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: !Sub ${SystemName}-${Environment}-alarm-chatbot

Outputs:
  ChatbotSNSARN:
    Value: !Ref ChatbotSNS
    Export:
      Name: !Sub ${SystemName}-${Environment}-ChatbotSNSARN

AWS Chatbot

こちらもCloudFormation Templateを用意しました。

AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  SystemName:
    Type: String
    Default: templateproject
  Environment:
    Type: String
    Default: dev
    AllowedValues:
      - prd
      - stage
      - dev
  TargetSlackWorkspaceId:
    Type: String
  TargetSlackChannelId:
    Type: String


Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: General
        Parameters:
          - SystemName
          - Environment

Resources:
  AlarmChatbot:
    Type: AWS::Chatbot::SlackChannelConfiguration
    Properties:
      ConfigurationName: !Sub ${SystemName}-${Environment}-Alert
      IamRoleArn : !GetAtt WebAPIAlertRole.Arn
      LoggingLevel: ERROR
      SlackWorkspaceId: !Ref TargetSlackWorkspaceId
      SlackChannelId: !Ref TargetSlackChannelId
      SnsTopicArns:
        - Fn::ImportValue: !Sub ${SystemName}-${Environment}-ChatbotSNSARN

  WebAPIAlertRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${SystemName}-${Environment}-Alert-Role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: chatbot.amazonaws.com
            Action: sts:AssumeRole
      Path: /
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${Environment}-Alert-Role
        - Key: Application
          Value: webapi
        - Key: Category1
          Value: webapi
        - Key: Category2
          Value: !Ref Environment
      Policies:
        - PolicyName: !Sub ${SystemName}-${Environment}-Alert-Policy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - cloudwatch:Describe*
                  - cloudwatch:Get*
                  - cloudwatch:List*
                Resource:
                  - "*"

CloudFormationでテンプレートを実行

上記テンプレートを使ってCloudFormationから実行してAmazon SNSとAWS Chatbotを作成します。
パラメータについては、適宜変えてください。
ただ、 TargetSlackWorkspaceId にはSlackのワークスペースIDを入力し、
TargetSlackChannelId には投稿するSlackチャンネルIDを入力してください。

動作確認

今回は、Lambda FunctionとCloudWatch Alarmを利用します。
内容は省きますが、Lambda Functionは、すぐエラーが発生するロジックにし、
CloudWatch Alarmが発生したら、上記で構築したAmazon SNSに通知するように設定しています。

以下では、Lambdaの中で0で除算するようにしてエラーを発生させた例になります。
これでアラートがSlackに連携されました。

006

さいごに

CloudWatch Alarmでアラートが発生した場合に、Amazon SNS経由でAWS ChatbotからSlack連携してみました。
昔はメールで受け取っていたものを、Slackで連携していけるというのも時代が変わってきたなと痛感しています(もうnn年仕事してますので...

ということで、有効活用していただけますと幸いです。

2022/05/12 追記

上記は、Slackのパブリックチャンネルに対しての操作となります。 Slackのプライベートチャンネルを利用される場合は、該当のSlackチャンネルで以下のコマンドを実行してください。

/invite @aws

daiki mori(執筆記事の一覧)

アプリケーションサービス部 ディベロップメントサービス1課

お酒とLambdaとつまみとConnectが好きです。