AWS Step FunctionsステートマシンからMapステートを使用して複数のSMSメッセージを送信する(AWS CDK)
こんにちは、CX事業本部 IoT事業部の若槻です。
前回のエントリでは、Step Functions Workflow Studioを使用して複数のSMSメッセージを送信するステートマシンを作成しました。
今回は、同じくAWS Step FunctionsのステートマシンからMapステートを使用して複数のSMSメッセージを送信する構成を、AWS CDKで作ってみました。
やってみた
CDKコード
import * as cdk from '@aws-cdk/core'; import * as sfn from '@aws-cdk/aws-stepfunctions'; import * as tasks from '@aws-cdk/aws-stepfunctions-tasks'; export class AwsCdkAppStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); //Mapステート const sendingMap = new sfn.Map(this, 'SendingMap', { itemsPath: sfn.JsonPath.stringAt('$.mapped'), parameters: { 'mapped.$': '$$.Map.Item.Value', 'messageAttributes.$': '$.common.messageAttributes', }, }); //SMS送信タスク const sendingSMSTask = new tasks.CallAwsService(this, 'SendingSMSTask', { service: 'sns', action: 'publish', parameters: { 'PhoneNumber.$': '$.mapped.phoneNumber', 'Message.$': '$.mapped.message', 'MessageAttributes.$': '$.messageAttributes', }, iamResources: ['*'], iamAction: 'sns:Publish', }); //MAPのイテレーターにSMS送信タスクを指定 sendingMap.iterator(sendingSMSTask); //ステートマシン new sfn.StateMachine(this, 'stateMachine', { definition: sendingMap, }); } }
- sendingSMSTaskではAWS SDKのAPIのパラメーターを直接指定する必要があるため
CallAwsService
を使用しています。tasks.SnsPublish
ではPhoneNumber
プロパティを指定できません。 - また、発行先のSNSトピックの指定はないため、
iamResources
は空で問題ありません。
cdk deploy
してデプロイします。
するとステートマシンが作成できました。
ステートマシン定義は以下のようになります。前回Workflow Studioで作成したものと同じですね。
{ "StartAt": "SendingMap", "States": { "SendingMap": { "Type": "Map", "End": true, "Parameters": { "mapped.$": "$$.Map.Item.Value", "messageAttributes.$": "$.common.messageAttributes" }, "Iterator": { "StartAt": "SendingSMSTask", "States": { "SendingSMSTask": { "End": true, "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:sns:publish", "Parameters": { "PhoneNumber.$": "$.mapped.phoneNumber", "Message.$": "$.mapped.message", "MessageAttributes.$": "$.messageAttributes" } } } }, "ItemsPath": "$.mapped" } } }
動作
作成されたステートマシンで下記のJSONを入力としてステートマシンを実行します。(都合により同じ宛先に2回送っています)
{ "mapped": [ { "message": "おはようございます。", "phoneNumber": "+8180XXXXXXXX" }, { "message": "こんばんは。", "phoneNumber": "+8180XXXXXXXX" } ], "common": { "messageAttributes": { "AWS.SNS.SMS.SenderID": { "DataType": "String", "StringValue": "classmedhod" } } } }
ステートマシンの実行が成功しました。
宛先の電話番号で2通のメッセージを受信できています。
まとめ
AWS Step FunctionsのステートマシンからMapステートを使用して複数のSMSメッセージを送信する構成を、AWS CDKで作ってみました。
CDKやCloudFormationでステートマシンを作ったことが無かったのですが、Mapステートの使用とSMSの送信部分がクリアになってよかったです。
参考
- AWS Step Functionsから直接Amazon SNSを使用してSMSのメッセージを送信をする | DevelopersIO
- class Map (construct) · AWS CDK
- サーバーレスワークフローをTypeScriptで作成しよう 〜Step FunctionsとCDKによるLambdaの実行順序制御入門〜 - Qiita
- Lambdaを使わずStep FunctionsでNature Remo Cloud APIのデータを収集する | DevelopersIO
以上