StepFunctionsとSNSを連携させてメール&Slack通知をしてみた #reinvent
こんにちは、坂巻です。
re:Intent2018の発表のひとつにStep Functionsのアップデートがありました。本エントリではアップデートで可能になったStep FunctionsとSNSを連携させ、Lambdaを介しSlack通知まで実施してみたいと思います。
アップデートの詳細については、下記をご参照ください。
[神アップデート]Step Functionsが新たに8つのマネージドサービスと連携可能になりました! #reinvent
構成
Step Functions(ステートマシン)から直接SNSトピックにイベントを送信します。SNSサブスクリプションはemailとLambdaで2つ作成し、メール通知とSlack通知を行います。
設定
Lambda
Slack通知用のLambda関数「LambdaToSlack」を作成しました。ランタイムはPython 3.6でコードは以下となります。
import json import os from urllib.request import Request, urlopen def lambda_handler(event, context): SLACK_CHANNEL = os.environ['slackChannel'] HOOK_URL = os.environ['HookURL'] message = event['Records'][0]['Sns']['Message'] slack_message = { 'channel': SLACK_CHANNEL, 'text': message } req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8')) response = urlopen(req) response.read()
SNSイベントからメッセージ取得し、Slackへ渡すシンプルなコードです。また、WebHookURLとチャンネル名はLambdaの環境変数に指定しています。
SNS
SNSトピック「TestTopic」を作成しました。
サブスクリプションはメール通知用と、Slack通知用で2つ作成しています。Slack通知用のサブスクリプションは先程作成したLambdaを指定しています。
Step Functions(ステートマシン)
処理の正常、異常を想定した分岐を作成しています。入力イベントにより処理が分岐するステートマシン「TestStateMachin」を作成しました。
定義は以下となります。
{ "StartAt": "IsSucceed", "States": { "IsSucceed": { "Type": "Choice", "Choices": [{ "Variable": "$.success", "StringEquals":"True", "Next": "Notify Success" }], "Default": "Notify Failure" }, "Notify Success": { "Type": "Task", "Resource": "arn:aws:states:::sns:publish", "Parameters": { "Message": "Batch job submitted through Step Functions succeeded", "TopicArn": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXX:TestTopic" }, "End": true }, "Notify Failure": { "Type": "Task", "Resource": "arn:aws:states:::sns:publish", "Parameters": { "Message": "Batch job submitted through Step Functions failed", "TopicArn": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXX:TestTopic" }, "End": true } } }
「IsSucceed」ステートでは、入力イベントを判定しています。
「Notify Success」、「Notify Failure」ステートがSNSトピックにイベントを送信します。TopicArn
は環境にあわせて修正が必要です。処理の正常、異常を想定して、ステート内のParameters
- Message
で通知メッセージを指定しています。
動作確認
ステートマシン「TestStateMachin」を実行します。まずは「Notify Success」ステートが実施されるように、ステートマシンに以下のイベントを渡します。
{ "success": "True" }
「Notify Success」ステートが実施されました。
メールとSlackを確認します。
メール
Slack
続いて「Notify Failure」ステートの処理実施されるように、ステートマシンに以下のイベントを渡します。 入力イベントは以下です。
{ "success": "False" }
「Notify Failure」ステートが実施されました。
メールとSlackを確認します。
メール
Slack
ステートマシンから直接SNSトピックにイベントを送信することができました。また、処理の正常、異常を想定しSNSに送信するステートを分けたことで、通知されるメッセージも変化させることができました。
さいごに
アップデート前のStep Functionsでは直接SNSにイベントを送信することができず、Lambdaを介した処理が必要でした。また、ステートマシンの正常、異常終了を通知する場合はCloudWatchアラームを設定する必要がありました。今回のアップデートでStep Functionsの機能だけで、SNSにイベントが送信できるようになり、通知ができるようになった事で、よりStep Functionsが使いやすくなりましたね!
参考
https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/connectors-sns.html