CloudFormation で AWS Chatbot と CloudWatch Alarm を定義してSlackにアラート通知してみた

CloudFormationを使ってAWS Chatbotを作成してみました。試しにCloudWatch Alarmで検知したアラートをSlack通知させています。
2020.04.24

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

先日、AWS Chatbotが一般公開されました。

本記事では、CloudFormationでAWS Chatbotを作成してSlackにCloudWatch Alarmを通知してみます。 CloudWatch AlarmではLambdaのErrorsを監視対象にしました。

手動ポチポチもいいけど、CloudFormationで作るのもいいですよね!

監視対象のLambdaを作成する

適当なLambdaを作成します。関数名はmanulaly-test-functionにしています。絶対にエラーが発生するようにしています。

def lambda_handler(event, context):
    raise NotImplementedError('for Lambda Error')

CloudWatch AlarmとSNSトピックを作成する

YAMLの作成

次のYAMLをcloudwatch_alarm.ymlとして作成します。

cloudwatch_alarm.yml

AWSTemplateFormatVersion: "2010-09-09"
Description: CloudWatch Alarm Sample Stack

Resources:
  # CloudWatchアラーム用のSNSトピック
  CloudWatchAlarmForChatbotTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: cloudwatch-alarm-for-chatbot-topic

  # CloudWatchアラームの定義
  LambdaFunctionErrorsAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: test-lambda-error-for-chatbot-alarm
      Namespace: AWS/Lambda
      Dimensions:
        - Name: FunctionName
          Value: manulaly-test-function
      MetricName: Errors
      ComparisonOperator: GreaterThanOrEqualToThreshold  # 閾値以上
      Period: 60  # 期間[s]
      EvaluationPeriods: 1  # 閾値を超えた回数
      Statistic: Maximum  # 最大
      Threshold: 1  # 閾値
      TreatMissingData: notBreaching  # Errorsがない場合は良好として扱う
      AlarmActions:
        - !Ref CloudWatchAlarmForChatbotTopic  # アラーム遷移時のアクション
      OKActions:
        - !Ref CloudWatchAlarmForChatbotTopic  # OK遷移時のアクション

Outputs:
  CloudWatchAlarmForChatbotTopicArn:
    Value: !Ref CloudWatchAlarmForChatbotTopic
    Export:
      Name: !Sub ${AWS::StackName}-CloudWatchAlarmForChatbotTopicArn

OutputsでExportさせ、クロススタック参照で後述のYAMLファイルでこのSNSトピックを参照しています。

デプロイ

次のコマンドでデプロイします。

aws cloudformation deploy \
    --template-file cloudwatch_alarm.yml \
    --stack-name CloudWatchAlarmSampleStack

AWS Chatbotを作成する

Slackワークスペースの認証とワークスペースID取得

WebコンソールでAWS Chatbotにアクセスし、ワークスペースを追加します。下記のワークスペースIDはあとで必要なのでメモしておきます。

SlackワークスペースのIDを確認する

SlackチャンネルIDを取得

任意のチャンネルのリンクを取得します。

SlackチャンネルIDを確認する

このリンクの最後の文字列を使います。下記例だとABCD1234がチャンネルIDです。

https://classmethod.slack.com/archives/ABCD1234

YAMLの作成

次のYAMLをchatbot.ymlとして作成します。ワークスペースIDとチャンネルIDは外部から渡すようにしました。

chatbot.yml

AWSTemplateFormatVersion: "2010-09-09"
Description: CloudWatch Alarm Sample Stack

Parameters:
  TargetWorkspaceId:
    Type: String

  TargetChannelId:
    Type: String

Resources:
  TestChatbot:
    Type: AWS::Chatbot::SlackChannelConfiguration
    Properties: 
      ConfigurationName: TestChatbotForCloudFormation
      IamRoleArn: !GetAtt ChatbotIamRole.Arn
      LoggingLevel: INFO
      SlackChannelId: !Ref TargetChannelId
      SlackWorkspaceId: !Ref TargetWorkspaceId
      SnsTopicArns: 
        - Fn::ImportValue: !Sub CloudWatchAlarmSampleStack-CloudWatchAlarmForChatbotTopicArn

  ChatbotIamRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: test-chatbot-iam-role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: chatbot.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: test-chatbot-iam-policy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - cloudwatch:Describe*
                  - cloudwatch:Get*
                  - cloudwatch:List*
                Resource:
                  - "*"

デプロイ

次のコマンドでデプロイします。TargetWorkspaceIdTargetChannelIdにワークスペースIDとチャンネルIDを指定します。

aws cloudformation deploy \
    --template-file chatbot.yml \
    --stack-name ChatbotSampleStack \
    --capabilities CAPABILITY_NAMED_IAM \
    --parameter-overrides TargetWorkspaceId=XYZXYZ TargetChannelId=ABCD1234

手動でチャンネルを追加している場合、このコマンドは失敗するのでご注意ください。

デプロイ完了

下記のようにAWS Chatbotのチャンネル設定ができました。

AWS Chatbotでチャンネル設定をおこなう

動作確認する

Lambdaエラーを発生させる

Lambdaを手動実行し、エラー発生させます。

Slackに通知がくる!

エラー発生時に通知が来ました。

Slackにアラート通知がくる

OK状態に戻ったときにも通知がきました。バッチリですね!

SlackにアラートOK通知がくる

さいごに

サクッと作れました。AWS Chatbotをどんどん活用していきたいです。

参考