AWS Step FunctionsステートマシンからMapステートを使用して複数のSMSメッセージを送信する(AWS CDK)

2021.10.30

こんにちは、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の送信部分がクリアになってよかったです。

参考

以上