AWS CDK v2.85.0 で AWS Step Functions ステートマシンを ASL JSON から作成可能になりました
こんにちは、CX事業本部 Delivery部の若槻です。
AWS CDK v2.85.0 で、AWS Step Functions ステートマシンを ASL(Amazon States Language )JSON から作成可能になりました。
今までは aws_stepfunctions および aws_stepfunctions_tasks モジュールを使用して Chain を作成する必要がありましたが、今後は ASL JSON という選択肢も増えることになります。ASL JSON はマネジメントコンソールや AWS CloudFormation から作成する際に直接操作するものであったため、こちらの方が馴染みのある方も多いのではないでしょうか。
試してみた
CDK ライブラリのアップデート
CDK ライブラリを最新バージョンにアップグレードします。
npm install aws-cdk aws-cdk-lib
アップグレードできました。
{ "devDependencies": { - "aws-cdk": "^2.84.0", + "aws-cdk": "^2.85.0", }, "dependencies": { - "aws-cdk-lib": "^2.84.0", + "aws-cdk-lib": "^2.85.0", } }
ASL JSON からステートマシンを作成
ASL JSON の文字列を直接指定した場合と、ファイルで指定した場合でステートマシンを作成してみます。今回のアップデートで追加された DefinitionBody クラスの fromFile
および fromString
メソッドをそれぞれ使用します。
import { aws_stepfunctions as sfn, Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class CdkSampleStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); const definitonBody = { StartAt: 'Pass', States: { Pass: { Type: 'Pass', End: true } }, }; // ASL JSON 文字列から作成 new sfn.StateMachine(this, 'StateMachineFromString', { stateMachineName: 'StateMachineFromString', definitionBody: sfn.DefinitionBody.fromString( JSON.stringify(definitonBody) ), }); // ASL JSON ファイルから作成 new sfn.StateMachine(this, 'StateMachineFromFile', { stateMachineName: 'StateMachineFromFile', definitionBody: sfn.DefinitionBody.fromFile('./asl.json', {}), }); } }
fromFile()
で読み込む ASL JSON ファイルです。
{ "StartAt": "Pass", "States": { "Pass": { "Type": "Pass", "End": true } } }
CDK デプロイを実行します。
文字列から作成したステートマシンが作成されました。
また、ファイルから作成したステートマシンが作成されました。
API アクションを実行するステートマシンを作成する場合、明示的に権限の付与が必要
ここで、AWS サービスを API アクションで実行するステートマシンを AWS SJON から作成した場合に、権限がどうなるのか気になりました。
次のように、Lambda 関数を実行するステートマシンを ASL JSON から作成してみます。
import { aws_lambda_nodejs, aws_stepfunctions as sfn, Stack, StackProps, } from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class CdkSampleStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); // Lambda 関数 const sampleFunc = new aws_lambda_nodejs.NodejsFunction( this, 'sampleFunc', { functionName: 'myFunction', } ); // Lambda 関数を実行する ASL JSON const definitonBody = { StartAt: 'Lambda Invoke', States: { 'Lambda Invoke': { Type: 'Task', Resource: 'arn:aws:states:::lambda:invoke', Parameters: { FunctionName: sampleFunc.functionName, }, End: true, }, }, }; // ASL JSON 文字列からステートマシンを作成 new sfn.StateMachine(this, 'StateMachineFromString', { stateMachineName: 'StateMachineFromString', definitionBody: sfn.DefinitionBody.fromString( JSON.stringify(definitonBody) ), }); } }
作成されたリソース一覧を見ると、ステートマシンの実行ロールが作成されています。
しかしロールの権限内容を確認すると、ポリシーが何も付与されていません。
よって、ステートマシンを実行すると Lambda 関数の実行権限が無いためエラーになります。
そこで Lambda 関数の実行権限をステートマシンに明示的に付与します。
// ASL JSON 文字列からステートマシンを作成 const StateMachineFromString = new sfn.StateMachine( this, 'StateMachineFromString', { stateMachineName: 'StateMachineFromString', definitionBody: sfn.DefinitionBody.fromString( JSON.stringify(definitonBody) ), } ); sampleFunc.grantInvoke(StateMachineFromString);
実行ロールに適切なポリシーが付与されます。
ステートマシンを実行すると Lambda 関数が実行されるようになります。
ASL JSON から作成した場合は、今までのモジュールによる構築時とは異なり、実行ロールの権限がよしなに付与されないので、注意が必要そうです。
おわりに
AWS CDK v2.85.0 で AWS Step Functions ステートマシンを ASL JSON から作成可能になったので試してみました。
aws_stepfunctions および aws_stepfunctions_tasks モジュールによるワークフローの構築はかなり癖があるので、今回のアップデートによる ASL JSON による構築のサポートにより、AWS CDK による AWS Step Functions のワークフロー構築の敷居が下がったのではないでしょうか。
以上