

# Invoke
<a name="API_Invoke"></a>

调用 Lambda 函数。您可以同步调用函数（并等待响应），也可以异步调用函数。默认情况下，Lambda 会同步调用函数（即 `InvocationType` 是 `RequestResponse`）。要异步调用函数，请将 `InvocationType` 设置为 `Event`。Lambda 将 `ClientContext` 对象传递给函数（仅限同步调用）。

对于[同步调用](https://docs.aws.amazon.com/lambda/latest/dg/invocation-sync.html)，有关函数响应的详细信息（包括错误）包含在响应正文和标题中。对于任一调用类型，您可以在[执行日志](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions.html)和[跟踪](https://docs.aws.amazon.com/lambda/latest/dg/lambda-x-ray.html)中找到更多信息。

当发生错误时，您的函数可能会被多次调用。重试行为因错误类型、客户端、事件源和调用类型而异。例如，如果您异步调用函数并返回错误，则 Lambda 最多再执行两次该函数。有关更多信息，请参阅 [Lambda 中的错误处理和自动重试](https://docs.aws.amazon.com/lambda/latest/dg/invocation-retries.html)。

对于[异步调用](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html)，Lambda 会将事件添加到队列，然后将它们发送到函数。如果您的函数没有足够的容量来跟上队列，事件可能会丢失。有时，您的函数可能会多次收到相同的事件，即使没有发生错误。要保留未处理的事件，请使用[死信队列](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-dlq)配置函数。

API 响应中的状态代码不反映函数错误。错误代码是为阻止函数执行的错误而预留的，例如权限错误、[限额](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)错误或与函数的代码和配置有关的问题。例如，如果运行该函数会导致您超出账户级别（`ConcurrentInvocationLimitExceeded`）或函数级别（`ReservedFunctionConcurrentInvocationLimitExceeded`）的并发限制，则 Lambda 将返回 `TooManyRequestsException`。

对于超时很长的函数，在等待响应的同步调用期间，客户端可能会断开连接。配置您的 HTTP 客户端、软件开发工具包、防火墙、代理或操作系统，以允许针对超时或保持活动设置保持长时间的连接。

此操作需要 [lambda:InvokeFunction](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_awslambda.html) 操作的权限。有关如何设置跨账户调用权限的详细信息，请参阅[向其他账户授予函数访问权](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html#permissions-resource-xaccountinvoke)。

## 请求语法
<a name="API_Invoke_RequestSyntax"></a>

```
POST /2015-03-31/functions/FunctionName/invocations?Qualifier=Qualifier HTTP/1.1
X-Amz-Invocation-Type: InvocationType
X-Amz-Log-Type: LogType
X-Amz-Client-Context: ClientContext

Payload
```

## URI 请求参数
<a name="API_Invoke_RequestParameters"></a>

请求使用以下 URI 参数。

 ** [ClientContext](#API_Invoke_RequestSyntax) **   <a name="lambda-Invoke-request-ClientContext"></a>
有关要传递给上下文对象中的函数的调用客户端的 base64 编码数据，最多为 3,583 字节。Lambda 将 `ClientContext` 对象传递给函数（仅限同步调用）。

 ** [FunctionName](#API_Invoke_RequestSyntax) **   <a name="lambda-Invoke-request-FunctionName"></a>
Lambda 函数的名称、版本或别名。  

**名称格式**
+  **函数名称** – `my-function`（仅限名称）、`my-function:v1`（具有别名）。
+  **函数 ARN** – `arn:aws:lambda:us-west-2:123456789012:function:my-function`。
+  **部分 ARN** – `123456789012:function:my-function`。
您可以将一个版本号或别名附加到任何格式。长度约束仅适用于完整 ARN。如果您仅指定函数名称，它的长度限制为 64 个字符。  
长度限制：最小长度为 1。长度上限为 170。  
模式：`(arn:(aws[a-zA-Z-]*)?:lambda:)?([a-z]{2}(-gov)?-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_\.]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?`  
必需：是

 ** [InvocationType](#API_Invoke_RequestSyntax) **   <a name="lambda-Invoke-request-InvocationType"></a>
从以下选项中进行选择。  
+  `RequestResponse`（默认）– 同步调用函数。保持连接打开，直到函数返回响应或超时。API 响应包括函数响应和其他数据。
+  `Event` – 异步调用函数。将多次失败的事件发送到函数的死信队列（如果已配置）。API 响应仅包含状态代码。
+  `DryRun` – 验证参数值并验证用户或角色是否具有调用函数的权限。
有效值：`Event | RequestResponse | DryRun`

 ** [LogType](#API_Invoke_RequestSyntax) **   <a name="lambda-Invoke-request-LogType"></a>
设置 `Tail` 以在响应中包含执行日志。仅适用于同步调用的函数。  
有效值：`None | Tail`

 ** [Qualifier](#API_Invoke_RequestSyntax) **   <a name="lambda-Invoke-request-Qualifier"></a>
指定版本或别名以调用函数的已发布版本。  
长度限制：最小长度为 1。长度上限为 128。  
模式：`(|[a-zA-Z0-9$_-]+)`

## 请求正文
<a name="API_Invoke_RequestBody"></a>

请求接受以下二进制数据。

 ** [Payload](#API_Invoke_RequestSyntax) **   <a name="lambda-Invoke-request-Payload"></a>
您想要作为输入提供到您的 Lambda 函数的 JSON。  
您可以直接输入 JSON。例如，`--payload '{ "key": "value" }'`。此外，您还可以指定文件路径。例如，`--payload file://payload.json`。

## 响应语法
<a name="API_Invoke_ResponseSyntax"></a>

```
HTTP/1.1 StatusCode
X-Amz-Function-Error: FunctionError
X-Amz-Log-Result: LogResult
X-Amz-Executed-Version: ExecutedVersion

Payload
```

## 响应元素
<a name="API_Invoke_ResponseElements"></a>

如果此操作成功，则该服务将会发送回 HTTP 响应。

 ** [StatusCode](#API_Invoke_ResponseSyntax) **   <a name="lambda-Invoke-response-StatusCode"></a>
对于成功请求，HTTP 状态代码在 200 范围内。对于 `RequestResponse` 调用类型，状态代码为 200。对于 `Event` 调用类型，状态代码为 202。对于 `DryRun` 调用类型，状态代码为 204。

响应将返回以下 HTTP 标头。

 ** [ExecutedVersion](#API_Invoke_ResponseSyntax) **   <a name="lambda-Invoke-response-ExecutedVersion"></a>
执行的函数的版本。当您调用带有别名的函数时，这将指示别名解析为哪个版本。  
长度限制：最小长度为 1。长度上限为 1024。  
模式：`(\$LATEST|[0-9]+)`

 ** [FunctionError](#API_Invoke_ResponseSyntax) **   <a name="lambda-Invoke-response-FunctionError"></a>
如果存在，则表示函数执行过程中发生错误。响应负载中包含有关错误的详细信息。

 ** [LogResult](#API_Invoke_ResponseSyntax) **   <a name="lambda-Invoke-response-LogResult"></a>
Base64 编码执行日志的最后 4 KB。

响应将以下内容作为 HTTP 正文返回。

 ** [Payload](#API_Invoke_ResponseSyntax) **   <a name="lambda-Invoke-response-Payload"></a>
来自函数或错误对象的响应。

## 错误
<a name="API_Invoke_Errors"></a>

有关所有操作返回的常见错误的信息，请参阅 [常见错误](CommonErrors.md)。

 ** EC2AccessDeniedException **   
需要额外的权限才能配置 VPC 设置。  
HTTP 状态代码：502

 ** EC2ThrottledException **   
AWS Lambda 是由 Amazon EC2 在 Lambda 函数初始化期间使用为函数提供的执行角色进行节流的。  
HTTP 状态代码：502

 ** EC2UnexpectedException **   
 AWS Lambda 在设置 Lambda 函数时收到意外的 Amazon EC2 客户端异常。  
HTTP 状态代码：502

 ** EFSIOException **   
从连接的文件系统读取或向其中写入时发生了错误。  
HTTP 状态代码：410

 ** EFSMountConnectivityException **   
Lambda 函数无法与配置的文件系统建立网络连接。  
HTTP 状态代码：408

 ** EFSMountFailureException **   
由于权限或配置问题，Lambda 函数无法挂载配置的文件系统。  
HTTP 状态代码：403

 ** EFSMountTimeoutException **   
Lambda 函数能够连接到配置的文件系统，但挂载操作超时。  
HTTP 状态代码：408

 ** ENILimitReachedException **   
 AWS Lambda 无法在 VPC 中创建指定为 Lambda 函数配置一部分的弹性网络接口，因为已达到网络接口限制。有关更多信息，请参阅 [Lambda 限额](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。  
HTTP 状态代码：502

 ** InvalidParameterValueException **   
请求中的参数之一无效。  
HTTP 状态代码：400

 ** InvalidRequestContentException **   
请求正文无法解析为 JSON。  
HTTP 状态代码：400

 ** InvalidRuntimeException **   
运行时或运行时版本不受支持。  
HTTP 状态代码：502

 ** InvalidSecurityGroupIDException **   
Lambda 函数 VPC 配置中提供的安全组 ID 无效。  
HTTP 状态代码：502

 ** InvalidSubnetIDException **   
Lambda 函数 VPC 配置中提供的子网 ID 无效。  
HTTP 状态代码：502

 ** InvalidZipFileException **   
 AWS Lambda 无法解压缩部署程序包。  
HTTP 状态代码：502

 ** KMSAccessDeniedException **   
Lambda 无法解密环境变量，因为对 AWS KMS 的访问已被拒绝。检查 Lambda 函数的 KMS 权限。  
HTTP 状态代码：502

 ** KMSDisabledException **   
Lambda 无法解密环境变量，因为使用的 AWS KMS key 已被禁用。检查 Lambda 函数的 KMS 密钥设置。  
HTTP 状态代码：502

 ** KMSInvalidStateException **   
Lambda 无法解密环境变量，因为所使用的 AWS KMS key 的状态对解密无效。检查函数的 KMS 密钥设置。  
HTTP 状态代码：502

 ** KMSNotFoundException **   
Lambda 无法解密环境变量，因为找不到 AWS KMS key。检查函数的 KMS 密钥设置。  
HTTP 状态代码：502

 ** RecursiveInvocationException **   
Lambda 检测到您的函数在涉及其他 AWS 资源的递归循环中被调用，因而停止了调用您的函数。  
HTTP 状态代码：400

 ** RequestTooLargeException **   
请求负载已超出 `Invoke` 请求正文 JSON 输入限额。有关更多信息，请参阅 [Lambda 限额](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。  
HTTP 状态代码：413

 ** ResourceConflictException **   
资源已存在，或者其他操作正在进行中。  
HTTP 状态代码：409

 ** ResourceNotFoundException **   
请求中指定的资源不存在。  
HTTP 状态代码：404

 ** ResourceNotReadyException **   
函数处于非活动状态，其 VPC 连接不再可用。等待 VPC 连接重新建立，然后重试。  
HTTP 状态代码：502

 ** ServiceException **   
AWS Lambda 服务遇到了内部错误。  
HTTP 状态代码：500

 ** SnapStartException **   
`afterRestore()` [运行时挂钩](https://docs.aws.amazon.com/lambda/latest/dg/snapstart-runtime-hooks.html)遇到错误。有关更多信息，请查看 Amazon CloudWatch 日志。  
HTTP 状态代码：400

 ** SnapStartNotReadyException **   
Lambda 正在初始化函数。您可以在[函数状态](https://docs.aws.amazon.com/lambda/latest/dg/functions-states.html)变为 `Active` 时调用该函数。  
HTTP 状态代码：409

 ** SnapStartTimeoutException **   
Lambda 无法在超时限制内还原快照。  
HTTP 状态代码：408

 ** SubnetIPAddressLimitReachedException **   
 由于配置的一个或多个子网没有可用的 IP 地址，因此 AWS Lambda 无法为 Lambda 函数设置 VPC 访问。  
HTTP 状态代码：502

 ** TooManyRequestsException **   
超出了请求吞吐量限制。有关更多信息，请参阅 [Lambda 限额](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#api-requests)。  
HTTP 状态代码：429

 ** UnsupportedMediaTypeException **   
`Invoke` 的内容类型请求体不是 JSON。  
HTTP 状态代码：415

## 另请参阅
<a name="API_Invoke_SeeAlso"></a>

有关在特定语言的 AWS SDK 中使用此 API 的更多信息，请参阅以下内容：
+  [AWS 命令行界面](https://docs.aws.amazon.com/goto/aws-cli/lambda-2015-03-31/Invoke) 
+  [适用于 .NET 的 AWS SDK](https://docs.aws.amazon.com/goto/DotNetSDKV3/lambda-2015-03-31/Invoke) 
+  [适用于 C\$1\$1 的 AWS SDK](https://docs.aws.amazon.com/goto/SdkForCpp/lambda-2015-03-31/Invoke) 
+  [适用于 Go 的 AWS SDK](https://docs.aws.amazon.com/goto/SdkForGoV1/lambda-2015-03-31/Invoke) 
+  [适用于 Java V2 的 AWS SDK](https://docs.aws.amazon.com/goto/SdkForJavaV2/lambda-2015-03-31/Invoke) 
+  [AWS 适用于 JavaScript 的开发工具包 V3](https://docs.aws.amazon.com/goto/SdkForJavaScriptV3/lambda-2015-03-31/Invoke) 
+  [适用于 PHP V3 的 AWS SDK](https://docs.aws.amazon.com/goto/SdkForPHPV3/lambda-2015-03-31/Invoke) 
+  [适用于 Python 的 AWS SDK](https://docs.aws.amazon.com/goto/boto3/lambda-2015-03-31/Invoke) 
+  [适用于 Ruby V3 的 AWS SDK](https://docs.aws.amazon.com/goto/SdkForRubyV3/lambda-2015-03-31/Invoke) 