Serverless Framework で Step Functions を設定する


はじめに

今回はServerless Frameworkを使用して、Step Functionsのステートマシンを作成する方法をご紹介します。

今回ご紹介する方法は、Serverless FrameworkをDockerコンテナ上で実行する形にしています。

今回のサンプルプログラムは以下に置いてあります。
https://github.com/memememomo/sls-step-functions-sample

プロジェクトディレクトリの作成

まずは、プロジェクト用のディレクトリを作成します。

プロジェクトディレクトリを作成
$ mkdir sls-step-functions-sample
$ cd sls-step-functions-sample

Dockerの設定ファイル作成と初期化

Serverless FrameworkをDockerで実行するための設定ファイルを作成します。

docker-compose.yml
version: '3'
services:
  sls:
    build:
      context: ./
      dockerfile: Dockerfile
    volumes:
      - .:/opt/app
    env_file:
      - aws-credentials
Dockerfile
FROM amaysim/serverless:1.60.0
WORKDIR /opt/app
COPY . /opt/app/

設定ファイルを作成したら、 docker-composeコマンドでビルドします。

ServerlessFrameworkの初期化
$ docker-compose build

ServerlessFrameworkの初期化

Dockerコンテナ
上で、ServerlessFrameworkの初期化コマンドを実行します。

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の設定ファイルに追記します。

serverless.yml
plugins:
  - serverless-step-functions
  - serverless-pseudo-parameters

サンプル用のプログラムを作成

以下のように、helloworld をそれぞれ返す関数を定義します。

handler.js
'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の設定ファイルに追記します。

serverless.yml
functions:
  hello:
    name: hello
    handler: handler.hello
  world:
    name: world
    handler: handler.world

Step Functionsのステートマシンの設定

Step Functionsのステートマシンは正式にはJSONで定義するのですが、Serverless Frameworkの設定ファイルではYAMLで以下のように定義します。

serverless.yml
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の設定を行う方法をご紹介しました。とっかかりとして、参考にしていただければ幸いです。