SAM で Step Functions リソースを定義する
2020/12/19 19:05
2024/12/30 17:54
これはなに
- 2020/5/27 に SAM が Step Functions リソースをサポートしたので、リソース定義の流れを確認しておくメモ
- シンプルな機能を持つ Lambda 関数を数珠つなぎにして、大きなアプリケーションを構成するときに Lambda から Lambda、あるいは Lambda, から SNS, SQS などを通して Lambda を起動するよりも、Step Functions を用いたほうがワークフローが明確で、処理の流れがコードを見ずに理解できる
- ステートマシンから直接 DynamoDB テーブルの読み書きも可能なのでそのあたりのコード書かなくてすむのでやっぱりサーバーレスアプリケーションを構成するときにはかなり有用
Lambda 関数の作成
チュートリアルとして、ある関数 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
}
Step Functions State Machine の定義
関数 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
}
}
}
SAM テンプレートの定義
最後に、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
Pinned Articles
About
ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです
Tags
JavaScript
PowerShell
kibana
elasticsearch
fluentd
nginx
イベント
五十嵐裕美
村川梨衣
logrotate
IoT
Scala
Java
C言語
iputils
ICMP
WUG
mastodon
Swift
AWS
Clock
Windows
アーキテクチャ
PoEAA
iOS
DeviceFarm
プログラミング言語
OS
StepFunctions
Lambda
Serverless
terraform
ポエム
RHEL
ネットワーク
GraphQL
CloudWatch
Linux
Coreutils
network
nc
telnet
LinuxKernel
fpinscala
ELB
IAM
AppSync
EFS
Gradle
english