使用無效字母佇列來處理 中未交付的事件 EventBridge - Amazon EventBridge

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

使用無效字母佇列來處理 中未交付的事件 EventBridge

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

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

當您DLQ為規則的目標設定 時, 會將呼叫失敗的事件 EventBridge 傳送至選取的 Amazon SQS佇列。

事件錯誤以不同的方式進行處理。某些事件會捨棄或傳送至 ,DLQ而不會嘗試任何重試。例如,如果遺失目標的許可或目標資源不再存在所導致的錯誤,在採取動作來解決基礎問題之前,不會重試。 如果您已指定這些事件DLQ, 會直接將這些事件 EventBridge 傳送至目標 。

當事件交付失敗時, 會將事件 EventBridge 發佈至 Amazon CloudWatch 指標,指出目標invocation失敗。如果您使用 DLQ,其他指標會傳送至 , CloudWatch包括 InvocationsSentToDLQInvocationsFailedToBeSentToDLQ

如果您使用 AWS KMS 客戶受管金鑰 加密靜態事件,也可以DLQs指定 事件匯流排。如需詳細資訊,請參閱使用無效字母佇列擷取 中的加密事件錯誤 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。

  • 僅支援標準佇列。您無法在 DLQ中使用 的FIFO佇列 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" 的佇列。佇列必須位於 AWS 帳戶 123456789012 的 us-west-2 區域中。Condition 陳述式僅允許來自名為 "MyTestRule" 的規則的請求,該規則是在 AWS 帳戶 123456789012 的 us-west-2 區域中建立的。

{ "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消費者邏輯 – 將 設定為 Lambda 函數DLQ的事件來源,以耗盡您的 DLQ。

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