Serverless Framework で Step Functions を設定する
										エンジニアの内山です。参加する予定だったイベントが、コロナの影響でことごとく中止になってしまいました。早く終息すると良いですね。
今回は、Serverless Frameworkを使用して、Step Functionsのステートマシンを作成する方法をご紹介します。
サンプルプログラムは以下に置いてあります。
https://github.com/memememomo/sls-step-functions-sample
DockerとServerless Frameworkをインストールしていることが前提です。
Docker
https://www.docker.com/
Serverless Framework
https://serverless.com/
プロジェクトディレクトリの作成
まずは、プロジェクト用のディレクトリを作成します。
$ mkdir sls-step-functions-sample
$ cd sls-step-functions-sample
Dockerの設定ファイル作成と初期化
Serverless FrameworkをDockerで実行するための設定ファイルを作成します。
version: '3'
services:
  sls:
    build:
      context: ./
      dockerfile: Dockerfile
    volumes:
      - .:/opt/app
    env_file:
      - aws-credentials
FROM amaysim/serverless:1.60.0
WORKDIR /opt/app
COPY . /opt/app/
設定ファイルを作成したら、 docker-composeコマンドでビルドします。
$ docker-compose build
ServerlessFrameworkの初期化
Dockerコンテナ
上で、ServerlessFrameworkの初期化コマンドを実行します。
$ docker-compose run sls sls create -t aws-nodejs
$ docker-compose run sls npm init -y
ServerlessFrameworkのプラグインインストール
Step Functionsの設定をするために、プラグインをインストールする必要があります。以下のように、必要なプラグインをインストールします。
$ docker-compose run sls npm install -D serverless-pseudo-parameters
$ docker-compose run sls npm install -D serverless-step-functions
Step Functionsプラグインの他に、疑似パラメーターを使用できるようになるプラグインもインストールしています。このプラグインにより、 #{AWS::AccountId} や #{AWS::Region} などのパラメーターが設定ファイル上で使用できるようになります。
これらのプラグインを有効にするため、Serverless Frameworkの設定ファイルに追記します。
plugins:
  - serverless-step-functions
  - serverless-pseudo-parameters
サンプル用のプログラムを作成
以下のように、hello と world をそれぞれ返す関数を定義します。
'use strict';
module.exports.hello = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Hello',
      },
      null,
      2
    ),
  };
};
module.exports.world = async event => {
    return {
        statusCode: 200,
        body: JSON.stringify(
            {
                message: 'World',
            },
            null,
            2
        ),
    }
};
これらのLambda関数を作成するために、Serverless Frameworkの設定ファイルに追記します。
functions:
  hello:
    name: hello
    handler: handler.hello
  world:
    name: world
    handler: handler.world
Step Functionsのステートマシンの設定
Step Functionsのステートマシンは正式にはJSONで定義するのですが、Serverless Frameworkの設定ファイルではYAMLで以下のように定義します。
stepFunctions:
  stateMachines:
    HelloWorld:
      name: hello-world
      definition:
        StartAt: Hello
        States:
          Hello:
            Type: Task
            Resource: arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:hello
            Next: World
          World:
            Type: Task
            Resource: arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:world
            End: true
helloとworldを順番に実行するステートマシンを定義しています。

デプロイと実行
以上で、ひととおりの設定が終わったので、以下のコマンドでデプロイします。
$ docker-compose run sls sls deploy
コマンドの実行が終わると、AWS上のStep Functionsのステートマシンが作成されます。「実行の開始」ボタンを押して実行すると、ステートマシンが正常に実行されることが確認できます。

以上が、Step Functionsの設定の流れとなります。
おわりに
Serverless Frameworkで、Step Functionsの設定を行う方法をご紹介しました。とっかかりとして、参考にしていただければ幸いです。
