ヘヴィメタル・エンジニアリング

AWS特化型エンジニアのほのぼのヘヴィメタルブログ

ヘヴィメタル・エンジニアリング

クラウド特化型ヘヴィメタルエンジニアのほのぼのブログ

AWSで構築したシステムの通知はまずAWS Chatbotを試そう! ~CodePipeline編~

よくAWSに触れるものです。

以前、ECSに合わせたCodePipelineの構築について記事を書きました。

xkenshirou.hatenablog.com

CI/CDを構築する際にはビルド、デプロイのステータスも重要です。 そのためにステータスを通知するシステムも構築する必要があります。

CodePipelineにもいくつかの通知システムを作成するソリューションがありますが、その中でも最近GAされたAWS Chatbotを使ったSlack通知がコストパフォーマンスが抜群です。

今回Chatbotを使ったCodePipelineの構築について、Cloudformationにて構築しようと思います。

アーキテクチャ

アーキテクチャはこんな感じです。

f:id:xkenshirou:20200622223521p:plain

アーキテクチャと言ってもシンプルで、CodeStar NotificationからSNSにCodePipelineのステータスメッセージをサブスクライブ、それをChatbotに配信します。 Chatbotはデフォルトで整形したメッセージをSlackに通知します。

作成

1. CodePipelineの通知ルールを作成する。

Cloudformationテンプレートの場合はCodeStarNotificationsで通知ルールを作成する必要があります。

  CodepipelineNotification:
    Type: AWS::CodeStarNotifications::NotificationRule
    Properties:
      DetailType: BASIC
      EventTypeIds:
        - codepipeline-pipeline-pipeline-execution-started
        - codepipeline-pipeline-pipeline-execution-failed
        - codepipeline-pipeline-pipeline-execution-succeeded
      Name: xxx
      Resource: !Ref CodepipelineArn
      Targets:
        - TargetType: SNS
          TargetAddress: !Ref NotifyPipelineStatusToSlackSNS

Resourceで通知元、Targetで通知先を登録します。

EventTypeIdsでは通知するステータスを選択します。

2. SNSを作成する。

SNS TopicのSubscriptionでchatbotに配信するSNS APIのエンドポイントをHTTPSで指定するのがポイントです。

  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: CodepipelineNotificationPublishPolicy
            Effect: Allow
            Principal:
              Service:
              - "codestar-notifications.amazonaws.com"
            Action:
              - "SNS:Publish"
            Resource:
              - !Ref NotifyPipelineStatusToSlackSNS
      Topics:
        - !Ref NotifyPipelineStatusToSlackSNS

  NotifyPipelineStatusToSlackSNS:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: xxx
      Subscription:
        - Endpoint: https://global.sns-api.chatbot.amazonaws.com
          Protocol: HTTPS

3. Chatbotを作成する。

まずはChatbotのコンソールでSlackクライアントを作成する必要があります。

f:id:xkenshirou:20200623001505p:plain

Slackクライアントが作成できたら、以下のテンプレートでChatbotを作成しましょう。

  Chatbot:
    Type: AWS::Chatbot::SlackChannelConfiguration
    Properties:
      ConfigurationName: xxx
      IamRoleArn: !GetAtt ChatbotIamRole.Arn
      SlackChannelId: !Ref SlackChannelId
      SlackWorkspaceId: !Ref SlackWorkspaceId
      SnsTopicArns:
        - !Ref NotifyPipelineStatusToSlackSNS

ちなみにここでIamRoleを付与できるのですが、Chatbotはslackからaws-cliが使えるという機能があり、その際のRoleになります。

こちらをご参考に

docs.aws.amazon.com

4. 通知を確認する。

実際にCodePipelineを動かして、Slackに来るメッセージを確認しましょう。

■スタート f:id:xkenshirou:20200623001917p:plain

■成功 f:id:xkenshirou:20200623002316p:plain

気取らないシンプルでデザインの良い通知です。

ちなみにAWS::CodeStarNotifications::NotificationRuleDetailTypeをFULLにするともう少し詳しい情報が来ます。

まとめ

Chatbotは手軽にSNS経由の通知システムを作れ、CodePipeline以外でも様々なシーンで使えます。

ただメッセージのカスタマイズはできないため、その際はSNSからLambdaにメッセージを配信して、メッセージをカスタマイズしましょう。