获取 Lambda 异步调用记录 - AWS Lambda

获取 Lambda 异步调用记录

Lambda 可以将异步调用记录发送给以下某个 AWS 服务。

  • Amazon SQS – 标准 SQS 队列。

  • Amazon SNS – 标准 SNS 主题。

  • AWS Lambda – Lambda 函数。

  • Amazon EventBridge – EventBridge 事件总线。

调用记录包含有关 JSON 格式的请求和响应的详细信息。您可为成功处理的事件以及处理尝试失败的事件配置单独的目标。或者,您可以将标准 Amazon SQS 队列或标准 Amazon SNS 主题配置为丢弃事件的死信队列。对于死信队列,Lambda 只发送事件的内容,不包含有关响应的详细信息。

如果 Lambda 无法向您配置的目的地发送记录,它会向 Amazon CloudWatch 发送 DestinationDeliveryFailures 指标。如果您的配置包含不支持的目标类型,例如 Amazon SQS FIFO 队列或 Amazon SNS FIFO 主题,则可能会发生这种情况。权限误配和大小限制可能会导致发生传输错误。有关 Lambda 调用指标的更多信息,请参阅 调用指标

注意

要防止触发函数,可以将函数的预留并发设置为零。当您将异步调用函数的预留并发设置为零时,Lambda 会开始将新事件发送到已配置的死信队列或失败时的事件目标,且不会做出任何重试。要处理在预留并发设置为零时发送的事件,您必须使用死信队列或失败时事件目标中的事件。

添加目标

要保留异步调用的记录,请向函数添加目标。您可以选择将成功或失败的调用发送到目标。每个函数可以有多个目标,因此您可以为成功和失败的事件配置不同的目标。发送到目标的每条记录都是一个 JSON 文档,其中包含有关调用的详细信息。与错误处理设置一样,您可以在函数版本或别名上配置目标。

注意

您还可以保留以下事件源映射类型的失败调用记录:Amazon KinesisAmazon DynamoDB自托管式 Apache KafkaAmazon MSK

下表列出了 Lambda 支持的异步调用记录目标。要让 Lambda 成功将记录发送到您选择的目标,请确保函数的执行角色也包含相关权限。该表还描述了每种目标类型如何接收 JSON 调用记录。

目标类型 所需的权限 特定于目标的 JSON 格式

Amazon SQS 队列

sqs:SendMessage

Lambda 将调用记录作为 Message 传递到目标。

Amazon SNS 主题

sns:Publish

Lambda 将调用记录作为 Message 传递到目标。

Lambda 函数

InvokeFunction

Lambda 将调用记录作为有效负载传递给函数。

EventBridge

events:PutEvents

  • Lambda 将调用记录作为 detail 在 PutEvents 调用中传递。

  • source 事件字段的值为 lambda

  • detail-type 事件字段的值为“Lambda Function Invocation Result – Success”(Lambda 函数调用结果 – 成功)或“Lambda Function Invocation Result – Failure”(Lambda 函数调用结果 – 失败)。

  • resource 事件字段包含函数和目标的 Amazon 资源名称(ARN)。

  • 对于其他事件字段,请参阅 Amazon EventBridge 事件

以下步骤介绍如何使用 Lambda 控制台和 AWS CLI 配置函数的目标。

Console
  1. 打开 Lamba 控制台的 Functions(函数)页面。

  2. 选择函数。

  3. Function overview (函数概览) 下,选择 Add destination (添加目标)

  4. 对于 Source (源),选择 Asynchronous invocation (异步调用)

  5. 对于 Condition (条件),请从以下选项中选择:

    • On failure(失败时)– 当事件的所有处理尝试均失败或超过最长期限时发送记录。

    • On success(成功时)– 函数成功处理异步调用时发送记录。

  6. 对于 Destination type (目标类型),请选择接收调用记录的资源类型。

  7. 对于 Destination (目标),请选择一个资源。

  8. 选择保存

AWS CLI

要使用 AWS CLI 配置目标,请运行 update-function-event-invoke-config 命令。以下示例配置 Lambda,以便在无法处理事件时将记录发送到名为 destination 的标准 SQS 队列。

aws lambda update-function-event-invoke-config \ --function-name my-function \ --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-1:123456789012:destination"}}'

当调用与条件匹配时,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 函数处理并传递到目标服务时,您可以使用 AWS X-Ray 查看每个请求的连接视图。当您为调用函数的函数或服务激活 X-Ray 跟踪时,Lambda 会向请求添加 X-Ray 标头并将标头传递给目标服务。来自上游服务的跟踪会自动链接到下游 Lambda 函数的跟踪,从而创建整个应用程序的端到端视图。有关跟踪的更多信息,请参阅 使用 AWS 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 函数

要将事件发送到队列或主题,您的函数需要其他权限。添加具有函数执行角色所需权限的策略。

如果已使用客户管理的密钥加密目标队列或主题,则执行角色也必须是密钥的基于资源的策略中的用户。

创建目标并更新函数的执行角色后,将死信队列添加到函数中。您可以配置多个函数,以便将事件发送到同一目标。

Console
  1. 打开 Lamba 控制台的 Functions(函数)页面。

  2. 选择函数。

  3. 选择 Configuration(配置),然后选择 Asynchronous invocation(异步调用)

  4. Asynchronous invocation (异步调用) 下,选择 Edit (编辑)

  5. 死信队列服务设置为 Amazon SQSAmazon SNS

  6. 选择目标队列或主题。

  7. 选择保存

AWS CLI

要通过 AWS CLI 配置死信队列,请使用 update-function-configuration 命令。

aws lambda update-function-configuration \ --function-name my-function \ --dead-letter-config TargetArn=arn:aws:sns:us-east-1:123456789012:my-topic

Lambda 按原样将事件发送到死信队列,并在属性中包含其他信息。您可以使用此信息来标识函数返回的错误,或者将事件与日志或 AWS 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 结合使用