本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用無效字母佇列來處理 EventBridge 中未交付的事件
若要避免在無法交付至目標後遺失事件,您可以設定無效字母佇列 (DLQ),並將所有失敗事件傳送至事件,以便稍後處理。
EventBridge DLQ 是標準的 Amazon SQS 佇列,EventBridge 用來儲存無法成功傳遞至目標的事件。建立規則並新增目標時,您可以選擇是否使用 DLQ。設定 DLQ 時,您可以保留任何未成功交付的事件。然後,您可以解決導致事件交付失敗的問題,並在稍後處理事件。
當您為規則的目標設定 DLQ 時,EventBridge 會將調用失敗的事件傳送至選取的 Amazon SQS 佇列。
事件錯誤以不同的方式進行處理。有些事件會捨棄或傳送至 DLQ,而不會嘗試任何重試。例如,對於遺失對目標的許可所導致的錯誤,或如果目標資源不再存在,則在採取動作來解決基礎問題之前,不會重試。如果您已指定這些事件, 會直接將這些事件 EventBridge 傳送至目標 DLQ。
當事件交付失敗時,EventBridge 會將事件發佈至 Amazon CloudWatch 指標,指出目標 invocation
失敗。如果您使用 DLQ,則會將其他指標傳送至 CloudWatch,包括 InvocationsSentToDLQ
和 InvocationsFailedToBeSentToDLQ
。
如果您使用 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
下面的影片介紹了設定 DLQ:
使用無效字母佇列的考量
設定 EventBridge 的 DLQ 時請考量下列事項。
-
僅支援標準佇列。您無法在 EventBridge 中將 FIFO 佇列用於 DLQ。
-
EventBridge 在訊息中包含事件中繼資料和訊息屬性,包括:錯誤碼、錯誤訊息、用盡重試條件、規則 ARN、重試嘗試次數和目標 ARN。您可以使用這些值來識別事件和失敗原因。
-
相同帳戶中 DLQ 的許可:
-
如果您使用主控台將目標新增至規則,並在同一帳戶中選擇 Amazon SQS 佇列,則會將授予 EventBridge 存取佇列的資源型政策附加至佇列。
-
如果您使用 EventBridge API 的
PutTargets
操作來新增或更新規則的目標,並在同一帳戶中選取 Amazon SQS 佇列,則必須手動授予所選取佇列的許可。如需進一步了解,請參閱 將許可授予無效字母佇列。
-
-
從不同 AWS 帳戶使用 Amazon SQS 佇列的許可。
-
如果您從主控台建立規則,則不會顯示來自其他帳戶的佇列供您選取。您必須為其他帳戶中的佇列提供 ARN,然後手動附加以資源為基礎的政策,以授予佇列的許可。如需進一步了解,請參閱 將許可授予無效字母佇列。
-
如果您使用 API 建立規則,則必須手動將以資源為基礎的政策附加到另一個帳戶中作為無效字母佇列的 SQS 佇列。如需進一步了解,請參閱 將許可授予無效字母佇列。
-
-
您使用的 Amazon SQS 佇列必須位於建立規則的相同區域。
將許可授予無效字母佇列
若要成功將事件交付至佇列,EventBridge 必須擁有執行此動作的許可。當您使用 EventBridge 主控台指定 DLQ 時,會自動新增許可。其中包含:
當您為規則的目標設定 DLQ 時。
當您為已指定 EventBridge 使用 AWS KMS 客戶受管金鑰 加密靜態事件的事件匯流排設定 DLQ 時。
如需詳細資訊,請參閱使用無效字母佇列擷取 中的加密事件錯誤 EventBridge。
如果您使用 API 指定 DLQ,或使用不同 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
指定將事件傳送至 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 許可。
如何從無效字母佇列重新傳送事件
您可以以下列兩種方式將訊息從無效字母佇列中移出:
-
避免編寫 Amazon SQS 消費者邏輯 - 將無效字母佇列設為 Lambda 函數的事件來源,以耗盡無效字母佇列。
-
寫入 Amazon SQS 消費者邏輯 – 使用 Amazon SQS API、 AWS SDK 或 AWS CLI 來寫入自訂消費者邏輯,以輪詢、處理和刪除 DLQ 中的訊息。