View a markdown version of this page

使用死信队列处理中未送达的事件 EventBridge - 亚马逊 EventBridge

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

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

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

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

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

事件错误的处理方式不同。有些事件会在不进行任何重试的情况下被丢弃或发送到 DLQ。例如,对于因目标权限缺失、目标资源不存在或由于地址无效或 DNS 查询失败而找不到目标而导致的错误,在采取措施解决潜在问题之前,不会进行重试。 EventBridge 如果您已指定目标 DLQ,则将这些事件直接发送到目标 DLQ。

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

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

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

  • RULE_ARN

  • TARGET_ARN

  • ERROR_CODE

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

    • ACTION_DECRYPTION_FAILURE

    • CONNECTION_FAILURE

    • CROSS_ACCOUNT_INGESTION_FAILED

    • CROSS_REGION_INGESTION_FAILED

    • ERROR_FROM_TARGET

    • EVENT_DECRYPTION_FAILURE

    • EVENT_ENCRYPTION_FAILURE

    • 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

    • RULE_DECRYPTION_FAILURE

    • 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。您可以使用这些值来识别事件和失败原因。

  • 同一账户中 DLQ 的权限:

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

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

  • 使用来自其他 AWS 账户的 Amazon SQS 队列的权限。

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

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

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

为死信队列授予权限

要成功将事件传送到队列, EventBridge 必须具有相应权限。当您使用 EventBridge 控制台指定 DLQ 时,会自动添加权限。这包括:

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

目标死信队列权限示例

以下基于资源的策略演示了如何授予向 Amazon SQS 队列发送事件消息所需的权限。 EventBridge 策略示例授予 EventBridge 服务使用该SendMessage操作向名为 “MyEventDLQ” 的队列发送消息的权限。该队列必须位于账户 123456789012 中的美国-西部 2 地区。 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 指定用于将事件发送到 DLQ 的事件总线的 ARN。在本示例中,队列必须与事件总线位于同一区域。

{ "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。要了解更多信息,请参阅Amazon SQS 权限

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

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

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

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