使用死信队列处理中未传送的事件 EventBridge - Amazon EventBridge

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

使用死信队列处理中未传送的事件 EventBridge

为了避免在事件未能传送到目标后丢失,您可以配置死信队列 (DLQ),并将所有失败的事件发送到该队列以供日后处理。

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

当您DLQ为规则的目标配置时, EventBridge 会将调用失败的事件发送到所选的 Amazon SQS 队列。

事件错误的处理方式不同。有些事件会在不进行任何重试DLQ的情况下被丢弃或发送到。例如,对于由于缺少对目标的权限而导致的错误,或者如果目标资源已不复存在,则在采取措施解决潜在问题之前,不会进行重试尝试。 EventBridge 将这些事件直接发送到目标DLQ(如果已指定)。

当事件交付失败时,会向 Amazon CloudWatch 指标 EventBridge 发布一个表明目标invocation失败的事件。如果您使用DLQ,则会将其他指标发送到 CloudWatch包括InvocationsSentToDLQInvocationsFailedToBeSentToDLQ

如果您使用对静态事件DLQs进行加密,也可以 AWS KMS 客户自主管理型密钥 为事件总线指定。有关更多信息,请参阅 使用死信队列捕获中的加密事件错误 EventBridge

您的每封邮件都DLQ将包含以下自定义属性:

  • RULE_ARN

  • TARGET_ARN

  • ERROR_CODE

    以下是 a 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

以下视频介绍了设置DLQs:

使用死信队列的注意事项

配置 for 时,DLQ请考虑以下几点 EventBridge。

  • 仅支持标准队列。您不能使用FIFO队列进行输DLQ入 EventBridge。

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

  • 同一账户DLQs中的权限:

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

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

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

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

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

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

为死信队列授予权限

要成功将事件传送到队列, EventBridge 必须具有执行此操作的权限。DLQ使用 EventBridge 控制台指定时,权限会自动添加。这包括:

如果您DLQ使用指定队列API,或者使用其他 AWS 账户中的队列,则必须手动创建授予所需权限的基于资源的策略,然后将其附加到队列。

目标死信队列权限示例

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

{ "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" } } }

事件总线死信队列权限示例

以下基于资源的策略演示了在为事件总线指定时如何授予所需的权限。DLQ在这种情况下,aws:SourceArn指定将ARN事件发送到的事件总线的DLQ。同样,在本示例中,队列必须与事件总线位于同一个区域。

{ "Sid": "Dead-letter queue permissions", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:region:account-id:queue-name", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:events:region:account-id:event-bus/event-bus-arn" } } }

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

如何从死信队列中重新发送事件

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

  • 避免编写亚马逊使用SQS者逻辑 — 将您DLQ设置为 Lambda 函数的事件源,以耗尽您的精力。DLQ

  • 编写 Amazon 使用SQS者逻辑 — 使用 Amazon SQS API AWS SDK、或 AWS CLI 编写自定义使用者逻辑,用于轮询、处理和删除中的消息DLQ。