Codeシリーズの通知を使わずに、AWS Chatbot経由でCodeシリーズの情報をSlackに連携できるか試してみた

2021.07.27

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

データアナリティクス事業本部の笠原です。

業務でCodeCommitやCodeBuildなどのCodeシリーズを扱うことが多いのですが、例えば以下のケースでSlack等に通知したいことはないでしょうか?

  • CodeCommitでプルリクが来たら、通知が来て欲しい
  • CodeBuildでビルドが成功 / 失敗したら、通知が来て欲しい
  • CodeDeployでデプロイが成功 / 失敗したら、通知が来て欲しい
  • CodePipelineでパイプラインのどこかで処理が失敗したら、通知が来て欲しい

Slackへの通知には、AWS Chatbotが便利に使えます。

Codeシリーズには、「Notifications」という最適化された通知サービスが既にあります。

【開発者必見】Codeシリーズに最適化された通知サービスNotificationsがリリースされました! | DevelopersIO

また先日、AWS Chatbot が Amazon EventBridge に対応したことで、様々なAWSサービスと連携できるようになりましたね。

[アップデート] ついに AWS Chatbot が 200を超える Amazon EventBridge イベントに対応しました! | DevelopersIO

EventBridge経由でもCodeシリーズの通知が取得できれば、CodeシリーズのNotificationsを使用せずにできるのではないかと思い、やってみました。

やってみた結果

  • Codeシリーズの通知をする場合は、素直にCodeシリーズの「Notifications」を使用しましょう。
  • 「Notifications」を使用する場合
    • EventBridge ⇒ SNS ⇒ Chatbot経由でSlack通知: できた
    • EventBridge ⇒ SNS 経由でメール通知: できた
  • 「Notifications」を使用しない場合
    • EventBridge ⇒ SNS ⇒ Chatbot経由でSlack通知: できなかった
    • EventBridge ⇒ SNS 経由でメール通知: できた

EventBridgeを使用する際の基本的な構成

構成図を示すとこんな感じになります。

今回はCodeCommitからの通知を元に構成していきます。

通知メッセージは、EventBridgeからSNSを経由してChatbotへと流れます。Chatbotからは指定したSlackチャンネルに通知メッセージを表示してみます。

CodeCommitリポジトリの準備

CodeCommitのリポジトリを準備します。今回は cm-kasahara-chatbot-repo という名前のリポジトリを用意して検証します。

Slackチャンネルの準備

次にChatbotからメッセージが届く先となる、Slackチャンネルを用意します。今回は aws_chatbot_notification というチャンネル名のプライベートチャンネルを用意しました。

AWS Chatbotの設定

次にAWS Chatbotの設定を行います。まずはAWS Chatbotのホームにて「チャットクライアントの設定」を Slack にしてクライアンを設定します。

通知先のSlackワークスペースを指定したら、「許可する」をします。

続いてチャンネルの設定を行います。「新しいチャンネルの設定」をクリックします。

チャンネルの設定では以下のように設定しておきます。

  • Slackチャンネルは、先ほど作成したaws_chatbot_notificationチャンネルがプライベートチャンネルなので、 プライベート を選択します。プライベートチャンネルの場合は、追加でチャンネルIDを入力します。

チャンネルIDは、Slackから「リンクをコピー」をすることで、取得できます。なお、チャンネルIDの入力部分には「リンクをコピー」で取得したチャンネルのURL全体を指定してもいいですし、チャンネルURL末尾のID文字列部分だけ指定してもいいです。

  • アクセス許可では テンプレートを使用してIAMロールを作成する を選択して、新規で作成しました。またポリシーテンプレートでは、 通知のアクセス許可 としました。

  • SNSでは、今の段階ではとりあえず何も指定しません。必要になったら改めて設定します。

これでチャンネル設定ができました。

SlackチャンネルにAWSアプリを導入する

AWS Chatbotでチャンネル設定できたら、一旦SlackのチャンネルでAWSアプリを導入してあげる必要があります。Slackの左側ペインにAWSアプリが無ければ、Slackのアプリ検索の中からAWSアプリを追加しましょう。

また、対象のチャンネル aws_chatbot_notification にて /invite @AWS と送信してプライベートチャンネル内にAWSアプリを招待します。これで、プライベートチャンネルでもAWSアプリが使えるようになります。

実際に通知してみる

CodeシリーズのNotificationsを使ってSlack通知を試す

CodeCommitのリポジトリを選択してから、左側メニューの「設定」画面に遷移しましょう。

