CodePipeline の実行状況を Slack に通知する
Solution Architect の t_maru です。
部署の運用ルール変更に伴い、今後は Build サービスのアカウントから情報発信させていただきます。
前回は CodeBuild と CodePipeline を連携させて複雑なワークフローでも視覚的に状況が把握できるようにしました。
CodeBuild 単体で使う場合と比較すると処理状況が step 毎に可視化されるため便利にはなりましたが、開発中は常に CodePipeline など CI/CD のワークフローの画面を見ていることはまずないかと思いますので、今回はチャットツールの 1 例として Slack を取り上げ、CodePipeline での処理の実行状況に応じたメッセージを通知する方法について説明します。
Code シリーズの Notification と Chatbot
現在、Code シリーズと呼ばれる AWS の Developer Tool 向けの専用 Notification 設定が AWS から提供されています。
処理の流れとしては、
CodeStarNotification の NotificationRule にて CodePipeline や CodeBuild のイベントを拾う
イベントに応じて AWS Chatbot を使って Slack にメッセージを送信する
という流れとなりますので、Pipeline の設定に加えて必要になってくるのは Chatbot の設定と Notification Rule の設定になります。
以降の項で具体的な設定項目について見ていこうと思いますが、今回も再現性と検証後のリソースを適切に削除するため CloudFormation を使って設定を行います。
Console で設定する場合は、各サービス毎にドキュメントが分かれていますのでそちらを参考にしてください。下記は CodePipeline の通知ルールの作成に関する公式のドキュメントです。
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/notification-rule-create.html
Chatbot を設定する
Chatbot を設定するために下記の公式リファレンスを参照します。
パラメータのうち最低限設定が必要な項目のみを抜き出しました。
Type: AWS::Chatbot::SlackChannelConfiguration
Properties:
ConfigurationName: <この設定の名前>
IamRoleArn: <Chatbot に設定する IAM Role の ARN>
SlackChannelId: <Chatbot からのメッセージを表示する Slack の Channel の ID>
SlackWorkspaceId: <上記の Slack channel が存在している Slack workspace の ID>
Slack の WorkspaceId と ChannelId は Slack を Web ブラウザーで開くと URL で確認することができますので URL から必要な ID を取得するか、このあと説明する CloudFormation でデプロイ前に手動で実施する必要がある AWS と Slack workspace の接続処理を行うと、AWS の Management Console 上でも WorkspaceId については確認することができます。
※ 記事執筆時点では URL から必要な情報を取得できましたが、皆様がこの記事を読んでいる時点で Slack 側の仕様が変わっている場合は新しい仕様に従ってください。
ConfigurationName は今作成している設定の名前なので任意の文字列で設定していただければと思いますので、残っている設定は IamRoleArn です。
AWS の公式ドキュメントに必要な IAM Policy についての説明も記載されていたので下記のドキュメントを参考にします。
今回は Chatbot から Slack に通知するだけなので、`The AWS Chatbot Notification Permissions IAM policy` という項目を参考にして、最小限の設定だけ入れることにしますので Chatbot 用の IAM Role と Policy は下記のように設定しました。
ChatbotRole:
Type: AWS::IAM::Role
Properties:
Path: "/"
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service:
- chatbot.amazonaws.com
Action:
- sts:AssumeRole
ManagedPolicyArns:
- !Ref ChatbotPolicy
ChatbotPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
Path: "/"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Action:
- cloudwatch:Describe*
- cloudwatch:Get*
- cloudwatch:List*
Effect: Allow
Resource: "*"
これで Chatbot の設定は揃いましたが、先程も少し触れたようにこの CloudFormation template をデプロイする前に AWS の Chatbot Console にて手動で AWS と Slack のワークスペースの紐付けを行う必要がありますのでご注意ください。
具体的な作業としては、Chatbot の Console を開くと以下のような画面が表示されると思いますので、`Configure a chat client` のセクションで Chat client から Slack を選択し、`Configure client` を押すと、Slack の設定画面が開き AWS からのアクセスを許可するかどうかを尋ねられるので、Allow をクリックすれば作業終了です。
Notification Rule を設定する
Chatbot から Slack に連携する設定は行ったので、次に Pipeline で発生するどのイベントを Slack に通知するのかを選択して設定する必要があります。
通知で使用できるイベントは下記のドキュメントを見ることで設定値と合わせて確認することができます。
https://docs.aws.amazon.com/dtconsole/latest/userguide/concepts.html#concepts-api
上記を確認すると、CodeCommit, CodeBuild, CodeDeploy, CodePipeline の設定値を確認することができますが、今回は CodePipeline の設定を確認します。
大きなカテゴリとしては Action execution, Stage execution, Pipeline execution, Manual approval という 4 つが存在しており、その中でさらに細かいイベントが記載されていますので、皆さんの用途にあったイベントを選択してください。今回は Pipeline の実行に関連するイベントと、Manual approval に関するイベントを設定してみようと思います。
NotificationRule の CloudFormation template に関するドキュメントは下記を参考にします。
Type: AWS::CodeStarNotifications::NotificationRule
Properties:
Name: <NotificationRule の名前>
DetailType: <通知に含める情報のレベルを選択。 BASIC or FULL>
EventTypeIds:
- <通知するイベントの ID>
Resource: <通知を設定する対象の ARN。今回は Pipeline>
Targets:
- TargetType: <SNS か Chatbot client を選択>
TargetAddress: <TargeType で選択したリソースの ARN>
先程のドキュメントで通知対象イベントの ID を調べることができるので、それらを使って今回は下記のように設定してみました。
Notification:
Type: AWS::CodeStarNotifications::NotificationRule
Properties:
Name: pipeline-notification-rule
DetailType: FULL
Resource: !Sub "arn:aws:codepipeline:${AWS::Region}:${AWS::AccountId}:${PipelineName}"
EventTypeIds:
- codepipeline-pipeline-pipeline-execution-failed
- codepipeline-pipeline-pipeline-execution-canceled
- codepipeline-pipeline-pipeline-execution-started
- codepipeline-pipeline-pipeline-execution-resumed
- codepipeline-pipeline-pipeline-execution-succeeded
- codepipeline-pipeline-pipeline-execution-superseded
- codepipeline-pipeline-manual-approval-failed
- codepipeline-pipeline-manual-approval-needed
- codepipeline-pipeline-manual-approval-succeeded
Targets:
- TargetType: AWSChatbotSlack
TargetAddress: !Ref ChatbotArn
今回は先程の Chatbot と NotificationRule、通知のイベントを発生させる Pipeline の template をそれぞれ別のファイルとして作成しているので、上記の template 内で使われている `PipelineName` と `ChatbotArn` は Parameter として受け取っています。CloudFormation template の詳細について興味のある方は、この記事の最後に掲載している GitHub のリポジトリを参照してください。
実際に動作させてみる
以上で、Chatbot と NotificationRule の設定が終わったので、前回の記事の際に作っていた Pipeline に組み合わせて実際にどのような通知が Slack に届くのか確認してみます。
※ 今回は Manual Approval の通知についても確認したかったので、前回の Pipeline に Manual approval の stage を追加しています。
今回使用した Pipeline は CodeBuild が生成する zip ファイルの S3 put をトリガーに起動するように設定しているため、GitHub に Push してから少しタイムラグがありますが、Pipeline の開始、終了、Manual approval の開始、終了が通知されることが確認できました。
まとめ
今回は CodePipeline の状態に応じて Slack にメッセージを自動的に投稿するための設定について説明しました。
チャットツールへ自動的にメッセージが投稿されるため、CI/CD の成功、失敗などが AWS の Console を開かなくても確認できるようになり開発時の作業効率も上がると思いますので、AWS の Code シリーズを使って開発をされている方は Chatbot を使った連携について検討してみてはいかがでしょうか。(現在 AWS Chatbot は Slack と Amazon Chime のみ対応です)
また今回は CodePipeline のイベント通知について取り上げましたが、CodeCommit, CodeBuild, CodeDeploy に関してもイベント ID を変更するのみで対応可能ですので皆様状況の応じて設定してみてください。
今回の記事の中で紹介した CloudFormation の template は下記の GitHub リポジトリで公開しています。
https://github.com/t-maru078/code-pipeline-slack-notification