本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
重试策略和死信队列
当目标调用失败时, EventBridge 会重试直到达到中的RetryPolicy两个限制之一,默认为 5 次尝试或 300 秒,然后在 Amazon SQS 队列中写入一条记录。OnFailureConfiguration.Arn在创建订阅者时同时设置两者:如果没有死信队列,则会丢弃耗尽重试次数的事件,唯一的跟踪就是指标。EventsDropped
重试限制
以先达到的限制为准,交货停止。
| 限制 | Range | 默认 |
|---|---|---|
MaxRetryAttempts | 0 到 185 | 5 |
MaxEventAgeInSeconds | 60 到 86,400 | 300 |
默认值比自定义事件总线-经典目标的 24 小时和 185 次尝试短。依赖一天重试的迁移设计必须明确设置为 MaxEventAgeInSeconds 86,400;否则,在目标中断时间超过 5 分钟期间失败的事件将进入死信队列,而不是延迟交付。对于FIFO订阅者,只要重试,失败的事件就会阻塞其组中较晚的事件,因此较长的重试窗口会用顺序换取延迟。
死信记录
记录是 JSON 文档,而不是事件。以下示例显示了两个事件的一条记录,这些事件在一个批次中一起失败。
{ "version": "1.0", "busArn": "arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef", "subscriberArn": "arn:aws:events:us-east-1:111122223333:subscriber/large-orders/EXAMPLEabcdef1234567890", "targetArn": "arn:aws:sqs:us-east-1:111122223333:large-orders", "errorCode": "ACCESS_DENIED", "errorMessage": "The delivery role is not authorized to perform sqs:SendMessage on the target.", "exhaustedRetryCondition": "MaximumEventAgeInSeconds", "retryAttempts": 4, "failedMessages": [ { "eventId": "a1b2c3d4-...", "eventGroupId": "order-1001", "deduplicationId": null, "timestamp": "2026-09-16T18:40:12Z", "targetRequestId": "..." }, { "eventId": "e5f6a7b8-...", "eventGroupId": "order-1001", "deduplicationId": null, "timestamp": "2026-09-16T18:40:13Z", "targetRequestId": "..." } ] }
到达队列的每一次失败都要先重试:没有传送失败会跳RetryPolicy过。 EventBridge 内部的失败会被 EventBridge 无限制地重试,并且永远不会产生记录。下表列出了记录可以携带的代码。 errorMessage被截断为 1,024 个字符。
errorCode | 失败了什么 | errorMessage |
|---|---|---|
CUSTOMER_VALIDATION | 目标 API 拒绝了请求(4xx 响应):值错误、字段缺失、正文格式错误 | 目标 API 自己的消息 |
ACCESS_DENIED | EventBridge 无法担任交付角色,不允许该角色调用目标,或者目标的 Amazon KMS 密钥被拒绝访问 | EventBridge 无法假设role。检查该角色是否存在,以及其信任策略是否允许 EventBridge 服务主体代入该角色。 或者EventBridge 无法访问resource。检查它是否存在,以及是否允许订阅者的交付角色访问它。 |
RESOURCE_NOT_FOUND | 目标或其 Amazon KMS 密钥不存在 | 上面的 “无法访问” 消息,或者一般消息 |
INPUT_TRANSFORMATION_FAILURE | Transformer或通用目标Input表达式抛出或没有产生任何值 | 表达式错误 |
THROTTLING | 目标限制了通话 | 通用消息 |
EXECUTION_TIMEOUT | 目标在内没有回应 InvocationTimeoutSeconds | 通用消息 |
REQUEST_TOO_LARGE | 请求超出了目标的大小限制;较低 MaxBatchSize | 通用消息 |
PARTIAL_BATCH_FAILURE | 目标接受了批次中的一部分,拒绝了其余部分;记录中仅failedMessages列出了被拒绝的事件 | 通用消息 |
RESOURCE_CONFLICT | 目标报告了冲突,例如名称已在使用 | 通用消息 |
KMS_INVALID_STATE | 目标密 Amazon KMS 钥已禁用或待删除 | 通用消息 |
SFN_TYPE_NOT_SUPPORTED | REQUEST_RESPONSE与不支持同步执行的标准状态机一起使用 | 通用消息 |
COMPUTE_EXECUTION_ERROR | REQUEST_RESPONSE函数或执行已运行并报告错误 | 通用消息 |
INVOCATION_DEPENDENCY_INTERNAL | 目标返回服务器错误(5xx 响应) | 通用消息 |
LOOP_DETECTED | 该事件或由其衍生的事件已经通过目标总线;请参阅 回路检测 | 通用消息 |
INTERNAL_SERVER_ERROR | 拨打电话 EventBridge 时内部出现故障,但重试次数仍然耗尽 | 通用消息 |
通用消息是 “投递失败”。调查时使用此记录的错误代码和请求编号,如果故障仍然存在,请联系 Su Amazon pport。 EventBridge 在传递底层消息可能暴露其他服务的内部结构的地方使用它,因此,对于这些代码,errorCode和targetRequestId是要处理的事实,以及包含已发送请求的EVENT_DELIVERY_ATTEMPT日志记录。与 Amazon SQS 消息属性(ERROR_CODE、、、、、ERROR_MESSAGESUBSCRIBER_ARNTARGET_ARN、RETRY_ATTEMPTS)相同的值到达 BUS_ARNEXHAUSTED_RETRY_CONDITION,因此使用者无需解析正文即可通过这些值进行路由。对于 FIFO 订阅者,使用 FIFO 队列作为死信队列; EventBridge 设置事件MessageGroupId中的每条记录EventGroupId,这样一个组的记录就会保持井然有序。
交付角色需要sqs:SendMessage在队列中。如果没有它,该OnFailureDestinationFailed指标就会计算每条无法写入的记录,这些事件就会丢失。
从死信队列中重新驱动事件
队列中保存的是记录,而不是事件,因此您可以通过重播公交车上的事件来重新驾驶。事件必须仍在公交车的保留期内。
-
阅读记录并收集所有记录
failedMessages[].eventId,以及最早和最新的记录timestamp。 -
修复
errorCode名称的原因:角色的策略、目标或表达式。 -
在同一条总线上创建一个具有相同目标和角色的订阅者,
POINT_IN_TIME起始位置StartingPoint为最早的时间戳EndPoint且最新,并对标识符进行SYSTEM_METADATA过滤。 -
订阅者交付事件后,将其删除并从队列中删除记录。
aws eventsv2 create-subscriber \ --name redrive-2026-09-16 \ --event-bus-arn arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef \ --starting-position POINT_IN_TIME \ --point-in-time-configuration '{ "PointType": "TIMESTAMP", "StartingPoint": "2026-09-16T18:40:00Z", "EndPoint": "2026-09-16T18:41:00Z" }' \ --filter-configuration '{ "Filters": [ { "Scope": "SYSTEM_METADATA", "Pattern": "{\"aws:EventId\":[\"a1b2c3d4-...\",\"e5f6a7b8-...\"]}" } ] }' \ --invoke-configuration '{ "TargetArn": "arn:aws:sqs:us-east-1:111122223333:large-orders", "RoleArn": "arn:aws:iam::111122223333:role/EventBusDeliveryRole" }'
重播的事件随之而来 aws:DeliveryTypeREPLAY,因此消费者可以从实时流量中分辨出来。