Step Functions Local を使う

これはなに

  • 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"} が得られました

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください