こんにちは、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()'}
という書き方としています。
- 現在のCDKパッケージを最新版(
- 以前までなら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のポテンシャルがますます大きなものになっていきます。
参考
以上