この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。サービス部の武田です。
以前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関数を実装する必要があります。ケースバイケースで使い分けていけるとよさそうですね。