AWS Step Functionsの新しい組み込み関数States.UUIDを使ってDynamoDBアイテムやS3オブジェクトを作ってみる(AWS CDK)

2022.09.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部 IoT事業部の若槻です。

本日のアップデートで、AWS Step Functionsで追加で14個の組み込み関数が使えるようになりました。嬉しいですね。便利なStep Functionsがますます便利になっていきます。

それぞれ活用できる場面がありそうですが、本記事ではUUIDを取得できるStates.UUIDを試してみたいと思います。これにより例えばデータベースやバケットに新規作成するデータのID値にUUIDが欲しい場合にLambda関数など使わず簡単に作成することができるようになります。

そこで今回は、AWS Step Functionsの新しい組み込み関数States.UUIDを使って、DynamoDBアイテムやS3オブジェクトを新規作成する実装をAWS CDKで作ってみました。

※ちなみに追加された14個の関数を詳しく知りたい方は公式ドキュメントもしくは社内でのんピが速報記事内で分かりやすく紹介しているのでご覧ください。

やってみる

実装

AWS CDK v2(TypeScript)で次のようなCDKスタックを作成します。

lib/aws-cdk-app-stack.ts

import {
  aws_dynamodb,
  aws_s3,
  aws_stepfunctions,
  aws_stepfunctions_tasks,
  Stack,
  StackProps,
  RemovalPolicy,
} from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class AwsCdkAppStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    // DynamoDB Table
    const dataTable = new aws_dynamodb.Table(this, 'dataTable', {
      tableName: 'dataTable',
      partitionKey: {
        name: 'id',
        type: aws_dynamodb.AttributeType.STRING,
      },
      billingMode: aws_dynamodb.BillingMode.PAY_PER_REQUEST,
      removalPolicy: RemovalPolicy.DESTROY,
    });

    // S3 Bucket
    const s3Bucket = new aws_s3.Bucket(this, 's3Bucket', {
      removalPolicy: RemovalPolicy.DESTROY,
    });

    // UUIDの取得
    const getUuidPass = new aws_stepfunctions.Pass(this, 'getUuidPass', {
      parameters: {
        'uuid.$': 'States.UUID()',
      },
    });

    // Dynamodb PutItem
    const putItemTask = new aws_stepfunctions_tasks.DynamoPutItem(
      this,
      'putItemTask',
      {
        table: dataTable,
        item: {
          id: aws_stepfunctions_tasks.DynamoAttributeValue.fromString(
            aws_stepfunctions.JsonPath.stringAt('$.uuid')
          ),
          value:
            aws_stepfunctions_tasks.DynamoAttributeValue.fromString('hogehoge'),
        },
        resultPath: aws_stepfunctions.JsonPath.DISCARD,
      }
    );

    // S3 Put Object
    const putObjectTask = new aws_stepfunctions_tasks.CallAwsService(
      this,
      'putObjectTask',
      {
        service: 's3',
        action: 'putObject',
        parameters: {
          Body: 'hogehoge',
          Bucket: s3Bucket.bucketName,
          Key: aws_stepfunctions.JsonPath.stringAt('$.uuid'),
          ContentType: 'application/json',
        },
        iamResources: [`${s3Bucket.bucketArn}/*`],
        iamAction: 's3:PutObject',
        resultPath: aws_stepfunctions.DISCARD,
      }
    );

    // State Machine
    new aws_stepfunctions.StateMachine(this, 'myStateMachine', {
      stateMachineName: 'myStateMachine',
      definition: getUuidPass.next(putItemTask).next(putObjectTask),
    });
  }
}
  • States.UUID()により取得UUIDを、後続のDynamodb:PutItemやS3:PutObjectを実行するタスクで使用しています。
    • 現在のCDKパッケージを最新版(2.40.0)にアップデートしてみましたが、aws_stepfunctions.JsonPathモジュールではまだ今回追加された14の組み込み関数は未対応のようです。なので{'uuid.$': 'States.UUID()'}という書き方としています。
  • 以前までならStep Functionsの中でUUIDを取得したい場合は、TaskからLambda関数を実行してその戻り値を取得する必要がありました。
    • AWS CDKでの実装であればEvaluateExpression classで多少はコードの記述量を削減できますが、Lambda関数を利用することには変わりないため、UUID取得の操作のためだけに余分なLambda関数リソースが作られるという点では同じでした。

上記をCDK Deployしてスタックをデプロイすると、次の定義のState Machineが作成されます。

Definition

{
  "StartAt": "getUuidPass",
  "States": {
    "getUuidPass": {
      "Type": "Pass",
      "Parameters": {
        "uuid.$": "States.UUID()"
      },
      "Next": "putItemTask"
    },
    "putItemTask": {
      "Next": "putObjectTask",
      "Type": "Task",
      "ResultPath": null,
      "Resource": "arn:aws:states:::dynamodb:putItem",
      "Parameters": {
        "Item": {
          "id": {
            "S.$": "$.uuid"
          },
          "value": {
            "S": "hogehoge"
          }
        },
        "TableName": "dataTable"
      }
    },
    "putObjectTask": {
      "End": true,
      "Type": "Task",
      "ResultPath": null,
      "Resource": "arn:aws:states:::aws-sdk:s3:putObject",
      "Parameters": {
        "Body": "hogehoge",
        "Bucket": "awscdkappstack-s3bucket6575f0a6-b0puoqzcmfuc",
        "Key.$": "$.uuid",
        "ContentType": "application/json"
      }
    }
  }
}

動作確認

作成されたState Machineを実行します。

実行が成功しました。getUuidPassステートでUUIDが取得できていますね。

そして取得したUUIDが後続の2つのタスクで利用できています!

おわりに

AWS Step Functionsの新しい組み込み関数States.UUIDを使って、DynamoDBアイテムやS3オブジェクトを新規作成する実装をAWS CDKで作ってみました。

かゆいところに手が届くアップデートでしたね。Step Functionsのポテンシャルがますます大きなものになっていきます。

参考

以上