[AWS CDK] Step Functions の EvaluateExpression Task の Lambda ランタイムで Node.js 18.x が使えるようになりました

2023.04.17

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

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

昨年11月に AWS Lambda ランタイムに Node.js 18.x が追加されました。

Node.js は 2022年10月より 16.x が Maintenance LTS となり、18.x が Active LTS となったため、今後は 18.x の利用が推奨されます。

そしてこのたびの AWS CDK のアップデートにより、v2.74.0 より AWS Step FunctionsEvaluateExpression コンストラクトクラスの Lambda ランタイムでも Node.js 18.x がついに利用可能となりました。

Features
- stepfunctions-tasks: Node.js 18.x runtime for EvaluateExpression (#25002) (f26bfe9)

EvaluateExpression コンストラクトクラスは、指定された JavaScript 表現の評価結果を返す Step Functions Task です。簡単な処理をワークフロー中で実行させたい場合にわざわざ Lambda 関数を明示的に実装する必要がないためとても便利です。

試してみた

ソースコードを見てみる

まず、node_modules より CDK の TypeScript ソースコードを見てみると、CDK ライブラリのアップグレード後も既定の Lambda ランタイムは Node.js 14 となっています。

node_modules/aws-cdk-lib/aws-stepfunctions-tasks/lib/evaluate-expression.d.ts

import { Construct } from 'constructs';
import * as iam from '../../aws-iam';
import * as lambda from '../../aws-lambda';
import * as sfn from '../../aws-stepfunctions';
/**
 * Properties for EvaluateExpression
 *
 */
export interface EvaluateExpressionProps extends sfn.TaskStateBaseProps {
    /**
     * The expression to evaluate. The expression may contain state paths.
     *
     * Example value: `'$.a + $.b'`
     */
    readonly expression: string;
    /**
     * The runtime language to use to evaluate the expression.
     *
     * @default lambda.Runtime.NODEJS_14_X
     */
    readonly runtime?: lambda.Runtime;
}

この既定のランタイムは CDK ライブラリのアップグレード後も Node.js 14 のままでした。よって、EvaluateExpression Task で Node.js 18.x を使いたい場合はプロパティでランタイムを明示的に指定する必要があるようです。

CDK ライブラリをアップグレードしなければ Node.js 18.x は指定不可

試しに CDK ライブラリをアップグレードする前に Node.js 18.x EvaluateExpression Task のランタイムとして指定してみます。

lib/cdk-sample-app.ts

import { Construct } from 'constructs';
import {
  aws_stepfunctions,
  aws_stepfunctions_tasks,
  Stack,
  StackProps,
} from 'aws-cdk-lib';
import { Runtime } from 'aws-cdk-lib/aws-lambda';

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

    // EvaluateExpression
    const evaluateExpressionTask =
      new aws_stepfunctions_tasks.EvaluateExpression(
        this,
        'EvaluateExpressionTask',
        {
          expression: '[1, 2, 3, 4, 5].map(num => num * 2)',
          runtime: Runtime.NODEJS_18_X,
          resultPath: '$.EvaluateExpressionTaskOutput',
        }
      );

    new aws_stepfunctions.StateMachine(this, 'StateMachine', {
      definition: evaluateExpressionTask,
    });
  }
}

上記を CDK デプロイしようとすると、想定通りエラーとなりました。

Error: The runtime nodejs18.x is currently not supported.
    at createEvalFn (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk-lib/aws-stepfunctions-tasks/lib/evaluate-expression.js:1:2239)

CDK ライブラリのアップグレード

CDK ライブラリ(aws-cdkaws-cdk-lib)を v2.74.0 にアップグレードします。

npm i aws-cdk aws-cdk-lib

アップグレードされました。

package.json

{
  "devDependencies": {
-    "aws-cdk": "^2.72.0",
+    "aws-cdk": "^2.74.0",
  },
  "dependencies": {
-    "aws-cdk-lib": "^2.72.0",
+    "aws-cdk-lib": "^2.74.0",
  }
}

CDK ライブラリをアップグレードすれば Node.js 18.x は指定可能

CDK ライブラリのアップグレード後であれば EvaluateExpression Task のランタイムとして Node.js 18.x を指定できることを確認してみます。

前述の実装の CDK 実装のデプロイを試みると、今度は正常にデプロイできました。EvaluateExpression の Lambda 関数も作成されています。

Lambda 関数のランタイム設定を見ると、Node.js 18.x が指定されています!

また、State Machine を実行すると EvaluateExpression Task が正常に実行され、評価結果が出力されています。

ちゃんと Node.js 18.x ランタイムで EvaluateExpression Task が動作していることが確認できました。

参考

以上