リポジトリの設定画面に遷移したら、「通知」タブから「通知ルールの作成」をクリックします。

通知ルールの設定をします。今回はプルリクに関する通知をしてみたいので、プルリクに関するイベントにチェックをつけました。

また、通知先となるターゲットでは、ターゲットタイプで「AWS Chatbot (Slack)」を選択してから、先ほど作成したAWS Chatbotのクライアントを指定します。

「Submit」したら通知ルールの設定は完了です。

では、実際にCodeCommitにてプルリクを実施してみたいと思います。プルリク作成やプルリクマージなどのイベントが発生した際に、Slackにて通知が来ることを確認しましょう。

CodeシリーズのNotificationsを設定すると作成されるもの

ここで、CodeシリーズのNotificationsを設定すると何が作られるのかざっと見ていきます。

1つは、SNSトピックです。Chatbotに対してメッセージ送信する際に使用されます。サブスクリプションにはCodeシリーズのNotificationsで設定したAWS Chatbotのクライアントが自動的に設定されています。

2つ目は、EventBridgeルールです。CodeシリーズのNotificationsのイベントメッセージをSNSトピックに送信するために使用されるようです。

EventBridgeルールのターゲットを見ると、SNSトピックではなく、別のイベントバスになっていました。

CodeシリーズのNotificationsを使わないでSlack通知を試す

今度は、CodeシリーズのNotificationsを使わずにSlack通知できるか試してみます。SlackチャンネルはCodeシリーズのNotificationsとは別のプライベートチャンネルを作成して試してみます。

まずはSNSトピックを作成します。トピック名を指定し、タイプをスタンダードにして他デフォルトのままにしています。

次にAWS Chatbotのクライアントで別のチャンネル設定を追加しておきます。基本的には同じ内容になりますが、通知の「SNSトピック」は、先ほど作成したSNSトピックを指定します。

チャンネル設定を追加すると、先ほど作成したSNSトピックにChatbotのサブスクリプションが追加されているはずです。

SNSとChatbotが連携できると、ChatbotからSlackに対してテストメッセージが送信できますので試してみます。

AWS Chatbotで先ほど設定したチャンネル設定の中に「テストメッセージを送信」をクリックします。設定が正しければ、Slackにテストメッセージが送信されているはずです

Slackにテストメッセージが送信されていない場合は、チャンネルにAWSアプリを招待していない等考えられますので、ご確認ください。

あとは、EventBridgeからCodeCommitのイベントメッセージをSNSトピックに送信するように設定します。

EventBridgeにて「ルール」「ルールの追加」をクリックします。

ルールの作成の際は以下のように設定します。

  • イベントパターンは以下の通り
    • サービスごとの事前定義パターン
    • サービスプロバイダー: AWS
    • サービス名: CodeCommit
    • イベントタイプ: CodeCommit Pull Request State Change
    • 特定リソース (ARN 別)
      • CodeCommitリポジトリARNを入力

  • イベントパターンテストをする際は、サンプルイベントの resources にCodeCommitリポジトリARNを指定してあげると、検証成功になります

  • イベントバスはデフォルトで
  • ターゲットはSNSトピックとし、作成したSNSトピックを選択
    • 入力の設定はデフォルトのまま (一致したイベント)
    • 再試行ポリシーとデッドレターキューはデフォルトのまま

これで設定できたので、CodeCommitにてプルリクのイベントを実施して、Slackに通知が送信されるか確認してみましょう。

実際にやってみたところ、私の環境ではSlackへの通知が届きませんでした。権限周りで何か追加設定が必要なのかと思い、AWS公式ドキュメントを色々探してみましたが、結局Slack通知できませんでした。Codeシリーズからの通知は、設定が容易なNotificationsを使用する方法が良さそうです。

各SNSからファンアウトしてメール通知を試す

せっかくなので、Notificationsを使用した際に作成されたSNSトピックと、Notificationsを使用せずにこちらで作成したSNSトピックから、メッセージをメール送信するサブスクリプションを追加してみました。メール通知の場合は、両者ともメッセージが届きました。

まとめ

いかがでしたでしょうか。Codeシリーズのイベント通知をSlackへ送信する際は、CodeシリーズのNotificationsを使用した方が良さそうです。設定も簡単なのでオススメです。

それ以外のイベント通知については、EventBrigde ⇒ SNS ⇒ Chatbotの通知を押さえておくと、様々なAWSリソースの通知に使えますので、ぜひ覚えておきましょう。