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

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

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

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

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

事件错误的处理方式不同。有些事件会在不尝试任何重试的情况下被删除或发送到 DLQ。例如,对于由于缺少对目标或目标资源不再存在的权限而导致的错误,在采取措施解决潜在问题之前,所有重试尝试都会失败。与其重试,不如EventBridge将这些事件直接发送到 DLQ(如果有)。

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

您的 DLQ 中的每条消息都将包含以下自定义属性:

  • RULE_ARN

  • TARGET_ARN

  • ERROR_CODE

    以下是 DLQ 可能返回的错误代码示例:

    • CONNECTION_FAILURE

    • CROSS_ACCOUNT_INGESTION_FAILED

    • CROSS_REGION_INGESTION_FAILED

    • ERROR_FROM_TARGET

    • EVENTS_IN_BATCH_REQUEST_REJECTED

    • EVENTS_IN_BATCH_REQUEST_REJECTED

    • FAILED_TO_ASSUME_ROLE

    • INTERNAL_ERROR

    • INVALID_JSON

    • INVALID_PARAMETER

    • NO_PERMISSIONS

    • NO_RESOURCE

    • RESOURCE_ALREADY_EXISTS

    • RESOURCE_LIMIT_EXCEEDED

    • RESOURCE_MODIFICATION_COLLISION

    • SDK_CLIENT_ERROR

    • THIRD_ACCOUNT_HOP_DETECTED

    • THIRD_REGION_HOP_DETECTED

    • THROTTLING

    • TIMEOUT

    • TRANSIENT_ASSUME_ROLE

    • UNKNOWN

  • ERROR_MESSAGE

  • EXHAUSTED_RETRY_CONDITION

    可以返回以下条件:

    • MaximumRetryAttempts

    • MaximumEventAgeInSeconds

  • RETRY_ATTEMPTS

以下视频介绍了设置 DLQ:

使用死信队列

在为的 DLQ时,请考虑以下事项EventBridge。

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

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

  • 同一账户中的 DLQs 权限:

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

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

  • 使用来自不同Amazon账户的 Amazon SQS 队列的权限。

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

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

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

为死信队列授予权限

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

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

{ "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设置为 LLambda 函数的事件源以耗尽您的 DLQ。

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