事件重试策略和使用死信队列 - Amazon EventBridge
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

事件重试策略和使用死信队列

有时event未成功传递到target指定规则。例如,在目标资源不可用、EventBridge 缺乏对目标资源的权限或由于网络条件而导致的情况下,可能会发生这种情况。当事件未成功传递到目标时,EventBridge 将重新尝试发送该事件。您可以设置尝试的时间长度,以及重试策略设置。默认情况下,EventBridge 会重试发送事件 24 小时,最多可使用指数回退和抖动,或随机延迟。如果在用完所有重试尝试后未传递事件,则该事件将被删除,且 EventBridge 不会继续处理它。为避免事件在未能传递到目标之后丢失事件,您可以配置死信队列 (DLQ) 并将所有失败事件发送到该队列以供以后处理。

EventBridge DLQ 是标准的 Amazon SQS 队列,EventBridge 用于存储无法成功传递到目标的事件。创建规则并添加目标时,可以选择是否使用 DLQ。配置 DLQ 时,您可以保留未成功传递的任何事件。然后,您可以解决导致事件交付失败的问题,并在以后处理这些事件。

事件错误以不同的方式处理。某些事件会被丢弃或发送到 DLQ,而无需进行任何重试。例如,对于由于缺少对目标的权限或目标资源不再存在的权限而导致的错误,所有重试尝试都会失败,直到采取操作来解决基础问题。如果您有,EventBridge 将这些事件直接发送到 DLQ,而不是重试。

当事件传递失败时,EventBridge 会向 Amazon CloudWatch 指标发布一个事件,指示目标invocationfailed. 如果您使用 DLQ,则会将其他指标发送到 CloudWatch,包括InvocationsSentToDLQInvocationsFailedToBeSentToDLQ。有关 EventBridge 指标的更多信息,请参阅。监控 Amazon EventBridge

使用死信队列的注意事项

为 EventBridge 配置 DLQ 时,请考虑以下事项。

  • 仅限标准队列支持。您不能在 EventBridge 中为 DLQ 使用 FIFO 队列。

  • EventBridge 在邮件中包含事件元数据和消息属性,包括:错误代码、错误消息、已耗尽的重试条件、规则 ARN、重试尝试次数和目标 ARN。您可以使用这些值来标识事件和失败原因。

  • 对同一账户中的 DLQ 的权限:

    • 如果您使用控制台向规则添加目标,并且在同一账户中选择了 Amazon SQS 队列,则基于资源的策略,授予 EventBridge 访问该队列的权限将被附加到您的队列中。

    • 如果您使用PutTargets操作添加或更新规则的目标,并在同一账户中选择 Amazon SQS 队列,则必须手动授予所选队列的权限。要了解更多信息,请参阅“授予死信队列的权限”。

  • 使用不同的 Amazon SQS 队列的权限Amazonaccount.

    • 如果您从控制台创建规则,则不会显示来自其他帐户的队列供您选择。您必须为其他帐户中的队列提供 ARN,然后手动附加基于资源的策略以向队列授予权限。要了解更多信息,请参阅“授予死信队列的权限”。

    • 如果使用 API 创建规则,则必须手动将基于资源的策略附加到另一个用作死信队列的帐户中的 SQS 队列。要了解更多信息,请参阅“授予死信队列的权限”。

  • 您使用的 Amazon SQS 队列必须位于创建规则的同一区域。

授予死信队列的权限

当您为规则的目标配置 DLQ 时,EventBridge 会将调用失败的事件发送到选定的 Amazon SQS 队列。要成功将事件传递到队列,EventBridge 必须具有相应的权限。当您为规则配置目标并使用 EventBridge 控制台选择 DLQ 时,权限将自动添加。如果您使用 API 创建规则,或者使用的队列位于Amazon帐户,则必须手动创建一个基于资源的策略,以授予所需权限,然后将其附加到队列。

以下基于资源的策略演示了如何授予 EventBridge 向 Amazon SQS 队列发送事件消息所需的权限。策略示例授予 EventBridge 服务使用SendMessage操作将消息发送到名为 “myeventDLQ” 的队列。队列必须位于Amazon账户. 这些区域有:Condition语句仅允许来自名为 “mytestrule” 的规则的请求,该规则是在Amazon账户.

{ "Sid": "Dead-letter queue permissions", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:us-west-2:123456789012:MyEventDLQ", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:events:us-west-2:123456789012:rule/MyTestRule" } } }

要将策略附加到队列,请使用 Amazon SQS 控制台,打开队列,然后选择访问策略并编辑策略。您也可以使用Amazon CLI,了解更多信息,请参阅Amazon SQS 权限

如何重发送死信队列

可以通过两种方式将消息移出 DLQ:

  • 避免编写 Amazon SQS 使用者逻辑 — 将 DLQ 设置为 Lambda 函数的事件源以耗尽 DLQ。

  • 编写 Amazon SQS 消费者逻辑 — 使用 Amazon SQS API、Amazon开发工具包或Amazon CLI编写用于轮询、处理和删除 DLQ 中的消息的自定义使用者逻辑。