AWS CDKを用いたAWS Step Functionsステートマシン作成のチュートリアルをやってみた

こんにちは。サービスグループの武田です。今回はAWS公式ドキュメントで提供されている、AWS Step FunctionsのステートマシンをAWS CDKで作成するチュートリアルをやってみました。
2021.10.26

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

こんにちは。サービスグループの武田です。

今回はAWS公式ドキュメントで提供されている、AWS Step FunctionsのステートマシンをAWS CDKで作成するチュートリアルをやってみました。

次のポリシーで進めます。おおむね筆者の好みです。

  • aws-cdkはローカルにインストール
  • 言語はTypeScriptを選択
  • Lambdaのランタイムは最新を使用

環境

次のような環境で実施しました。

$ node -v
v14.18.1

$ npm -v
8.1.1

$ sw_vers
ProductName:	macOS
ProductVersion:	11.4
BuildVersion:	20F71

やってみた

まずはプロジェクトを作成し、必要なモジュールなどをインストールします。

$ mkdir step && cd $_
$ npx cdk init --language typescript
$ npm install @aws-cdk/aws-lambda @aws-cdk/aws-stepfunctions @aws-cdk/aws-stepfunctions-tasks

プロジェクトのひな型ができたので、スタックファイルにLambda関数およびStep Functionsのステートマシンを定義します。TypeScriptのコードでステートマシンを定義しているのが新鮮でしょうか。

lib/step-stack.ts

import * as cdk from "@aws-cdk/core";
import * as lambda from "@aws-cdk/aws-lambda";
import * as sfn from "@aws-cdk/aws-stepfunctions";
import * as tasks from "@aws-cdk/aws-stepfunctions-tasks";

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

    const helloFunction = new lambda.Function(this, "MyLambdaFunction", {
      code: lambda.Code.fromInline(`
          exports.handler = (event, context, callback) => {
            callback(null, "Hello World!");
          };
      `),
      runtime: lambda.Runtime.NODEJS_14_X,
      handler: "index.handler",
      timeout: cdk.Duration.seconds(25),
    });

    const stateMachine = new sfn.StateMachine(this, "MyStateMachine", {
      definition: new tasks.LambdaInvoke(this, "MyLambdaTask", {
        lambdaFunction: helloFunction,
      }).next(new sfn.Succeed(this, "GreetedWorld")),
    });
  }
}

準備できたらこれらをデプロイします。ただそのままですとus-east-1にデプロイしてしまうため、ap-northeast-1にデプロイされるように少し修正します。

bin/step.ts

#!/usr/bin/env node
import "source-map-support/register";
import * as cdk from "@aws-cdk/core";
import { StepStack } from "../lib/step-stack";

const app = new cdk.App();
new StepStack(app, "StepStack", {
  env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: "ap-northeast-1" },
});

修正できたらデプロイしましょう。必要なIAMロールなども自動で作成されとても便利。

$ npx cdk deploy

マネジメントコンソールでStep Functionsのページに行ってみると、次のようなステートマシンが作成されています。

ステートマシンを実行してしばらく待つと成功しました。Lambda関数の実行結果も次の状態に渡されています。

最後に環境を削除しましょう。次のコマンドですべてのリソースが削除されます。

$ npx cdk destroy

まとめ

Step Functionsのステートマシン構築は今回のようにCDKで行うほかに、Workflow Studioを使ってGUIでも可能です。CDKを採用するメリットは環境構築から一貫してコードで管理できることです。しかしコードでステートマシンを定義するのは賛否ある部分かと思われます。IaCとの兼ね合いもありますので、自分たちのプロジェクトに合った方法を採用したいですね。