この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、坂巻です。
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