本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用死信队列处理中未传送的事件 EventBridge
为避免在事件未能传送到目标后丢失事件,您可以配置死信队列 (DLQ),并将所有失败事件发送到该队列,以便日后处理。
EventBridge DLQs 是标准的 Amazon SQS 队列, EventBridge 用于存储无法成功传送到目标的事件。创建规则并添加目标时,可以选择是否使用 DLQ。配置 DLQ 时,可以保留任何未成功传送的事件。然后,您可以解决导致事件传送失败的问题,并在之后处理事件。
当您为规则的目标配置 DLQ 时, EventBridge 会将调用失败的事件发送到选定的 Amazon SQS 队列。
事件错误的处理方式不同。有些事件会在不进行任何重试的情况下被丢弃或发送到 DLQ。例如,由于缺少对目标的权限或目标资源已不存在而导致的错误,在采取行动解决潜在问题之前,系统将不会进行任何重试。 EventBridge 将这些事件直接发送到目标 DLQ(如已指定)。
当事件交付失败时,会向 Amazon CloudWatch 指标 EventBridge 发布一个表明目标invocation
失败的事件。如果您使用 DLQ,则会将其他指标发送到 CloudWatch包括InvocationsSentToDLQ
和。InvocationsFailedToBeSentToDLQ
如果您使用对静态事件 DLQs 进行加密,也可以 AWS KMS 客户自主管理型密钥 为事件总线指定。有关更多信息,请参阅 在 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
以下视频介绍了设置 DLQs:
使用死信队列的注意事项
为配置 DLQ 时,请考虑以下几点。 EventBridge
-
仅支持标准队列。你不能在中使用 FIFO 队列来获取 DLQ。 EventBridge
-
EventBridge 消息中包含事件元数据和消息属性,包括:错误代码、错误消息、用尽重试条件、规则 ARN、重试尝试和目标 ARN。您可以使用这些值来识别事件和失败原因。
-
同一账户 DLQs 中的权限:
-
使用不同 AWS 账户的 Amazon SQS 队列的权限。
-
您使用的 Amazon SQS 队列必须位于创建规则的区域。
为死信队列授予权限
要成功将事件传送到队列, EventBridge 必须具有执行此操作的权限。使用 EventBridge 控制台指定 DLQ 时,权限会自动添加。这包括:
当您为规则目标配置 DLQ 时。
当您为事件总线配置 DLQ 时,您已指定 EventBridge 使用对静态事件 AWS KMS 客户托管式密钥 进行加密。
有关更多信息,请参阅 在 EventBridge 中使用死信队列来捕获加密事件错误。
如果您使用 API 指定 DLQ,或者使用其他 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
指定用于将事件发送到 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 API AWS 、SDK AWS CLI 或编写自定义使用者逻辑,用于轮询、处理和删除 DLQ 中的消息。