

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Step F AWS Lambda unctions 调用函数
<a name="connect-lambda"></a>

了解如何使用 Step Functions 以同步或异步方式调用 Lambda 函数，来作为事件驱动型无服务器应用程序的一部分。

要了解如何在 Step Functions 中与AWS服务集成，请参阅[集成 服务](integrate-services.md)和[在 Step Functions 中将参数传递给服务 API](connect-parameters.md)。

**经优化的 Lambda 集成的主要功能**  
响应的 `Payload` 字段从转义的 Json 解析为 Json。
如果在 Lambda 函数中引发了异常，则任务将失败。有关实际示例，请参阅[在 Step Functions 状态机中处理错误条件](tutorial-handling-error-conditions.md)。

## 优化的 Lambda APIs
<a name="connect-lambda-api"></a>
+ [https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html)

## 工作流示例
<a name="connect-lambda-api-examples"></a>

下面是调用 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
      }
   }
}
```

以下内容包括实施[回调](connect-to-resource.md#connect-wait-token)服务集成模式的 `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
}
```

## 直接指定的函数资源
<a name="w2aac33c40c13"></a>

或者，您可以通过直接在“资源”字段中指定函数 ARN 来调用 Lambda 函数。以这种方式调用 Lambda 函数时，您无法指定 `.waitForTaskToken`，并且任务结果仅包含函数输出。

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

通过这种形式的集成，该函数可以成功发送包含 `FunctionError` 字段的响应。在这种情况下，工作流任务将失败。

通过在 `Resource` 字段的 ARN 中指定相应选项，您可以调用特定的 Lambda 函数版本或别名。请参阅 Lambda 文档中的以下内容：
+ [AWS Lambda 版本控制](https://docs.aws.amazon.com/lambda/latest/dg/versioning-intro.html)
+ [AWS Lambda别名](https://docs.aws.amazon.com/lambda/latest/dg/aliases-intro.html)

## 用于呼叫的 IAM 政策 AWS Lambda
<a name="lambda-iam"></a>

以下示例模板展示了如何根据状态机定义中的资源AWS Step Functions生成 IAM 策略。有关更多信息，请参阅[Step Functions 如何为集成服务生成 IAM 策略](service-integration-iam-templates.md)和[探索 Step Functions 中的服务集成模式](connect-to-resource.md)。

在以下示例中，一台状态机具有两个AWS Lambda任务状态，分别调用`function1`和`function2`，自动生成的策略包括对这两个函数的`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"
            ]
        }
    ]
}
```