Incoming Webhookを使用してAWS Step Functionsの実行結果をSlackに通知する

AWS Step Functionsの実行結果をLambda関数を通してSlackに通知する方法を試してみました。
2022.10.27

この記事は公開されてから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関数を実装する必要があります。ケースバイケースで使い分けていけるとよさそうですね。

参考URL