Step Functions を使用して AWS Lambda 関数を呼び出す - AWS Step Functions

Step Functions を使用して AWS Lambda 関数を呼び出す

Step Functions を使用して、イベント駆動型サーバーレスアプリケーションの一部として同期的にまたは非同期的に Lambda 関数を呼び出す方法について説明します。

Step Functions で AWS サービスと統合することについては、「 サービスとの統合」および「Step Functions でサービス API にパラメータを渡す」を参照してください。

最適化された Lambda 統合の主な機能
  • レスポンスの Payload フィールドは、エスケープされた Json から Json に解析されます。

  • Lambda 関数内で例外がスローされた場合、タスクは失敗します。実用的な例については、「Step Functions ステートマシンでのエラー条件の処理」を参照してください。

最適化された Lambda API

ワークフローの例

以下には、Lambda 関数を呼び出す Task 状態が含まれます。

{ "StartAt":"CallLambda", "States":{ "CallLambda":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Arguments":{ "FunctionName":"arn:aws:lambda:region:account-id:function:MyFunction" }, "End":true } } }

以下には、コールバックサービス統合パターンを実行する Task の状態が含まれます。

{ "StartAt":"GetManualReview", "States":{ "GetManualReview":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken", "Arguments":{ "FunctionName":"arn:aws:lambda:region:account-id:function:get-model-review-decision", "Payload":{ "model":"{% $states.input.my-model %}", "TaskToken": "{% $states.context.Task.Token %}" }, "Qualifier":"prod-v1" }, "End":true } } }

Lambda 関数を呼び出すと、実行は関数の完了を待ちます。コールバックタスクで Lambda 関数を呼び出す場合、Lambda 関数の実行が完了して結果を返すまで、ハートビートタイムアウトのカウントは開始されません。Lambda 関数が実行されている限り、ハートビートタイムアウトは適用されません。

ただし、次の例に示されているとおり、InvocationType パラメータを使って非同期で Lambda を呼び出すこともできます。

{ "Comment": "A Hello World example of the Amazon States Language using Pass states", "StartAt": "Hello", "States": { "Hello": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Arguments": { "FunctionName": "arn:aws:lambda:region:account-id:function:echo", "InvocationType": "Event" }, "End": true } } }
注記

Lambda 関数の非同期呼び出しでは、ハートビートタイムアウト期間がすぐに開始されます。

ときに Task の結果が返されると、関数の出力はメタデータのディクショナリ内にネストされます。例:

{ "ExecutedVersion":"$LATEST", "Payload":"FUNCTION OUTPUT", "SdkHttpMetadata":{ "HttpHeaders":{ "Connection":"keep-alive", "Content-Length":"4", "Content-Type":"application/json", "Date":"Fri, 26 Mar 2021 07:42:02 GMT", "X-Amz-Executed-Version":"$LATEST", "x-amzn-Remapped-Content-Length":"0", "x-amzn-RequestId":"0101aa0101-1111-111a-aa55-1010aaa1010", "X-Amzn-Trace-Id":"root=1-1a1a000a2a2-fe0101aa10ab;sampled=0" }, "HttpStatusCode":200 }, "SdkResponseMetadata":{ "RequestId":"6b3bebdb-9251-453a-ae45-512d9e2bf4d3" }, "StatusCode":200 }

直接指定された関数リソース

または、「リソース」フィールドに関数 ARN を直接指定して Lambda 関数を呼び出せます。この方法で Lambda 関数を呼び出す場合、.waitForTaskToken を指定することはできず、タスク結果には関数の出力のみが含まれます。

{ "StartAt":"CallFunction", "States":{ "CallFunction": { "Type":"Task", "Resource":"arn:aws:lambda:region:account-id:function:HelloFunction", "End": true } } }

この形式の統合では、関数は成功しても、FunctionError フィールドを含むレスポンスを返すことがあります。このシナリオでは、ワークフロータスクは失敗します。

Lambda 関数の特定バージョンまたはエイリアスを呼び出すには、Resource フィールドの ARN でそれらのオプションを指定します。Lambda ドキュメントで以下を参照してください。

AWS Lambda を呼び出すための IAM ポリシー

以下のテンプレート例では、ステートマシンの定義におけるリソースに基づき、AWS Step Functions による IAM ポリシーの生成方法を示しています。詳細については、「Step Functions が統合サービスの IAM ポリシーを生成する方法」および「Step Functions でサービス統合パターンを検出する」を参照してください。

次の例では、2 つの AWS Lambda タスクステートがあり、それぞれが function1function2 を呼び出します。自動生成されたポリシーには、両方の関数に対する lambda:Invoke アクセス許可が含まれています。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-east-1:123456789012:function:myFn1", "arn:aws:lambda:us-east-1:123456789012:function:myFn2" ] } ] }