はじめに
AWSの各種サービスからSlackへ送信する場合、Amazon SNSとAmazon Q Developer in chat applications(旧AWS Chatbot)を使うとSlackへメッセージを送信することが出来ますが、先日Amazon Q Developer in chat applicationsを使わずにSlack送信する構成を構築したのでやったことを残しておこうと思います。
Amazon Q Developer in chat applicationsを使わないSlack送信
Amazon Q Developer in chat applicationsを使わない場合、LambadでコーディングしてSlack送信する方法等がありますが、EventBridge Connections(以降EventBridge接続)、EventBridge API Destination(以降EventBridge API送信先)という機能を使用することで、Lambda等でコーディングしなくても送信することができます。
以下よりSlack側の設定、EventBridge接続&API送信先設定と、テストのためのStep Functions&EventBridge Ruleの設定を行っていきます。
Slack側設定
Slack送信を行うため、先にSlack Appを設定します。
Slack側の設定としてはいくつか方法がありますが、よく紹介される「Incoming Webhook」の方式では、SlackチャンネルごとにURLが払い出されることから、同じSlackワークスペースで複数のチャンネルに送信するとき、ちょっと手間なので、今回は複数チャンネルでの設定を行う場合でも手間が少ないBot Tokenの方式で設定します。
また、Slackのチャンネルはプライベートチャンネルに送信する想定で進めます。
Slack Appの作成
Slack Appをインストールするため、Slackの横バーの「エージェントとツール」→「Slackマーケットプレイスをブラウズする」から「構築」を選択、もしくはSlack APIページのURL( https://api.slack.com/apps/ )を直接入力して「Your Apps」画面に遷移します。
「Create New App」より「Blank app」を選択し、「Continue」で先に進みます。
作成するアプリケーションの名前とワークスペースを入力して、「Create」でSlack Appを作成します。
Slackのスコープ設定
作成したSlack Appの設定画面より、「OAuth & Permissions」の「スコープ」の「ボットトークンのスコープ」から、「OAuthスコープを追加する」を選択し、Bot Tokenの権限設定を行います。
Slackへの送信以外に絵文字等使いたい場合はchat:write.customizeも必要なようなので、以下のように設定しました。
OAuthトークンのインストール
先ほどスコープ設定した「OAuth & Permissions」の「OAuth Tokes」から「Install to [ワークスペース名]」を選択します。
以下のような確認画面が表示されるため、「許可する」を選択することでトークンが発行されます。
トークンは後ほど使用するため、「Copy」ボタンをクリックし、コピーしておきます。
もしトークンを再発行したい場合は「Reinstall to [ワークスペース名]」を選択して再発行してください。
Slackチャンネルへのアプリの追加
作成に成功していれば、Slackの左バーの「エージェントとアプリ」に作成したアプリが表示されていると思いますので、AWSからのSlackメッセージを受け取りたいチャンネルで以下のように「/invite [Slackアプリ名]」を入力します。
以下のように追加された旨が表示されれば準備完了です。
AWS側Slack送信設定
Step Functions、EventBridge Rule設定を行う前に、Slack送信に使う共通的なSlack接続設定を行っていきます。
先ほど説明した通り、EventBridge接続というEventBridgeのサービスを利用することでSlackへ送信することが出来ます。
また、EventBridge Ruleから送る場合はEventBridge API送信先の利用も必要となり、設定後にEventBridge Ruleのトリガーとして指定することでSlackに送信することが出来ます。
今回作成する構成での各サービス間のつながりは以下となります。
EventBridge接続やEventBridge API送信先について詳しくは以下公式ドキュメントを参照してください。
EventBridge接続の作成
「EventBridge」ダッシュボードより「結合」→「接続」から「接続を作成」を選択し、以下のように設定します。
| 項目 | 設定 | 備考 |
|---|---|---|
| 接続名 | slack-send-connections | 任意の名前を指定 |
| 説明 | ※空欄 | 今回は未設定 |
| APIタイプ | パブリック | Slackチャンネルのタイプではなくネットワークのタイプ Slackは外部サービスのためパブリックで指定 |
| 認証を設定 | カスタム設定 | 今回はテンプレートは使用しない |
| 認証タイプ | APIキー | ー |
| APIキー名 | Authorization |
Slack送信に必須となるヘッダとなるため必ず指定 |
| 値 | Bearer [先程コピーしたトークン] |
先頭にBearerの指定が必要となるためコピーしたトークンの先頭に付与する |
| 暗号化 | AWS所有キーを使用する | 今回はAWSキーを使用 |
尚、APIキーの値を指定する際、Bearerとトークンとの間にスペースが必要なので忘れずに指定してください。
また、APIキーについては、EventBridge接続の設定時、シークレットマネージャーに自動で登録され、以下のように手動で変更を行えないようになっているため、更新するときには直接EventBridge接続の設定を更新するようにしてください。
EventBridge API送信先の設定
EventBridge RulesからのSlack送信用としてEventBridge API送信先の設定を行います。
| 項目 | 設定 | 備考 |
|---|---|---|
| 名前 | slack-send-api送信先 | 任意の名前を指定 |
| 説明 | ※空欄 | 今回は未設定 |
| API送信先エンドポイント | https://slack.com/api/chat.postMessage |
Bot Tokenでチャット送信する際に指定 |
| HTTPメソッド | POST | POSTを指定 |
| 1秒あたりの呼び出しレート制限 | ※空欄(デフォルト300回) | 今回はデフォルト |
| 接続タイプ | 既存の接続を使用 | 先ほど作成したEventBridge接続の名前を指定 |
チャンネルごとにURLが異なるIncoming Webhookの場合とは異なり、Bot Tokenでの送信の場合はchat.postMessageのAPIエンドポイントに送信することでSlack送信することになります。
chat.postMessageのAPI仕様については以下参照。
AWS側Step Functions & EventBridge Rule設定
ここまでの設定で、Slackへの送信準備が出来たため、Slackへ送信テストを行うためのStep Functionsの設定とStep Functionsが失敗したときに検知してSlack送信を行うEventBridge Ruleの設定を行っていきます。
Step Functionsの作成
今回はStep FunctionsからSlack送信出来るかを確認するため、送信のみ行うワークフローを作ってみようと思います。
「Step Functions」ダッシュボードより「ステートマシン」→「ステートマシンの作成」から以下のように作成していきます。
| 項目 | 設定 | 備考 |
|---|---|---|
| ステートマシンの作成 | 空白から作成 | 今回はテンプレートは使用せずに作成 |
| ステートマシン名 | slack-send-sfn | 任意の名前を指定 |
| ステートマシンのタイプ | 標準 | 今回はテストのため標準 |
Step Functionsから各種APIに送信する場合、「Call HTTPS APIs」アクションを使用してAPI送信することになるため、「アクション」にあるオブジェクトを中央の配置画面にドラッグ&ドロップして以下のように設定します。
設定は以下の「設定」タブの部分のみ設定すれば問題ありません。
Step FunctionsではEventBridge API接続先に当たる設定を「Call HTTPS APIs」で行うため、直接EventBridge接続に送ることで、Slack送信できるようになっています。
| 項目 | 設定 | 備考 |
|---|---|---|
| 状態名 | Call HTTPS APIs | デフォルトでアクション名が指定されるためそのまま使用 |
| APIエンドポイント | https://slack.com/api/chat.postMessage |
EventBridge API送信先設定で設定した時と同じpostMessageのURLを指定 |
| メソッド | POST | POSTを指定 |
| 接続 | slack-send-connections | 先ほどEventBridge接続で作成した接続名を指定 |
| リクエスト本文 | ※以下に記載 | Slack送信する際のテキストなどを指定 |
リクエスト本文は「chat.postMessage method」に記載の仕様に沿って、送信するチャンネル名やメッセージ本文を記載します。
また、必須引数となっているtokenについてはEventBridge接続で設定したトークンを使用するため、Step Functionsでの指定は不要です。
{
"channel": "slack_test",
"icon_emoji": ":large_green_circle:",
"text": "Step Functions実行成功"
}
channelについてはチャンネル名かチャンネルIDが指定できます。
リクエスト本文をもっと凝ったデザインにしたい場合は、Slack Block Kit Builderからテンプレート等を参照しつつ作ってみてください。
Step FunctionsからのSlack送信
ワークフロー作成後、「実行を開始」から実行することでSlackへ送信出来るか確認します。
以下のようなメッセージがSlackに通知されれば成功です。
EventBridge Rule作成
先ほど作成したStep Functionsの実行が失敗した場合にSlack通知するため、EventBridge Ruleの設定を行っていきます。
EventBridge Ruleでは、Step Functionsのエラー通知をキャッチし、ターゲット指定でEventBridge API接続先を指定することで送信します。
| 項目 | 設定 | 備考 |
|---|---|---|
| ビルダーモード | アドバンストビルダー | 今回はアドバンストビルダーで作成 |
| 名前 | slack-send-eb | 任意の名前を指定 |
| 説明 | ※空欄 | 今回は未設定 |
| イベントパス | default | テストのためdefaultで実施 |
| 選択したイベントバスでルールを有効にする | 有効 | 設定後すぐに有効化 |
| イベントソース | AWSイベントまたはEventBridgeパートナーイベント | ー |
| 作成のメソッド | パターンフォームを使用する | ー |
| イベントソース | AWSのサービス | ー |
| AWSのサービス | Step Functions | Step Functionsからのイベントをキャッチする |
| イベントタイプ | Step Functions Execution Status Change | ー |
| イベントタイプの仕様1 | 特定のステータス(FAILED、TIMED_OUT、ABORTED) | エラー系のステータスを選択 |
| イベントタイプの仕様2 | 任意のステートマシンARN | 今回は任意で指定 |
| イベントタイプの仕様3 | 任意の実行ARN | 今回は任意で指定 |
イベントパターンの設定画面の抜粋も以下に示します。
「ターゲットを選択」以降の設定は以下のように指定します。
タグ等は今回設定しないため、以下入力後は「レビューと作成にスキップ」に進み、作成してしまって問題ありません。
| 項目 | 設定 | 備考 |
|---|---|---|
| ターゲットタイプ | EventBridge APIの宛先 | EventBridge API送信先を指定するために選択 |
| API送信先 | 既存のAPI送信先を使用 | 先ほど作成したEventBridge API送信先を指定 |
| 実行ロール | デフォルトロールを作成 | 今回はテストのためデフォルトで作成 |
| 追加設定 | ※追加設定を開く | リクエスト本文の指定をするため追加設定を開く |
| ターゲット入力を設定 | 入力トランスフォーマー | リクエスト文については後述 |
| 再試行ポリシー | ※空欄 | 今回はデフォルト |
| デッドレターキュー | なし | 今回はデフォルト |
入力トランスフォーマーの設定は、今回は入力パスで失敗ステータスだけ取得し、テンプレートのtextに失敗ステータスも入力するようにしました。
{"status":"$.detail.status"}
{
"channel": "slack_test",
"icon_emoji": ":rotating_light:",
"text": "Step Functions実行失敗(Status: <status>)"
}
入力パスやテンプレートの書式は、入力トランスフォーマー設定画面で確認出来る「サンプルイベント」や「入力パス、テンプレート、および出力の例」を参考にしつつ設定してください。
Step Functions失敗時のSlack送信
Step Functions失敗時のSlack送信を確認するため、以下のように「Fail state」のみ指定するようにして実行してみます。
以下のようにEventBridge Ruleで設定したリクエスト本文と、Statusに変数指定したステータスが表示されていれば成功です。
おわりに
今回は旧Chatbotを使用せずにEventBridge接続とEventBridge API送信先を使用したSlack送信を行ってみました。
旧Chatbotの場合、Slackへ送信できるフォーマットが限られてしまうこと、別途SNS(Sinple Notification Service)も必要になることから、柔軟なフォーマットで送信でき、設定も難しくなく、LambdaのようにコーディングしなくてもすむEventBridge接続設定を使うのは今の時代でもありだなと感じました。















