🐯

Serverless Framework上で定義したステートマシンから別のステートマシンを呼び出す時の書き方

2022/01/04に公開

はじめに

あけましておめでとうございます、クラスメソッド AWS事業本部の筧です。

Serverless Framework には AWS Step Functions 用の ServerlessFramework プラグイン
serverless-step-functions が用意されています。serverless-step-functionsを利用することでstepFunctions.stateMachinesにステートマシンを定義ができます。

ところでstepFunctions.stateMachinesで定義したステートマシンから別のステートマシンを呼び出すにはどのように書けば良いのでしょうか。単純に言えば、別のステートマシンのARNを書けば良さそうです。しかし、別のステートマシンのARNをべた書きするのではなく、serverless.ymlの情報を参照させながらARNを書きたいとなると、少し悩むかと思います。

今回は上記を実際にやってみたのでやり方をご紹介します!

やってみた

まずserverless.ymlにステートマシンを直接定義すると、見にくくなるので別ファイルincludes/state-machines.ymlに外だししておきます。

serverless.yml(抜粋)
# 呼び出し元のステートマシンを定義
stepFunctions: ${file(includes/state-machines.yml)}

以下のように書くことで、別のステートマシンのARNをべた書きするのではなく、serverless.ymlの情報を参照させながらARNを書くことができました。

serverless.yml(抜粋)
provider:
  stage: ${opt:stage, 'dev'}

#・・・(省略)

custom:
  sampleService:
    #呼び出し先のステートマシンを定義
    prod:
      STATEMACHINE_ARN: "ステートマシンARN"
    stg:
      STATEMACHINE_ARN: "ステートマシンARN"
    dev:
      STATEMACHINE_ARN: "ステートマシンARN"

#・・・(省略)

#呼び出し元のステートマシンを定義
stepFunctions: ${file(includes/state-machines.yml)}
includes/state-machines.yml(抜粋)
KickOtherStateMachine:
  Type: Task
  Resource: arn:aws:states:::states:startExecution
  Parameters:
    Input:
      param.$: $
    StateMachineArn: ${self:custom.sampleService.${opt:stage}.STATEMACHINE_ARN}
  End: true

あとがき

別のステートマシンのARNをべた書きするのではなく、serverless.ymlの情報を参照させながらARNを書くことで、「hoge環境のステートマシンからは別のステートマシンのhoge環境を呼び出す」みたいなことを1つのファイルで実現できるかと思います。

それではまた!

Discussion