使用無效字母佇列來處理未傳遞的事件 EventBridge - Amazon EventBridge

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用無效字母佇列來處理未傳遞的事件 EventBridge

若要避免在事件無法傳遞至目標後遺失,您可以設定無效字母佇列 (DLQ),並將所有失敗的事件傳送至該事件以供稍後處理。

EventBridge DLQs是標準 Amazon SQS 佇列, EventBridge 用於存放無法成功傳遞至目標的事件。建立規則並新增目標時,您可以選擇是否要使用DLQ. 設定時DLQ,您可以保留未成功傳遞的任何事件。然後,您可以解決導致事件交付失敗的問題,並在稍後處理事件。

DLQ為規則的目標設定一個時, EventBridge 會將叫用失敗的事件傳送到選取的 Amazon SQS 佇列。

事件錯誤以不同的方式進行處理。某些事件會捨棄或傳送至,DLQ而不會嘗試任何重試。例如,對於由於缺少對目標的權限而導致的錯誤,或者目標資源不再存在,除非採取動作來解決基礎問題,否則不會發生重試嘗試。 EventBridge 如果您已指定目標DLQ,則會直接將這些事件傳送至目標。

當事件交付失敗時,會將事件 EventBridge 發佈到 Amazon 指 CloudWatch 標,指出目標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:

使用無效字母佇列的考量

配置DLQ用於時,請考慮下列事項 EventBridge。

  • 僅支援標準佇列。您不能將FIFO佇列用於 DLQ in EventBridge。

  • EventBridge 在訊息中包含事件中繼資料和訊息屬性,包括:「錯誤碼」、「錯誤訊息」、「用盡重試條件」、「規則ARN」、「重試嘗試次數」和「目標ARN」。您可以使用這些值來識別事件和失敗原因。

  • 同一帳戶DLQs中的權限:

    • 如果您使用主控台將目標新增至規則,並在同一帳戶中選擇 Amazon SQS 佇列,則會將授予佇列 EventBridge 存取權的資源型政策附加至佇列。

    • 如果您使用的PutTargets操作 EventBridge API來新增或更新規則的目標,並在同一帳戶中選擇 Amazon SQS 佇列,則必須手動授與所選佇列的許可。如需進一步了解,請參閱 將許可授予無效字母佇列

  • 從不同 AWS 帳戶使用 Amazon SQS 佇列的許可。

    • 如果您從主控台建立規則,則不會顯示來自其他帳戶的佇列供您選取。您必須ARN為其他帳戶中的佇列提供,然後手動附加以資源為基礎的策略,以授與佇列的權限。如需進一步了解,請參閱 將許可授予無效字母佇列

    • 如果您使用建立規則API,則必須手動將以資源為基礎的策略附加到另一個帳戶中作為無效字母SQS佇列的佇列。如需進一步了解,請參閱 將許可授予無效字母佇列

  • 您使用的 Amazon SQS 佇列必須位於建立規則的相同區域。

將許可授予無效字母佇列

若要成功地將事件傳遞至佇列, EventBridge 必須具有這樣做的權限。當您指定DLQ使用 EventBridge 主控台時,會自動新增權限。其中包含:

如果您指定DLQ使用API,或使用位於不同 AWS 帳戶的佇列,則必須手動建立以資源為基礎的策略,以授與所需權限,然後將其附加至佇列。

目標無效字母佇列權限範例

以下以資源為基礎的政策示範如何授予將事件訊息傳送 EventBridge 到 Amazon SQS 佇列的必要許可。此原則範例會授與 EventBridge 服務權限,以便使用SendMessage作業將訊息傳送至名為 "MyEventDLQ" 的佇列。佇列必須位於帳戶 123456789012 中的 us-west-2 區域中 AWS 。此Condition陳述式只允許來自帳戶 123456789012 中 us-west-2 區域中建立的名稱為 MyTestRule "" 的規則的請求。 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。如需進一步了解,請參閱 Amazon SQS 許可

如何從無效字母佇列重新傳送事件

您可以通過兩種方式將消息移出:DLQ

  • 避免編寫 Amazon SQS 消費者邏輯 — 將您的作DLQ為 Lambda 函數的事件來源設定為耗盡您的DLQ.

  • 撰寫 Amazon SQS 消費者邏輯 — 使用 Amazon SQS API AWS SDK、或撰寫 AWS CLI 用於輪詢、處理和刪除中訊息的自訂取用者邏輯DLQ。