この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部 IoT事業部の若槻です。
前回のエントリでは、Step Functions Workflow Studioを使用して複数のSMSメッセージを送信するステートマシンを作成しました。
今回は、同じくAWS Step FunctionsのステートマシンからMapステートを使用して複数のSMSメッセージを送信する構成を、AWS CDKで作ってみました。
やってみた
CDKコード
lib/aws-cdk-app-stack.ts
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
以上