跳至內容

如何對 EventBridge 規則的問題進行疑難排解?

2 分的閱讀內容
0

我想解決 Amazon EventBridge 規則未觸發目標的問題。

簡短描述

若要解決未觸發目標的 EventBridge 規則,請完成以下步驟:

  1. 確認相關事件是否已發生。
  2. 確認事件與規則事件模式相符。
  3. 確認目標已成功處理事件。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

確認相關事件是否已發生

請執行下列動作:

  • 如果 AWS CloudTrail 已擷取事件,請分析 CloudTrail 日誌。驗證 API 呼叫是否在預期時間內發生,並與事件模式中的所有欄位相符。
    **注意:**部分 AWS 服務僅在 us-east-1 區域提供。例如,AWS Identity and Access Management (IAM) API 呼叫僅在 us-east-1 AWS 區域發佈。如果您在另一個區域中建立了規則,則這些事件不會轉送到 EventBridge,並且不會觸發該規則。
  • EventBridge 主控台提供了包含範例 AWS 和合作夥伴事件的沙盒工具。使用該工具將事件模式與 AWS、合作夥伴和自訂事件進行比對。或者,使用 TestEventPattern API 來確認事件模式與事件之間的比對。
  • EventBridge 提供 TriggeredRules 指標來報告成功比對的事件規則。使用 TriggeredRules 指標的時間戳記來查看事件發生的時間。

查看 CloudWatch 指標

若要查看 EventBridge 規則的 Amazon CloudWatch 指標,請完成以下步驟:

  1. 開啟 CloudWatch console (CloudWatch 主控台)。
  2. 選取所有指標
  3. 選取 AWS/Events 命名空間。
  4. 為規則選取 TriggeredRulesInvocationsFailedInvocations 指標。
    **注意:**您可以使用 SUM 統計資料來查看這些指標。

確認事件與規則事件模式相符

若要比對事件,事件模式中的所有欄位必須相符。使用沙盒工具,測試事件與具有數個欄位的事件模式。使用如下的簡單事件模式:

{    "source": ["aws.s3"]
}

如果比對成功,請增加事件模式的複雜度。新增至事件模式的每個欄位都會篩選與其相符的事件,並使其比對範圍更為精確。若要取得精確的模式,使用者可以暫時附加 CloudWatch Logs 群組目標或 Amazon Simple Notification Service (Amazon SNS) 主題。此動作會擷取轉送至目標的事件,或隔離目標組態錯誤。這還可確認事件是否已傳遞至目標,以及輸入轉換器是否設定正確。

根據傳遞給目標的事件,重新撰寫模式以符合使用者需求。以下是事件模式範例:

{  "source": [
    "aws.s3"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventName": [
      "PutObject",
      "DeleteObject",
      "DeleteObjects"
    ],
    "requestParameters": {
      "bucketName": [
        "123456789012-prod-app1"
      ],
      "key": [
        {
          "prefix": "feature1/"
        },
        {
          "prefix": "feature2/"
        }
      ]
    }
  }
}

**注意:**此模式會將 Amazon Simple Storage Service (Amazon S3) API 呼叫清單,與以 feature1feature2 開頭之物件的特定儲存貯體進行比對。

您可以逐步新增欄位來隔離與事件不符的欄位。

確認目標已成功處理事件

當規則將事件轉送到顯示成功和失敗調用的目標時,調用指標會發佈一個資料點。EventBridge 在永久無法調用目標時,會發佈 FailedInvocations 資料點。此資料點表示目標組態存在問題或權限不足。

EventBridge 必須具有調用目標所需的權限。IAM 角色資源政策可以授予目標權限。當您使用 EventBridge 建立規則時,主控台會自動將所需的權限新增至相關資源。

**注意:**如果您使用 AWS SDK、AWS Command Line Interface (AWS CLI) 或 AWS CloudFormation 部署規則,請設定權限。

如果沒有任何 FailedInvocations 資料點,則 EventBridge 已成功將事件傳送到目標。但是,目標可能無法正確運作。例如,AWS Lambda 目標在執行或限流時可能會遇到錯誤。如需更多資訊,請查看目標的 CloudWatch 指標和任何相關日誌。

若要確定 FailedInvocations 的原因,請將 Amazon Simple Queue Service (Amazon SQS) 無效字母佇列 (DLQ) 與目標關聯。

若要在目標上設定 DLQ,請完成以下步驟:

  1. 建立一個 SQS 佇列。
  2. 選取事件規則,然後選擇 Edit (編輯)。
  3. 選擇 Targets (目標) 索引標籤,然後選擇 Edit (編輯)。
  4. 展開要設定重試政策之目標的 Additional settings (其他設定) 索引標籤。
  5. Dead-letter queue (無效字母佇列) 區段,根據您的 SQS DLQ 是位於同一帳戶還是不同帳戶中,選取相應的選項。
  6. 選擇選取目前 AWS 帳戶中的一個 Amazon SQS 佇列作為無效字母佇列,然後選取 SQS 佇列的名稱。
  7. 選擇 Update (更新)。

如果規則調用失敗,則 DLQ 會記錄錯誤訊息。若要查看錯誤,請完成以下步驟:

  1. 從 SQS 佇列中,選擇 Send and receive (傳送和接收) 訊息。
  2. 選擇 Poll for messages (輪詢訊息)。
  3. 選取錯誤訊息,然後前往 Attributes (屬性) 區段。

以下是來自 DLQ 的訊息範例,顯示 EventBridge 沒有調用 Lambda 目標所需的權限:

"MessageAttributes": {                "ERROR_CODE": {
                    "StringValue": "NO_PERMISSIONS",
                    "DataType": "String"
                },
                "ERROR_MESSAGE": {
                    "StringValue": "User: events.amazonaws.com is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:123456789012:function:Hello_World because no resource-based policy allows the lambda:InvokeFunction action (Service: AWSLambdaInternal; Status Code: 403;
Error Code: AccessDeniedException; Request ID: 6635c4c4-9c54-416e-bc40-ef25bad0aca5; Proxy: null)",
                    "DataType": "String"
                },

相關資訊

對 Amazon EventBridge 進行疑難排解

為什麼 EventBridge 規則沒有觸發 Lambda 函式?

如何對 EventBridge 排程器的錯誤進行疑難排解?

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

AWS 官方已更新 8 個月前