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通知を行います。

13

設定

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の環境変数に指定しています。

03

SNS

SNSトピック「TestTopic」を作成しました。

01

サブスクリプションはメール通知用と、Slack通知用で2つ作成しています。Slack通知用のサブスクリプションは先程作成したLambdaを指定しています。

02

Step Functions(ステートマシン)

処理の正常、異常を想定した分岐を作成しています。入力イベントにより処理が分岐するステートマシン「TestStateMachin」を作成しました。

04

定義は以下となります。

{
  "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"
}

05

「Notify Success」ステートが実施されました。

06

メールとSlackを確認します。

メール

07

Slack

08

続いて「Notify Failure」ステートの処理実施されるように、ステートマシンに以下のイベントを渡します。 入力イベントは以下です。

{
    "success": "False"
}

09

「Notify Failure」ステートが実施されました。

10

メールとSlackを確認します。

メール

11

Slack

12

ステートマシンから直接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