Step Functions を使用して AWS Lambda 関数を呼び出す
Step Functions を使用して、イベント駆動型サーバーレスアプリケーションの一部として同期的にまたは非同期的に Lambda 関数を呼び出す方法について説明します。
Step Functions で AWS サービスと統合することについては、「 サービスとの統合」および「Step Functions でサービス API にパラメータを渡す」を参照してください。
最適化された Lambda 統合の主な機能
-
レスポンスの
Payload
フィールドは、エスケープされた Json から Json に解析されます。 -
レスポンスにフィールド
FunctionError
が含まれている場合、または Lambda 関数内で例外が発生した場合、タスクは失敗します。
状態の出入力および結果の管理については、Step Functions の入力および出力処理 を参照してください。
サポートされている Lambda API
ワークフローの例
以下には、Lambda 関数を呼び出す Task
状態が含まれます。
{
"StartAt":"CallLambda",
"States":{
"CallLambda":{
"Type":"Task",
"Resource":"arn:aws:states:::lambda:invoke",
"Parameters":{
"FunctionName":"arn:aws:lambda:us-east-1:123456789012:function:MyFunction
"
},
"End":true
}
}
}
以下には、コールバックサービス統合パターンを実行する Task
の状態が含まれます。
{
"StartAt":"GetManualReview",
"States":{
"GetManualReview":{
"Type":"Task",
"Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken",
"Parameters":{
"FunctionName":"arn:aws:lambda:us-east-1:123456789012:function:get-model-review-decision
",
"Payload":{
"model.$":"$.new_model",
"token.$":"$$.Task.Token"
},
"Qualifier":"prod-v1"
},
"End":true
}
}
}
Lambda 関数を呼び出すと、実行は関数の完了を待ちます。コールバックタスクで Lambda 関数を呼び出す場合、Lambda 関数の実行が完了して結果を返すまで、ハートビートタイムアウトのカウントは開始されません。Lambda 関数が実行されている限り、ハートビートタイムアウトは適用されません。
ただし、次の例に示されているとおり、InvocationType
パラメータを使って非同期で Lambda を呼び出すこともできます。
注記
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",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:echo
",
"InvocationType": "Event"
},
"End": true
}
}
}
ときに 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:us-east-1:123456789012:function:HelloFunction
",
"End": true
}
}
}
Lambda 関数の特定バージョンまたはエイリアスを呼び出すには、Resource
フィールドの ARN でそれらのオプションを指定します。Lambda ドキュメントで以下を参照してください。
AWS Lambda を呼び出すための IAM ポリシー
以下のテンプレート例では、ステートマシンの定義におけるリソースに基づき、AWS Step Functions による IAM ポリシーの生成方法を示しています。詳細については、Step Functions が統合サービスの IAM ポリシーを生成する方法およびStep Functions でサービス統合パターンを検出するを参照してください。
AWS Step Functions は、ステートマシンの定義に基づいて IAM ポリシーを生成します。function1
と function2
を呼び出す 2 つの AWS Lambda タスク状態を持つステートマシンの場合、この 2 つの関数の lambda:Invoke
アクセス許可を含むポリシーを使用する必要があります。
以下の例ではこれを示しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:[[region]]
:[[accountId]]
:function:[[function1]]
",
"arn:aws:lambda:[[region]]
:[[accountId]]
:function:[[function2]]
"
]
}
]
}