获取 Lambda 异步调用记录
Lambda 可以将异步调用记录发送给以下某个 Amazon Web Services 服务。
-
Amazon SQS – 标准 SQS 队列
-
Amazon SNS – 标准 SNS 主题
-
Amazon S3 – Amazon S3 存储桶(仅限失败时)
-
Amazon Lambda – Lambda 函数
-
Amazon EventBridge – EventBridge 事件总线
调用记录包含有关 JSON 格式的请求和响应的详细信息。您可为成功处理的事件以及处理尝试失败的事件配置单独的目标。或者,您可以将标准 Amazon SQS 队列或标准 Amazon SNS 主题配置为丢弃事件的死信队列。对于死信队列,Lambda 只发送事件的内容,不包含有关响应的详细信息。
如果 Lambda 无法向您配置的目的地发送记录,它会向 Amazon CloudWatch 发送 DestinationDeliveryFailures
指标。如果您的配置包含不支持的目标类型,例如 Amazon SQS FIFO 队列或 Amazon SNS FIFO 主题,则可能会发生这种情况。权限误配和大小限制可能会导致发生传输错误。有关 Lambda 调用指标的更多信息,请参阅 调用指标。
注意
添加目标
要保留异步调用的记录,请向函数添加目标。您可以选择将成功或失败的调用发送到目标。每个函数可以有多个目标,因此您可以为成功和失败的事件配置不同的目标。发送到目标的每条记录都是一个 JSON 文档,其中包含有关调用的详细信息。与错误处理设置一样,您可以在函数版本或别名上配置目标。
提示
您还可以保留以下事件源映射类型的失败调用记录:Amazon Kinesis、Amazon DynamoDB、自托管式 Apache Kafka 和 Amazon MSK。
下表列出了 Lambda 支持的异步调用记录目标。要让 Lambda 成功将记录发送到您选择的目标,请确保函数的执行角色也包含相关权限。该表还描述了每种目标类型如何接收 JSON 调用记录。
目标类型 | 所需的权限 | 特定于目标的 JSON 格式 |
---|---|---|
Amazon SQS 队列 |
Lambda 将调用记录作为 |
|
Amazon SNS 主题 |
Lambda 将调用记录作为 |
|
Amazon S3 存储桶(仅限失败时) |
|
|
Lambda 函数 |
Lambda 将调用记录作为有效负载传递给函数。 |
|
EventBridge |
|
注意
对于 Amazon S3 目标,如果您已使用 KMS 密钥对存储桶启用加密,则您的函数还需要 kms:GenerateDataKey 权限。
以下步骤介绍如何使用 Lambda 控制台和 Amazon CLI 配置函数的目标。
Amazon S3 目标的安全最佳实践
如果删除配置为目标的 S3 存储桶而不将目标从函数配置中删除,则可能会造成安全风险。如果其他用户知道您的目标存储桶的名称,则他们可以在其 Amazon Web Services 账户中重新创建存储桶。调用失败的记录将发送到存储桶,这可能会暴露您函数中的数据。
警告
为确保您的函数中的调用记录不会发送到另一个 Amazon Web Services 账户中的 S3 存储桶,请向函数的执行角色添加条件,以将 s3:PutObject
权限限制为您账户中的存储桶。
以下示例显示了一个 IAM 策略,该策略将您函数的 s3:PutObject
权限限制为您账户中的存储桶。该策略还为 Lambda 提供了使用 S3 存储桶作为目标所需的 s3:ListBucket
权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3BucketResourceAccountWrite", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListBucket" ], "Resource": "arn:aws:s3:::*/*", "Condition": { "StringEquals": { "s3:ResourceAccount":
"111122223333"
} } } ] }
要使用 Amazon Web Services Management Console或 Amazon CLI 向函数的执行角色添加权限策略,请参阅以下程序中的说明:
调用记录的示例
当调用与条件匹配时,Lambda 会向目标发送包含调用详细信息的 JSON 文档。以下示例显示了由于函数错误而导致三次处理尝试失败的事件的调用记录。
{
"version": "1.0",
"timestamp": "2019-11-14T18:16:05.568Z",
"requestContext": {
"requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e",
"functionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
"condition": "RetriesExhausted",
"approximateInvokeCount": 3
},
"requestPayload": {
"ORDER_IDS": [
"9e07af03-ce31-4ff3-xmpl-36dce652cb4f",
"637de236-e7b2-464e-xmpl-baf57f86bb53",
"a81ddca6-2c35-45c7-xmpl-c3a03a31ed15"
]
},
"responseContext": {
"statusCode": 200,
"executedVersion": "$LATEST",
"functionError": "Unhandled"
},
"responsePayload": {
"errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request"
}
}
调用记录包含有关事件、响应和记录发送原因的详细信息。
追踪发往目的地的请求
在每个请求排队、由 Lambda 函数处理并传递到目标服务时,您可以使用 Amazon X-Ray 查看每个请求的连接视图。当您为调用函数的函数或服务激活 X-Ray 跟踪时,Lambda 会向请求添加 X-Ray 标头并将标头传递给目标服务。来自上游服务的跟踪会自动链接到下游 Lambda 函数的跟踪,从而创建整个应用程序的端到端视图。有关跟踪的更多信息,请参阅 使用 Amazon X-Ray 可视化 Lambda 函数调用。
添加死信队列
作为失败时的目标的替代,您可以使用死信队列配置函数,以保存丢弃的事件供进一步处理。死信队列的作用与失败时的目标相同,在某个事件的所有处理尝试都失败或者已过期而未处理时使用。但是,您只能在函数级别添加或删除死信队列。函数版本使用与未发布的版本($LATEST)相同的死信队列设置。失败时的目标还支持其他目标,并在调用记录中包含有关函数响应的详细信息。
要重新处理死信队列中的事件,您可以将其设置为 Lambda 函数的事件源。或者,您也可以手动检索事件。
您可以为死信队列选择 Amazon SQS 标准队列或 Amazon SNS 标准主题。不支持 FIFO 队列和 Amazon SNS FIFO 主题。
-
Amazon SQS 队列 – 队列会保存失败的事件,直到检索这些事件为止。如果您希望单个实体(例如 Lambda 函数或 CloudWatch 告警)来处理失败事件,请选择 Amazon SQS 标准队列。有关更多信息,请参阅 将 Lambda 与 Amazon SQS 结合使用。
-
Amazon SNS 主题 – 主题将失败的事件中继到一个或多个目标。如果您希望多个实体对失败事件采取行动,请选择 Amazon SNS 标准主题。例如,您可以配置主题以将事件发送到电子邮件地址、Lambda 函数或 HTTP 端点。有关更多信息,请参阅 使用 Amazon SNS 通知调用 Lambda 函数。
要将事件发送到队列或主题,您的函数需要其他权限。添加具有函数执行角色所需权限的策略。
如果已使用客户管理的密钥加密目标队列或主题,则执行角色也必须是密钥的基于资源的策略中的用户。
创建目标并更新函数的执行角色后,将死信队列添加到函数中。您可以配置多个函数,以便将事件发送到同一目标。
Lambda 按原样将事件发送到死信队列,并在属性中包含其他信息。您可以使用此信息来标识函数返回的错误,或者将事件与日志或 Amazon X-Ray 跟踪相关联。
死信队列消息属性
-
RequestID(字符串)– 调用请求的 ID。请求 ID 显示在函数日志中。您还可以使用 X-Ray 开发工具包,在跟踪中的属性上记录请求 ID。然后,可以在 X-Ray 控制台中按请求 ID 搜索跟踪。
-
ErrorCode(数字)– HTTP 状态代码。
-
ErrorMessage(字符串)– 错误消息的第一个 1 KB 文本块。
如果 Lambda 无法向死信队列发送消息,则会删除该事件并发出 DeadLetterErrors 指标。之所以发生这种情况,可能是由于缺少权限,或者消息的总大小超过目标队列或主题的限制。例如,假设正文大小接近 256 KB 的 Amazon SNS 通知触发了一个导致错误的函数。在这种情况下,Amazon SNS 添加的事件数据加上 Lambda 添加的属性,可能会导致消息超过死信队列中允许的最大大小。
如果您正在使用 Amazon SQS 作为事件源,请在 Amazon SQS 队列本身而不是 Lambda 函数上配置死信队列。有关更多信息,请参阅 将 Lambda 与 Amazon SQS 结合使用。