同步调用 - AWS Lambda

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

同步调用

当您同步调用某个函数时,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 支持的全局命令行选项

您应看到以下输出:

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

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


      客户端同步调用函数并等待响应。

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

注意

Lambda 在发送响应之前不会等待外部扩展完成。Lambda 扩展作为独立进程在执行环境中运行,并可以在完成函数调用后继续运行。有关更多信息,请参阅Lambda 扩展

该命令的输出(显示在终端中)包含来自 Lambda 响应中的标头的信息。这包括处理事件的版本(在使用别名时非常有用),以及 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,使用 --log-type 命令选项检索调用的日志。响应包含一个 LogResult 字段,其中包含多达 4KB 来自调用的 base64 编码日志。

例 检索日志 ID

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

aws lambda invoke --function-name my-function out --log-type Tail

您应看到以下输出:

{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
例 解码日志

在同一命令提示符下,使用 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 支持的全局命令行选项

您应看到以下输出:

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 上可用。macOS 用户可能需要使用 base64 -D

有关 Invoke API 的更多信息(包括参数、标头和错误的完整列表),请参阅调用

当您直接调用函数时,可以检查错误的响应并重试。在出现客户端超时、节流和服务错误时,AWS CLI 和AWS开发工具包也会自动重试。有关更多信息,请参阅AWS Lambda 中的错误处理和自动重试