serverless-step-functionsでネストしたワークフローを実行する
Step FunctionsからStep Fuctionsを実行するネストワークフローをServerless Frameworkで設定する方法についての覚書です。 Note:バージョンに注意 GitHubのIssueで可 […]
目次
Step FunctionsからStep Fuctionsを実行するネストワークフローをServerless Frameworkで設定する方法についての覚書です。
Note:バージョンに注意
GitHubのIssueで可能になったことを知ったパターンですが、古いバージョンを使い続けているとこの方法は使えません。Issue のやりとりを読み返す限りだと、2.14.0以降である必要がありそうです。
Can you try again against the latest v2.14.0? It now supports one IAM role per state machine and should fix the circular dependency you saw before
https://github.com/horike37/serverless-step-functions/issues/273#issuecomment-568403855
sls deploy
で以下のようなエラーが出た時は、高確率でバージョンが古いですのでpackage.json
を確認しましょう。
Error --------------------------------------------------
Error: The CloudFormation template is invalid: Circular dependency between resources: [IamRoleStateMachineExecution, ChildStateMachineStepFunctionsStateMachine, YourCatchMachineStepFunctionsStateMachine, ParentStateMachineStepFunctionsStateMachine]
簡単なStep Functionsを2つ作成した例
簡単なサンプルを用意しました。
service:
name: nested-step-functions
plugins:
- serverless-step-functions
provider:
name: aws
runtime: nodejs10.x
logRetentionInDays: 14
region: us-east-1
# 呼び出すLambdaは便宜上1つにする
functions:
test:
handler: handler.test
stepFunctions:
stateMachines:
# 親から呼ばれる側のState Machine
ChildStateMachine:
definition:
Comment: "Child state machine"
StartAt: Hello
States:
Hello:
Type: Task
Resource:
Fn::GetAtt: [test, Arn]
End: true
# ChildStateMachineを呼び出すState Machine
ParentStateMachine:
definition:
Comment: "Parent state machine"
StartAt: HelloKids
States:
HelloKids:
Type: Task
Resource:
Fn::GetAtt: [test, Arn]
Next: CallKids
CallKids:
Type: Task
Resource: "arn:aws:states:::states:startExecution.sync"
Parameters:
StateMachineArn:
Ref: ChildStateMachineStepFunctionsStateMachine
Input:
AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$: "$.Execution.Id"
End: true
パラメーターについての参考記事: https://dev.classmethod.jp/cloud/aws/step-functions-update-nest/
StateMachineを呼びだす部分について
StateのTypeはLambda同様にTaskを指定します。Resourcesで特定の文字列を設定し、Parametersに対象のARNやExecution IDなどを渡すように設定してやりましょう。