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