チュートリアルとして、ある関数 A が "Hello" と返し、関数 B は "World" と event.result の値を結合するといった簡単な関数の協調動作を実現したいとします。
そのとき関数 A は以下のように定義します。
def lambda_handler(_, __): return { 'result': 'hello' }
関数 B は以下のように定義します。
def lambda_handler(e, _): result = e['result'] + 'world' return { 'result': result }
関数 A → 関数 B という順番で単純に実行する State Machine は以下のように定義できます。
{ "Comment": "A state machine that does mock stock trading.", "StartAt": "InvokeHello", "States": { "InvokeHello": { "Type": "Task", "Resource": "${HelloFunction}", "Next": "InvokeWorld" }, "InvokeWorld": { "Type": "Task", "Resource": "${WorldFunction}", "End": true } } }
最後に、Lambda, Step Functions リソースを SAM テンプレートに定義してデプロイすればおしまいです。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > hello-world python 3.8 Resources: HelloFunction: Type: AWS::Serverless::Function Properties: Timeout: 10 Runtime: python3.8 CodeUri: functions/hello/ Handler: app.lambda_handler HelloFunctionLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub /aws/lambda/${HelloFunction} RetentionInDays: 1 WorldFunction: Type: AWS::Serverless::Function Properties: Timeout: 10 Runtime: python3.8 CodeUri: functions/world/ Handler: app.lambda_handler WorldFunctionLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub /aws/lambda/${WorldFunction} RetentionInDays: 1 HelloWorldStateMachine: Type: AWS::Serverless::StateMachine Properties: Name: HelloWorldStateMachine DefinitionUri: statemachine/hello_world.asl.json DefinitionSubstitutions: HelloFunction: !GetAtt HelloFunction.Arn WorldFunction: !GetAtt WorldFunction.Arn Policies: - LambdaInvokePolicy: FunctionName: !Ref HelloFunction - LambdaInvokePolicy: FunctionName: !Ref WorldFunction
ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです