【AWS】AWSサービスでSlack通知をやってみた(AWS Chatbot + Amazon SNS)

はじめに

TechDivで開発業務を担当しているR.KOSEKIです。
今回はAWS ChatbotとAmazon SNSという2つのAWSサービスを併用して行うSlack通知の方法について紹介していきます。
本記事では特に、
「AWSでのSlack通知のやり方がわからない」
「AWSの他のサービスは触ったことがあるけど、AWS ChatbotやAmazon SNSは使ったことがない」
「そもそもAWSにあんまり詳しくない...」
といった方々にとって少しでもお役に立てるような情報を提供できればと思います。

AWS Chatbotとは

Amazon ChimeまたはSlackに対して安全かつ簡単に通知が送れるサービスです。
2020年4月に一般利用開始となったばかりなのでちょうど1年くらいですね。

AWS Chatbot は、Slack チャンネルや Amazon Chime チャットルームで AWS のリソースを簡単にモニタリングおよび操作できるようにしてくれるインタラクティブエージェントです。AWS Chatbot を使用すると、アラートを受信することや、診断情報の取得、AWS Lambda 関数の呼び出し、AWS サポートケースの作成を行うコマンドを実行することができるようになります。

引用:AWS Chatbot | AWS

以上が公式サイト冒頭のAWS Chatbotについての説明です。要約すると、
「SlackやAmazon Chimeといったチャットツール宛に通知を送ることで、AWSサービスの管理を簡単にできるbot」といったところでしょうか。
AWS公式ガイドにAWS Chatbotによる通知に対応しているサービスの一覧も記載されています。

各AWSサービスとAWS ChatbotがあればSlackへの通知ができそうに思えるのですが、AWSサービスとAWS Chatbotの間の橋渡し役として後述のAmazon SNSの存在があって、初めてイベント通知が可能となります。

Amazon SNSとは

正式名称は「Amazon Simple Notification Service」です。
こちらは簡潔にまとめると「サーバレスでアプリケーションへの通知を可能にするサービス」です。
今回紹介するイベント通知においては、AWSサービスから送られるイベントや通知をメッセージとして受け取り、AWS Chatbotに送る役割に該当します。

Amazon Simple Notification Service (Amazon SNS) は、アプリケーション対アプリケーション(A2A)間と、アプリケーション対個人(A2P)間の両方の通信に使用できる、フルマネージド型メッセージングサービスです。

A2A での pub/sub 機能により、分散型システムやマイクロサービス、そして、イベント駆動型のサーバーレスアプリケーションにおいて、高スループットでプッシュベースの、多対多メッセージングをトピックで利用できるようになります。

引用:Amazon SNS(サーバーレスアプリのための pub/sub メッセージングサービス)| AWS

pub/subとは、パブリッシャー(publisher)サブスクライバー(subscriber)間で「トピック」を通して行われるメッセージング機能のことです。
パブリッシャーとは、メッセージを作成する発行者です。トピックに対して作成したメッセージを送信することができます。
サブスクライバーとは、トピックからメッセージを受信する購読者にあたります。
トピックは、パブリッシャーとサブスクライバー間に位置するアクセスポイントにあたります。

これらによるメッセージの流れを簡単に矢印で表すと、
パブリッシャー ⇒ トピック ⇒ サブスクライバー
となります。

Slack通知用の設定

AWS ChatbotとAmazon SNSについて簡単にご紹介しましたので、ここから本格的にイベント通知までの設定の方法を紹介していきます。

(1) Amazon SNSにてトピックの用意
まずはAmazon SNSコンソールを開き、トピックの作成画面に移ります。

タイプはFIFOかスタンダードから選べます。今回はスタンダードを選択しました。こちらは後から変更ができない点にご注意ください。
名前と表示名は分かりやすいものにすると良いと思います。
その他にも暗号化やアクセスポリシーなどのオプションがありますが、後からトピック画面にて設定変更可能なのでトピックの作成を完了していきます。

(2) AWS Chatbotでチャネルの用意
次にAWS ChatbotにてSlackに通知を行う用のチャネルを作ります。
まずはクライアントにSlackを設定して、アクセス権限リクエスト画面にてリクエストの許可を行います。



AWS ChatbotがSlackワークスペースにアクセスできるようになります。


設定済みクライアントの中にSlackワークスペースが追加されます。
次に、「新しいチャネルを設定」から設定をしていきます。


最初にチャネルの設定名を決めていきます。後から変更ができない点にご注意ください。
ログ記録はAmazon CloudWatch Logsを使用している場合に任意でチェックを行う項目です。


連携したいSlackチャンネルのURLもしくはURL末尾のIDをコピーし、ID欄にペーストします。
伏せていますが、今回は通知用に作成したSlackのパブリックチャンネルを使っています。


アクセス許可設定では、「既存のIAMロールを使用する」または「テンプレートを使用してIAMロールを作成する」のいずれかを選択できます。
AWS Chatbotを使用したことがない人はIAMロールの作成が必須になりますのでこちらを選びましょう。ロール名は分かりやすい名前にしておきます。

ポリシーテンプレートとはアクセス許可に関するポリシーをIAMロールに適用するもので、複数設定できます。今回は複雑な設定はせずデフォルトの「通知のアクセス許可」のみでいきます。


通知オプションでSNSトピックのリージョンと、Amazon SNSで作成したトピックを選択し「設定」を押下することでチャネルの作成は完了となります。
AWS Chatbotでの設定は以上です。

ちなみにここでAmazon SNSのトピックを確認してみると、サブスクリプションが1件作成されています。
これは先ほどAWS Chatbotのチャネル設定にてSNSトピックを指定したためで、エンドポイントの登録も自動で行われます。

(3) 通知を行いたいAWSサービスにおける設定
Amazon SNSとAWS Chatbotでの設定が完了したので、後は通知したいサービスの通知ルールの設定を行うだけです。今回はAWS CodeCommitを使った例を紹介します。


まずはイベント通知を行いたいリポジトリを選択し、通知ルールを作成していきます。


まずは通知名と詳細タイプを設定します。詳細タイプのデフォルトはフルになっています。フルとベーシックの違いは通知時の情報量の違いです。


通知のトリガーとするイベントも自由に選択できます。


ターゲットタイプにはSlackを選択し、ターゲットにはAWS Chatbotで作成したチャネルを選択すると、ARNが自動検出されます。
設定が完了したらSubmitを押下することで、通知ルールの作成が完了します。

通知ルール作成完了後は必ず通知ステータスがONになっていることを確認しましょう。
これでSlackへのイベント通知を行うための準備が整いました。

AWS CodeCommitリポジトリへ変更を加えてみる

後は実際にリポジトリに変更を加えてSlackへ通知が届くことを確認してみましょう。
Gitクライアントツールを使ってリポジトリに適当なファイルを配置します。
今回はTest.txtというファイルを追加しました。


先ほど設定したSlackのパブリックチャンネルを確認すると、AWSアプリからAWS CodeCommitに更新があったとの通知が届いています。

おわりに

いかがでしたでしょうか?AWS ChatbotとAmazon SNSを組み合わせて使うだけで、簡単にSlackへのイベント通知が可能になります。
私自身AWSの知識が浅いのですが、AWS ChatbotやAmazon SNSの仕様理解はとても簡単だったので、あまり詳しくない人でもとっつきやすいのではないかな?と思います。
記事を書きながら改めて勉強にもなったので、今後も活用する機会を増やしていきたいです!