よくAWSに触れるものです。
以前、ECSに合わせたCodePipelineの構築について記事を書きました。
CI/CDを構築する際にはビルド、デプロイのステータスも重要です。 そのためにステータスを通知するシステムも構築する必要があります。
CodePipelineにもいくつかの通知システムを作成するソリューションがありますが、その中でも最近GAされたAWS Chatbotを使ったSlack通知がコストパフォーマンスが抜群です。
今回Chatbotを使ったCodePipelineの構築について、Cloudformationにて構築しようと思います。
アーキテクチャ
アーキテクチャはこんな感じです。
アーキテクチャと言ってもシンプルで、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クライアントを作成する必要があります。
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になります。
こちらをご参考に
4. 通知を確認する。
実際にCodePipelineを動かして、Slackに来るメッセージを確認しましょう。
■スタート
■成功
気取らないシンプルでデザインの良い通知です。
ちなみにAWS::CodeStarNotifications::NotificationRule
のDetailType
をFULLにするともう少し詳しい情報が来ます。
まとめ
Chatbotは手軽にSNS経由の通知システムを作れ、CodePipeline以外でも様々なシーンで使えます。
ただメッセージのカスタマイズはできないため、その際はSNSからLambdaにメッセージを配信して、メッセージをカスタマイズしましょう。