

# 同步调用 Lambda 函数
<a name="invocation-sync"></a>

当您同步调用某个函数时，Lambda 会运行该函数并等待响应。当函数完成时，Lambda 返回来自函数代码的响应以及其他数据，例如已调用函数的版本。要使用 AWS CLI 同步调用函数，请使用 `invoke` 命令。

```
aws lambda invoke --function-name my-function \
    --cli-binary-format raw-in-base64-out \
    --payload '{ "key": "value" }' response.json
```

如果使用 **cli-binary-format** 版本 2，则 AWS CLI 选项是必需的。要将其设为默认设置，请运行 `aws configure set cli-binary-format raw-in-base64-out`。有关更多信息，请参阅*版本 2 的 AWS Command Line Interface 用户指南*中的 [AWS CLI 支持的全局命令行选项](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。

您应看到以下输出：

```
{
    "ExecutedVersion": "$LATEST",
    "StatusCode": 200
}
```

下图显示了同步调用 Lambda 函数的客户端。Lambda 将事件直接发送给函数，并将函数的响应发送回调用方。

![\[\]](http://docs.aws.amazon.com/zh_cn/lambda/latest/dg/images/invocation-sync.png)


`payload` 是一个包含 JSON 格式事件的字符串。AWS CLI 用来写入函数响应的文件的名称为 `response.json`。如果函数返回对象或错误，则响应正文是 JSON 格式的对象或错误。如果函数退出时没有错误，则响应正文为 `null`。

**注意**  
Lambda 在发送响应之前不会等待外部扩展完成。Lambda 扩展作为独立进程在执行环境中运行，并可以在完成函数调用后继续运行。有关更多信息，请参阅 [使用 Lambda 扩展增强 Lambda 函数](lambda-extensions.md)。

该命令的输出（显示在终端中）包含来自 Lambda 响应中的标头的信息。这包括处理事件的版本（在使用[别名](configuration-aliases.md)时非常有用），以及 Lambda 返回的状态代码。如果 Lambda 能够运行该函数，则状态代码为 200，即使该函数返回错误也是如此。

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

如果 Lambda 无法运行该函数，则将在输出中显示错误。

```
aws lambda invoke --function-name my-function \
    --cli-binary-format raw-in-base64-out \
    --payload value response.json
```

您应看到以下输出：

```
An error occurred (InvalidRequestContentException) when calling the Invoke operation: Could not parse request body into json: Unrecognized token 'value': was expecting ('true', 'false' or 'null')
 at [Source: (byte[])"value"; line: 1, column: 11]
```

AWS CLI 是一种开源工具，让您能够在命令行 Shell 中使用命令与 AWS 服务进行交互。要完成本节中的步骤，您必须拥有 [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

您可以通过 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)，使用 `--log-type` 命令选项检索调用的日志。响应包含一个 `LogResult` 字段，其中包含多达 4KB 来自调用的 base64 编码日志。

**Example 检索日志 ID**  
以下示例说明如何从 `LogResult` 字段中检索名为 `my-function` 的函数的*日志 ID*。  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
您应看到以下输出：  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example 解码日志**  
在同一命令提示符下，使用 `base64` 实用程序解码日志。以下示例说明如何为 `my-function` 检索 base64 编码的日志。  

```
aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
```
如果使用 **cli-binary-format** 版本 2，则 AWS CLI 选项是必需的。要将其设为默认设置，请运行 `aws configure set cli-binary-format raw-in-base64-out`。有关更多信息，请参阅*版本 2 的 AWS Command Line Interface 用户指南*中的 [AWS CLI 支持的全局命令行选项](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。  
您应看到以下输出：  

```
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB
```
`base64` 实用程序在 Linux、macOS 和 [Ubuntu on Windows](https://docs.microsoft.com/en-us/windows/wsl/install-win10) 上可用。macOS 用户可能需要使用 `base64 -D`。

有关 `Invoke` API 的更多信息（包括参数、标头和错误的完整列表），请参阅[调用](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)。

当您直接调用函数时，可以检查错误的响应并重试。在出现客户端超时、节流和服务错误时，AWS CLI 和AWS开发工具包也会自动重试。有关更多信息，请参阅[了解 Lambda 中的重试行为](invocation-retries.md)。