はじめに
AWS Step Functionsの実行結果をSlackへ通知する手順について、以下の記事では、Step Functionsの実行結果を取得し、Slackに通知する方法を紹介します。この記事では、SNS(Simple Notification Service)とAWS Lambdaを使ってStep Functionsの実行結果をトリガーし、Slackに通知を送信する流れを説明します。
構成
目次
SlackのWebhookURLを取得
Slackに通知を送るためには、SlackのIncoming Webhooksを利用します。
以下の手順でWebhook URLを取得します。
・Slack APIを参考にアプリを作成。
・アプリを作成したら、Incoming Webhooks
を有効にし、Webhook URL
を生成します。このURLは後ほどLambda関数内で使用します。
SNSトピックの作成
AWS Step Functionsの実行結果を受け取るために、SNSトピックを作成します。SNSはStep Functionsの結果を通知する中間のメッセージブローカーとして機能します。
・AWSコンソールにログインし、SNSサービスに移動します。
・「トピックの作成」をクリックし、トピック名を入力してトピックを作成します。
・トピックが作成されたら、ARN(Amazon Resource Name)をメモしておきます。Lambda関数でこのARNを使ってSNSからの通知を受信します。
StepFunctionsの実行結果をSNSへ通知する設定
次に、Step Functionsが実行結果をSNSに通知するように設定します。
・AWS Step Functionsのコンソールに移動します。
・対象となるステートマシンを選択し、編集モードに移行します。
・Step Functionsの定義にCatch
やFinally
セクションを追加して、失敗や成功に応じてSNSに通知するように設定します。
生成されたコードは下記のようになります。
{
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "作成されたARN",
"Message": "Step Function完了しました"
},
"End": true
}
Lambda関数を作成し、SNSから実行結果を受け取り、Slackに通知する
次に、SNSからのメッセージを受け取り、Slackに通知を送るLambda関数を作成します。
・AWS Lambdaのコンソールに移動し、新しいLambda関数を作成します。
・ランタイムにPythonを選択し、以下のようなコードを追加します。
import json
import urllib3
http = urllib3.PoolManager()
def lambda_handler(event, context):
# SNSからのメッセージを取得
message = event['Records'][0]['Sns']['Message']
# SlackのWebhook URL
slack_webhook_url = "https://hooks.slack.com/services/xxxx/yyyy/zzzz"
# Slackに通知するペイロード
slack_message = {
'text': f"Step Functions Result: {message}"
}
# Slackにリクエストを送信
response = http.request(
'POST',
slack_webhook_url,
body=json.dumps(slack_message),
headers={'Content-Type': 'application/json'}
)
# Slackへの通知結果をログに出力
print({
"status_code": response.status,
"response": response.data
})
return {
'statusCode': 200,
'body': json.dumps('slack通知')
}
最後にStep Functionsを実行し、正常に動作しているか確認します。