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

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

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

有时事件未成功配送至目标规则. 例如,当目标资源不可用时,可能会发生这种情况EventBridge缺乏对目标资源的权限,或者由于网络状况。当事件由于可恢复错误而无法成功传送到目标时,EventBridge重试发送事件。您可以设置它尝试的时间长度和在重试策略目标的设置。默认情况下,EventBridge在 24 小时内重试发送事件,最多 185 次指数回退和紧张不安,或者随机延迟。如果事件在所有重试尝试都用尽后未传递,则该事件将被丢弃并EventBridge不会继续处理它。为避免在事件未能传递到目标后丢失,您可以配置死信队列 (DLQ) 并将所有失败事件发送到该队列以供以后处理。

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

事件错误的处理方式不同。某些事件会被丢弃或发送到 DLQ,而不会尝试任何重试。例如,对于因缺少目标权限或目标资源不再存在而导致的错误,在采取措施解决基本问题之前,所有重试尝试都将失败。而不是重试,EventBridge如果有的话,直接将这些事件发送到 DLQ。

当活动交付失败时,EventBridge向亚马逊发布活动CloudWatch指标表明目标invocationfailed. 如果您使用 DLQ,则会将其他指标发送到CloudWatch包括InvocationsSentToDLQInvocationsFailedToBeSentToDLQ. 有关 EventBridge 指标的更多信息,请参阅监控 Amazon EventBridge

以下信息作为 DLQ 消息元数据的一部分发送:

  • 规则 ARN

  • 目标 ARN

  • 错误代码

  • 错误消息

  • 已用尽的重试条件

  • 尝试次数

以下视频介绍了 DLQ 的设置:

使用死信队列的注意事项

在中配置 DLQ 时注意以下事项EventBridge.

  • 仅限标准队列支持。你不能在中使用 FIFO 队列作为 DLQEventBridge.

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

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

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

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

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

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

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

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

授予死信队列的权限

当您为规则的目标配置 DLQ 时,EventBridge将调用失败的事件发送到选定的 Amazon SQS 队列。要成功将事件传送到队列,EventBridge必须具有执行此操作的权限。当您为规则配置目标并使用EventBridge控制台,权限将自动添加。如果您使用 API 创建规则,或者使用不同的队列Amazon账户,您必须手动创建基于资源的策略,该策略授予所需的权限,然后将其附加到队列。

以下基于资源的策略演示了如何授予EventBridge将事件消息发送到 Amazon SQS 队列。该策略示例授予EventBridge服务权限使用SendMessage将消息发送到名为” 的队列的操作MyEventDLQ”。队列必须位于 us-west-2 区域Amazon账户 12345676789012。这些区域有:Condition语句只允许来自名为” 的规则的请求MyTest在中的 us-west-2 区域中创建的规则”Amazon账户 12345676789012。

{ "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 中的消息的自定义使用者逻辑。