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

こんにちは。サービスグループの武田です。前回AWS CDKを利用して、AWS Step Functionsのチュートリアルをやってみました。ツールの違いによる構築方法の比較をしたかったため、同じ環境をServerless Frameworkを利用して構築してみました。
2021.10.28

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

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

前回AWS CDKを利用して、AWS Step Functionsのチュートリアルをやってみました。ツールの違いによる構築方法の比較をしたかったため、同じ環境をServerless Frameworkを利用して構築してみました。ただし厳密にはまったく同じではなく、CDKで自動的に設定している部分などまでは追従していません。

環境

次のような環境で検証しました。

$ node -v
v14.18.1

$ npm -v
8.1.1

$ sw_vers
ProductName:	macOS
ProductVersion:	11.4
BuildVersion:	20F71
  • Serverless Framework
    • 2.64.1
  • Serverless Step Functions
    • 3.1.1

やってみた

まずはServerless Frameworkのプロジェクトを作成します。Lambda関数はPythonでもよかったのですがJavaScript(Node.js)にしてみました。プロジェクトが作成できたらStep Functions用のプラグインもインストールします。

$ npx serverless create -t aws-nodejs -n step-sls -p step-sls
$ cd step-sls
$ npm install -D serverless-step-functions

プラグインをインストールしたらserverless.ymlに設定を追記します。ファイルのコード全体は後ろに記載します。

serverless.yml

plugins:
  - serverless-step-functions

Lambda関数のひな型がhandler.jsとして用意されているため、Step Functionsのタスク状態から呼び出されるコードを定義します。

handler.js

'use strict';

module.exports.handler = async (event) => {
  return "Hello World!";
};

続いてステートマシンの定義なども含めserverless.ymlを次のように修正します。stepFunctionsのセクションでステートマシンを定義しています。

serverless.yml

service: step-sls

frameworkVersion: '2'

plugins:
  - serverless-step-functions

provider:
  name: aws
  runtime: nodejs14.x
  lambdaHashingVersion: 20201221
  region: ap-northeast-1

functions:
  hello:
    handler: handler.handler
    timeout: 25

stepFunctions:
  stateMachines:
    StateMachine1:
      name: SlsStateMachine
      definition:
        StartAt: HelloWorld
        States:
          HelloWorld:
            Type: Task
            Resource:
              Fn::GetAtt: [hello, Arn]
            Next: GreetedWorld
          GreetedWorld:
            Type: Succeed

準備が整いましたのでデプロイしてみましょう。筆者の環境ではprofileにIAMロールを使用しているため、環境変数を定義しています。

$ export AWS_SDK_LOAD_CONFIG=1
$ npx serverless deploy

また実行もコマンドラインから行えます。グローバルにインストールしていないことが原因なのか、レスポンスの内容が正常に表示されませんでした。

$ npx serverless invoke stepf --name StateMachine1
.
[object Object]

マネジメントコンソールにアクセスしてみると正常に終了していることが確認できました。ResultPathなどを定義していないため、HelloWorld状態の結果のみが入力値となっています。

まとめ

AWS CDKで構成したものをServerless Frameworkでもやってみました。IAMロールの作成はどちらも自動的にやってくれるため意識する必要はありませんでした。ステートマシンの定義はCDKだとコードでしたが、Serverless Frameworkの場合はASL(Amazon ステートメント言語)を直接書くことになります。

CDKを採用する場合、CDKのコーディングに慣れていればステートマシンのメンテナンスも負荷が軽そうです。一方で、Workflow Studioで作ったものをベースにメンテナンスしていきたいといった場合にはServerless Frameworkに分があるでしょうか。なお、前回のCDKではLambda関数のコードをインラインで記述していましたが、別ファイルにもできるため、そこは差別化ポイントとはならないと考えます。

どちらもメリットはありますので、メンバーのスキルセットや好みで選ぶでもよさそうです。