Incoming Webhookを使用してAWS Step Functionsの実行結果をSlackに通知する
こんにちは。サービス部の武田です。
以前AWS Step Functionsの実行結果をChatbotを使用して通知する方法を紹介しました。
しかしChatbotは入力トランスフォーマーによるカスタマイズには対応しておらず、現在上記の設定をしても正しく内容が通知されません。このエントリではLambda関数を使用して実行結果をSlackに通知する方法を紹介します。
アーキテクチャの変更
以前の構成はStep Functions → EventBridge → SNS → Chatbot → Slack
というものでした。EventBridgeの入力トランスフォーマーでSNSに渡す値を加工する以外は、特別なことはしていません。
新しい構成はStep Functions → EventBridge → SNS → Lambda → Slack
となります。入力トランスフォーマーは使用しません。またLambdaからSlackへ通知を送るにあたって、Incoming Webhookの設定が必要となります。ここで少し注意していただきたいのは、Incoming Webhookは新旧異なる方式があります。カスタムインテグレーションの方法は旧式(レガシー)となり非推奨です。現在はSlack Appで追加する方法が推奨ですので、間違えないようにしましょう。
Lambda関数の実装
通知内容を加工してSlackにPOSTするLambda関数は次のような実装にしてみました(urlは実際の発行されたURLに置き換えてください)。Incoming Webhookではシンプルなテキストを簡単に送れますが、blocks
を使用することで凝った通知にもできます。タイトルのフォーマットはChatbotを踏襲しつつ、マネジメントコンソールのリンクにしています。また入力値の表示をコードブロックにしてみました。
import json import urllib3 http = urllib3.PoolManager() def handler(event, context): url = "https://hooks.slack.com/services/xxxxxx" rec = json.loads(event["Records"][0]["Sns"]["Message"]) message_blocks = [ { "type": "section", "text": { "type": "mrkdwn", "text": f':information_source: *<https://{rec["region"]}.console.aws.amazon.com/states/home?region={rec["region"]}#/v2/executions/details/{rec["detail"]["executionArn"]}|[{rec["detail"]["status"]}] {rec["detail-type"]} | {rec["region"]} | Account: {rec["account"]}>*', }, }, { "type": "section", "text": { "type": "mrkdwn", "text": f'*input*\n\ ```\n\ {rec["detail"]["input"]}\n\ ```\n', }, }, ] msg = { "blocks": message_blocks, } encoded_msg = json.dumps(msg).encode("utf-8") resp = http.request("POST", url, body=encoded_msg) print( { "message": event["Records"][0]["Sns"]["Message"], "status_code": resp.status, "response": resp.data, } )
通知してみる
先ほど作成したLambda関数をSNSのサブスクリプションに追加してやれば準備完了です。実際にStep Functionsを実行してみると、次のような通知がSlackに飛んできました。
なかなかいい感じですね?
まとめ
Chatbotを使用することでコードを書かずに簡単に通知が送れます。一方でカスタマイズ性はないため、通知内容をリッチにしたい場合は自前でLambda関数を実装する必要があります。ケースバイケースで使い分けていけるとよさそうですね。