これはなに
- 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
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