これはなに
- Step Functions Local の使い方と利用のイメージのメモ
導入方法
ドキュメントに書かれているとおりに実行します: Step Functions (ダウンロード可能バージョン) と Docker - AWS Step Functions
docker pull コマンドでサクッと導入できます
$ docker pull amazon/aws-stepfunctions-local
docker run コマンドで Step Functions Local を立ち上げます
$ docker run -p 8083:8083 amazon/aws-stepfunctions-local
Lambda 関数のローカル実行
Step Functions Local のステートマシン実行前に Lambda 関数をローカルで動かしておきます。
Lambda 関数の実装はこんな感じ
$ cat ./functions/hello/app.py
# -*- coding: utf-8 -*-
def lambda_handler(_, __):
return {
'result': 'hello'
}
SAM テンプレートはこんな感じ
$ cat ./template.yaml
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
Lambda 関数をローカルで実行します
$ sam local start-lambda
$ aws lambda invoke --function-name "HelloFunction" --endpoint-url "http://127.0.0.1:3001" --no-verify-ssl /tmp/out.txt
{
"StatusCode": 200
}
$ cat /tmp/out.txt
{"result":"hello"}
以上のようにローカルでの Lambda 関数の稼働が確認できました
Lambda 関数実行タスクを含むステートマシンのローカル実行
いよいよ Lambda 関数実行タスクを含むステートマシンをローカルで動かします
Step Functions Local 側から Lambda Local 側への通信ができるようにまずは環境変数を以下のように設定
$ cat environment.txt
LAMBDA_ENDPOINT=http://host.docker.internal:3001
そして該当の環境変数を用いて Step Functions Local を起動します
$ docker run -p 8083:8083 --env-file environment.txt amazon/aws-stepfunctions-local
ステートマシンの定義は以下のような感じにしておきます
$ cat ./statemachine/hello_world.asl.json
{
"Comment": "A state machine that does mock stock trading.",
"StartAt": "InvokeHello",
"States": {
"InvokeHello": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:HelloFunction",
"Next": "InvokeWorld"
},
"InvokeWorld": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:WorldFunction",
"End": true
}
}
}
このような状況のもと、ステートマシンをローカル上に作成します
$ aws stepfunctions --endpoint http://localhost:8083 create-state-machine --name "HelloWorld" --role-arn "arn:aws:iam::012345678901:role/DummyRole" --definition file://./statemachine/hello_world.local.asl.json
{
"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorld",
"creationDate": 1608790957.674
}
最後にローカルでステートマシンを実行するコマンドを叩きます
$ aws stepfunctions --endpoint http://localhost:8083 start-execution --state-machine arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorld --name test
{
"executionArn": "arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test",
"startDate": 1608791078.365
}
すると Step Functions Local 側のコンソールに以下のようにステートマシンの実行結果が出力されます
2020-12-XX XX:XX:10.485: StartExecution => {"requestClientOptions":{"readLimit":131073,"skipAppendUriPath":false},"requestMetricCollector":null,"customRequestHeaders":null,"customQueryParameters":null,"cloneSource":null,"sdkRequestTimeout":null,"sdkClientExecutionTimeout":null,"stateMachineArn":"arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorld","name":"test2","input":null,"traceHeader":null,"requestCredentials":null,"requestCredentialsProvider":null,"generalProgressListener":{"syncCallSafe":true},"readLimit":131073,"cloneRoot":null}
2020-12-XX XX:XX:10.525: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"ExecutionStarted","PreviousEventId":0,"ExecutionStartedEventDetails":{"Input":"{}","RoleArn":"arn:aws:iam::123456789012:role/DummyRole"}}
2020-12-XX XX:XX:10.527: [200] StartExecution <= {"sdkResponseMetadata":null,"sdkHttpMetadata":null,"executionArn":"arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2","startDate":1608792910520}
2020-12-XX XX:XX:10.528: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"TaskStateEntered","PreviousEventId":0,"StateEnteredEventDetails":{"Name":"InvokeHello","Input":"{}"}}
2020-12-XX XX:XX:10.530: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"LambdaFunctionScheduled","PreviousEventId":2,"LambdaFunctionScheduledEventDetails":{"Resource":"arn:aws:lambda:us-east-1:123456789012:function:HelloFunction","Input":"{}"}}
2020-12-XX XX:XX:10.569: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"LambdaFunctionStarted","PreviousEventId":3}
2020-12-XX XX:XX:16.394: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"LambdaFunctionSucceeded","PreviousEventId":4,"LambdaFunctionSucceededEventDetails":{"Output":"{\"result\":\"hello\"}"}}
2020-12-XX XX:XX:16.395: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"TaskStateExited","PreviousEventId":5,"StateExitedEventDetails":{"Name":"InvokeHello","Output":"{\"result\":\"hello\"}"}}
2020-12-XX XX:XX:16.396: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"TaskStateEntered","PreviousEventId":6,"StateEnteredEventDetails":{"Name":"InvokeWorld","Input":"{\"result\":\"hello\"}"}}
2020-12-XX XX:XX:16.396: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"LambdaFunctionScheduled","PreviousEventId":7,"LambdaFunctionScheduledEventDetails":{"Resource":"arn:aws:lambda:us-east-1:123456789012:function:WorldFunction","Input":"{\"result\":\"hello\"}"}}
2020-12-XX XX:XX:16.397: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"LambdaFunctionStarted","PreviousEventId":8}
2020-12-XX XX:XX:22.222: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"LambdaFunctionSucceeded","PreviousEventId":9,"LambdaFunctionSucceededEventDetails":{"Output":"{\"result\":\"helloworld\"}"}}
2020-12-XX XX:XX:22.222: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"TaskStateExited","PreviousEventId":10,"StateExitedEventDetails":{"Name":"InvokeWorld","Output":"{\"result\":\"helloworld\"}"}}
2020-12-XX XX:XX:22.223: arn:aws:states:us-east-1:123456789012:execution:HelloWorld:test2 : {"Type":"ExecutionSucceeded","PreviousEventId":11,"ExecutionSucceededEventDetails":{"Output":"{\"result\":\"helloworld\"}"}}
ステートマシン実行の結果、最終的に {"result":"helloworld"} が得られました
Pinned Articles
About
ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです
Tags
LLM
GenAI
JavaScript
PowerShell
fluentd
kibana
elasticsearch
nginx
イベント
村川梨衣
五十嵐裕美
logrotate
IoT
Java
Scala
ICMP
iputils
C言語
WUG
mastodon
Swift
AWS
Clock
Windows
PoEAA
アーキテクチャ
iOS
DeviceFarm
プログラミング言語
OS
StepFunctions
Lambda
Serverless
terraform
ポエム
RHEL
ネットワーク
GraphQL
CloudWatch
Linux
Coreutils
telnet
network
nc
LinuxKernel
fpinscala
ELB
AppSync
IAM
EFS