

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

# Amazon EventBridge 疑難排解
<a name="eb-troubleshooting"></a>

您可以使用本節中的主題來疑難排解 Amazon EventBridge 問題。

**提示**  
若要驗證您的事件模式是否符合預期的事件，您可以使用 EventBridge 沙盒來針對範例事件測試事件模式。如需詳細資訊，請參閱[使用 EventBridge 沙盒測試事件模式](eb-event-pattern-sandbox.md)。

**Topics**
+ [我的規則可以運行，但是我的 Lambda 函數未被調用](#eb-lam-function-not-invoked)
+ [我剛建立或修改規則，但不符合測試事件](#eb-rule-does-not-match)
+ [我的規則在 `ScheduleExpression` 中我指定的時間沒有運行](#eb-rule-did-not-trigger)
+ [我的規則並未在我預期的時間運行](#eb-rule-did-not-trigger-on-time)
+ [我的規則符合 AWS 全域服務 API 呼叫，但未執行](#eb-rule-did-not-trigger-iam)
+ [規則執行時，會忽略與我的規則關聯的 IAM 角色](#eb-iam-role-ignored)
+ [我的規則有一個應該匹配資源的事件模式，但沒有事件匹配](#eb-events-do-not-match-rule)
+ [我的事件交付到目標時發生延遲](#eb-delayed-event-delivery)
+ [部分事件從未交付至我的目標](#eb-never-delivered-to-target)
+ [在回應一個事件時，規則的運行次數超過一次](#eb-rule-triggered-more-than-once)
+ [防止無限迴圈](#eb-prevent-infinite-loops)
+ [我的事件不會傳送到目標 Amazon SQS 佇列](#eb-sqs-encrypted)
+ [我的規則運行，但我沒看到任何訊息發佈到我的 Amazon SNS 主題](#eb-no-messages-published-sns)
+ [我的 Amazon SNS 主題仍有 EventBridge 的許可，即使我已刪除與 Amazon SNS 主題關聯的規則](#eb-sns-permissions-persist)
+ [我可以在 EventBridge 中使用哪些 IAM 條件金鑰？](#eb-supported-access-policies)
+ [我要如何知道 EventBridge 規則已損壞？](#eb-create-alarm-broken-event-rules)

## 我的規則可以運行，但是我的 Lambda 函數未被調用
<a name="eb-lam-function-not-invoked"></a>

您的 Lambda 函數可能無法執行的原因之一是您未擁有正確的許可。

**檢查 Lambda 函數的許可**

1. 使用 AWS CLI，使用您的 函數和 AWS 區域執行下列命令：

   ```
   aws lambda get-policy --function-name MyFunction --region us-east-1
   ```

   您應該會看到下列輸出。

------
#### [ JSON ]

****  

   ```
   {
   "Version":"2012-10-17",		 	 	 
   "Statement": [
   {
   "Condition": {
   "ArnLike": {
   "AWS:SourceArn": "arn:aws:events:us-east-1:123456789012:rule/rule-name"
   }
   },
   "Action": "lambda:InvokeFunction",
   "Resource": "arn:aws:lambda:us-east-1:123456789012:function:function-name",
   "Effect": "Allow",
   "Principal": {
   "Service": "events.amazonaws.com"
   },
   "Sid": "MyId"
   }
   ],
   "Id": "default"
   }
   ```

------

1. 如果您看到以下錯誤訊息。

   ```
   A client error (ResourceNotFoundException) occurred when calling the GetPolicy operation: The resource you requested does not exist.
   ```

   或者，您有看到輸出，但無法將 events.amazonaws.com 配置為政策中的信任實體，請執行下列命令：

   ```
   aws lambda add-permission \
   --function-name MyFunction \
   --statement-id MyId \
   --action 'lambda:InvokeFunction' \
   --principal events.amazonaws.com \
   --source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule
   ```

1. 如果輸出包含 `SourceAccount` 欄位，那麼您需要將其移除。`SourceAccount` 設定會使 EventBridge 無法調用該函數。

**注意**  
如果政策不正確，您也可以在 EventBridge 主控台中，藉由移除它再重新新增到規則來編輯[規則](eb-rules.md)。然後，EventBridge 主控台會在[目標](eb-targets.md)上設定正確的許可。  
如果您使用特定的 Lambda 別名或版本，如下列命令所示，您必須將 `--qualifier` 參數新增至 `aws lambda get-policy` 和 `aws lambda add-permission` 命令。  

```
aws lambda add-permission \
--function-name MyFunction \
--statement-id MyId \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule
--qualifier alias or version
```

## 我剛建立或修改規則，但不符合測試事件
<a name="eb-rule-does-not-match"></a>

當您變更[規則](eb-rules.md)或其[目標](eb-targets.md)，連入[事件](eb-events.md)可能不會立即開始或停止比對新的或更新的規則。允許一小段時間來讓變更生效。

如果短時間後事件仍然不相符，請檢查用於規則的 CloudWatch 指標 `TriggeredRules`、`Invocations` 和 `FailedInvocations`。如需有關這些指標的詳細資訊，請參閱[監控 Amazon EventBridge](eb-monitoring.md)。

如果規則旨在符合 AWS 服務的事件，請執行下列其中一項動作：
+ 使用此 `TestEventPattern` 動作可測試規則與測試事件相符的事件模式。如需詳細資訊，請參閱《Amazon EventBridge API 參考》**中的 [TestEventPattern](https://docs.aws.amazon.com/AmazonCloudWatchEvents/latest/APIReference/API_TestEventPattern.html)。
+ 使用 [EventBridge 主控台](https://console.aws.amazon.com/events)上的**沙盒**。

## 我的規則在 `ScheduleExpression` 中我指定的時間沒有運行
<a name="eb-rule-did-not-trigger"></a>

請確定您已設定[規則](eb-rules.md)在 UTC\$10 時區的排程。如果 `ScheduleExpression` 正確，請按照 [我剛建立或修改規則，但不符合測試事件](#eb-rule-does-not-match) 中的步驟動作。

## 我的規則並未在我預期的時間運行
<a name="eb-rule-did-not-trigger-on-time"></a>

EventBridge 會在您設定的開始時間的一分鐘內執行[規則](eb-rules.md)。一旦您建立規則，執行時間的倒數計數將立即開始。

**注意**  
已排程規則具有 `guaranteed` 意義事件的交付類型，每個預期的時間至少會觸發一次。

您可以使用 cron 表達式在指定的時間調用[目標](eb-targets.md)。若要建立在第 0 分鐘每四小時執行一次的規則，請執行下列其中一項：
+ 在 EventBridge 主控台中，您可以使用 cron 表達式 `0 0/4 * * ? *`。
+ 使用 AWS CLI，您可以使用表達式 `cron(0 0/4 * * ? *)`。

例如，若要使用 建立名為 `TestRule` 的規則，以每 4 小時執行一次 AWS CLI，請使用下列命令。

```
aws events put-rule --name TestRule --schedule-expression 'cron(0 0/4 * * ? *)'
```

若要每五分鐘執行一次規則，請使用下列 cron 表達式。

```
aws events put-rule --name TestRule --schedule-expression 'cron(0/5 * * * ? *)'
```

使用 Cron 表達式的 EventBridge 規則的最佳解析度為一分鐘。您的排程規則會在此一分鐘內運行，但不會精確地在第 0 秒時觸發。

由於 EventBridge 和目標服務是分散式的，所以從排定的規則執行的時間到目標服務對目標資源執行動作的時間之間，可能會有幾秒鐘的延遲。

## 我的規則符合 AWS 全域服務 API 呼叫，但未執行
<a name="eb-rule-did-not-trigger-iam"></a>

AWS 全域服務；例如 IAM 和 Amazon Route 53 僅適用於美國東部 （維吉尼亞北部） 區域，因此來自全球服務的 AWS API 呼叫事件只能在該區域使用。如需詳細資訊，請參閱[來自 AWS 服務的事件](eb-events.md#eb-service-event)。

## 規則執行時，會忽略與我的規則關聯的 IAM 角色
<a name="eb-iam-role-ignored"></a>

EventBridge 僅會將 IAM 角色用於傳送[事件](eb-events.md)至 Kinesis 串流的[規則](eb-rules.md)。針對調用 Lambda 函數或 Amazon SNS 主題的規則，您需要提供[資源型許可](eb-use-resource-based.md)。

請確定您的區域 AWS STS 端點已啟用，以便 EventBridge 可以在擔任您提供的 IAM 角色時使用它們。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[AWS STS 在 AWS 區域中啟用和停用](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)。

## 我的規則有一個應該匹配資源的事件模式，但沒有事件匹配
<a name="eb-events-do-not-match-rule"></a>

中的大多數服務會將冒號 (：) 或斜線 (/) AWS 視為 Amazon Resource Name (ARNs) 中的相同字元，但 EventBridge 在[事件模式](eb-event-patterns.md)和[規則](eb-rules.md)中使用完全相符。在建立事件模式時，請務必使用正確的 ARN 字元，使這些字元符合要匹配的[事件](eb-events.md)中的 ARN 語法。

有些事件，例如來自 CloudTrail 的 AWS API 呼叫事件，在資源欄位中沒有任何內容。

## 我的事件交付到目標時發生延遲
<a name="eb-delayed-event-delivery"></a>

EventBridge 交付[事件](eb-events.md)到[目標](eb-targets.md)的時間最長為 24 個小時，但您的目標資源受限時例外。第一次嘗試會在事件送達事件串流後立即執行。但是，如果目標服務發生問題，EventBridge 會自動重新排程另一次交付。如果事件到達之後已經過 24 小時，EventBridge 會停止嘗試交付事件，並在 CloudWatch 中發佈 `FailedInvocations` 指標。建議您設定 DLQ 來儲存無法成功交付至目標的事件。如需詳細資訊，請參閱[使用無效字母佇列來處理 EventBridge 中未傳遞的事件](eb-rule-dlq.md)

## 部分事件從未交付至我的目標
<a name="eb-never-delivered-to-target"></a>

如果 EventBridge [規則](eb-rules.md)的[目標](eb-targets.md)受限很長一段時間，EventBridge 可能不會重試傳遞。例如，如果未佈建目標來處理傳入[事件](eb-events.md)流量，且目標服務正在調節代表您提出的要求，則 EventBridge 可能不會重試交付。

## 在回應一個事件時，規則的運行次數超過一次
<a name="eb-rule-triggered-more-than-once"></a>

在極少數情況下，單一[事件](eb-events.md)或排程時間可運行相同的[規則](eb-rules.md)一次以上，或者特定觸發的規則可多次調用相同的[目標](eb-targets.md)。

## 防止無限迴圈
<a name="eb-prevent-infinite-loops"></a>

在 EventBridge 中，您可以建立[規則](eb-rules.md)，該規則會導致無限迴圈，並且規則會在循環中重複運行。如果您有導致無限迴圈的規則，請將其重新寫入，讓規則採取的動作不符合相同的規則。

例如，如果規則會偵測到 Amazon S3 儲存貯體上的 ACL 已變更，然後執行軟體來將它們變更為新狀態的規則會導致無限迴圈。解決此問題的一種方法是重寫規則，讓其僅匹配處於不良狀態的 ACL。

無限循環可能會快速引發較預期還高的費用。我們建議您使用預測費用，也就是在費用超過您指定的限制時提醒您。如需詳細資訊，請參閱[在符合預算的情形下管理成本](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/budgets-managing-costs.html)。

## 我的事件不會傳送到目標 Amazon SQS 佇列
<a name="eb-sqs-encrypted"></a>

如果您的 Amazon SQS 佇列已加密，則必須建立客戶管理的 KMS 金鑰，並在 KMS 金鑰政策中包含下列許可區段。如需詳細資訊，請參閱[設定 AWS KMS 許可](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-key-management.html#sqs-what-permissions-for-sse)。

```
{
  "Sid": "Allow EventBridge to use the key",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Resource": "*"
}
```

## 我的規則運行，但我沒看到任何訊息發佈到我的 Amazon SNS 主題
<a name="eb-no-messages-published-sns"></a>

**案例 1**

您需要許可才能將訊息發佈到您的 Amazon SNS 主題中。使用 使用以下命令 AWS CLI，將 us-east-1 取代為您的區域，並使用您的主題 ARN。

```
aws sns get-topic-attributes --region us-east-1 --topic-arn "arn:aws:sns:us-east-1:123456789012:MyTopic"
```

若要擁有正確的許可，您的策略屬性類似於以下內容。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "__default_policy_ID",
    "Statement": [
    {
    "Sid": "__default_statement_ID",
    "Effect": "Allow",
    "Principal": {
    "AWS": "*"
    },
    "Action": [
    "SNS:Subscribe",
    "SNS:ListSubscriptionsByTopic",
    "SNS:DeleteTopic",
    "SNS:GetTopicAttributes",
    "SNS:Publish",
    "SNS:RemovePermission",
    "SNS:AddPermission",
    "SNS:SetTopicAttributes"
    ],
    "Resource": "arn:aws:sns:us-east-1:123456789012:MyTopic",
    "Condition": {
    "StringEquals": {
    "AWS:SourceOwner": "123456789012"
    }
    }
    },
    {
    "Sid": "Allow_Publish_Events",
    "Effect": "Allow",
    "Principal": {
    "Service": "events.amazonaws.com"
    },
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:us-east-1:123456789012:MyTopic"
    }
    ]
    }
```

------

如果您在原則中看不到具有 `Publish` 許可的 `events.amazonaws.com` 情況下，請先複製目前的政策，然後將下列陳述式新增至陳述式清單中。

```
{\"Sid\":\"Allow_Publish_Events\",
\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"},
\"Action\":\"sns:Publish\",
\"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\"}
```

然後使用 設定主題屬性 AWS CLI，並使用以下命令。

```
aws sns set-topic-attributes --region us-east-1 --topic-arn "arn:aws:sns:us-east-1:123456789012:MyTopic" --attribute-name Policy --attribute-value NEW_POLICY_STRING
```

**注意**  
如果政策不正確，您也可以在 EventBridge 主控台中，藉由移除它再重新新增到規則來編輯[規則](eb-rules.md)。EventBridge 會在[目標](eb-targets.md)上設定正確的許可。

**案例 2**

如果您的 SNS 主題已加密，您必須在 KMS 金鑰政策中包含下列區段。

```
{
  "Sid": "Allow EventBridge to use the key",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Resource": "*"
}
```

## 我的 Amazon SNS 主題仍有 EventBridge 的許可，即使我已刪除與 Amazon SNS 主題關聯的規則
<a name="eb-sns-permissions-persist"></a>

當您建立以 Amazon SNS 為[目標](eb-targets.md)的[規則](eb-rules.md)時，EventBridge 會代表您將許可新增到您的 Amazon SNS 主題。如果您在建立規則之後很快就刪除該規則，EventBridge 可能會無法從您的 Amazon SNS 主題移除許可。如果發生這種情況，您可以透過使用 `aws sns set-topic-attributes` 命令從該主題移除許可。如需有關傳送事件之資源型許可的詳細資訊，請參閱 [將以資源為基礎的政策用於 Amazon EventBridge](eb-use-resource-based.md)。

## 我可以在 EventBridge 中使用哪些 IAM 條件金鑰？
<a name="eb-supported-access-policies"></a>

EventBridge 支援 AWS全局條件金鑰 （請參閱《[IAM 使用者指南》中的 IAM 和 AWS STS 條件內容金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html))，以及 列出的金鑰[在 Amazon EventBridge 中使用 IAM 政策條件](eb-use-conditions.md)。 **

## 我要如何知道 EventBridge 規則已損壞？
<a name="eb-create-alarm-broken-event-rules"></a>

您可以使用以下警示，在您的 EventBridge [規則](eb-rules.md)失效時通知您。

**建立警示以在規則損壞時發出提醒**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 選擇**建立警示**。在**依類別的 CloudWatch 指標**窗格中，選擇**事件指標**。

1. 在的指標清單中，選取 **FailedInvocations**。

1. 在圖形上方，選擇**統計數據**、**總和**。

1. 在**期間**中選擇一個值，例如 **5 分鐘**。選擇**下一步**。

1. 在**警示閾值**之下的**名稱**中輸入警示的唯一名稱，例如 **myFailedRules**。在**描述**中輸入警示的描述，例如**規則不會將事件交付至目標**。

1. 在**是** 中選擇 **>=** 和 **1**。在 **for** 中輸入 **10**。

1. 在**動作**下的 **每當此警示**，選擇**狀態為警示**。

1. 在**傳送通知至**中選取現有 Amazon SNS 主題或建立新的主題。若要建立新的主題，請選擇**新清單**。輸入新 Amazon SNS 主題的名稱，例如：**myFailedRules**。

1. 在 **Email list (電子郵件清單)** 中輸入以逗號分隔的電子郵件地址清單，當警示變更為 **ALARM (警示)** 狀態時，這些電子郵件地址將會收到通知。

1. 選擇**建立警示**。