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

2 分的閱讀內容
0

我想對我使用 AWS Command Line (AWS CLI) 建立之 Amazon EventBridge 規則不會調用 AWS Lambda 函數的原因進行疑難排解。

簡短描述

請使用以下步驟識別問題:

  1. 確認事件來源已發佈事件並觸發相關聯的 Amazon EventBridge 規則。
  2. 確認 EventBridge 規則已調用設定的目標。
  3. 如果目標調用失敗,請確保 AWS Lambda 函數在其資源政策中擁有適當權限。

解決方案

注意: 如果您在執行 AWS CLI 命令時收到錯誤,請確定您使用的是最新版本的 AWS CLI

檢閱 EventBridge 規則的 CloudWatch 指標

  1. 開啟 Amazon CloudWatch 主控台
  2. 在左側導覽窗格的指標下,選擇所有指標
  3. 選取 AWS/Events 命名空間。
  4. 為相關規則選取 TriggerRulesInvocationsFailedInvocations (如有) 指標。如有必要,請使用 SUM 統計資料檢閱這些指標。
    注意: TriggerRules 資料點表示事件觸發了 EventBridge 規則。Invocation 資料點表示 EventBridge 規則調用了對應目標。如果指標包括 FailedInvocations 資料點,則這些表示該規則可能無法調用目標。FailedInvocations 代表永久失敗,而且可能因不正確權限或設定錯誤的目標所造成。

確認 Lambda 函數的資源政策擁有適當權限

建立以 Lambda 函數作為目標的 EventBridge 規則時,請記住以下幾點:

  • 當您使用 Amazon EventBridge 主控台建立規則時,主控台即會將適當權限自動新增至函數的資源政策
  • 當您使用 AWS CLI、SDK 或 AWS CloudFormation 建立規則時,您必須在資源政策中手動套用權限。

這些權限會授予 Amazon EventBridge 服務存取權限以調用 Lambda 函數。

檢閱與目標 Lambda 函數相關聯的權限

請執行下列步驟:

  1. 開啟 AWS Lambda 主控台
  2. 選擇目標 Lambda 函數。
  3. 選擇組態索引標籤,然後選擇權限
  4. 資源型政策區段下,檢閱政策文件。

或者,將 GetPolicy API 或 get-policy AWS CLI 命令與適當輸入搭配使用,以擷取 Lambda 函數的資源政策。

以下範例顯示允許 EventBridge 調用 Lambda 函數的資源政策:

{
  "Effect": "Allow",
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:region:account-id:function:function-name",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "arn:aws:events:region:account-id:rule/rule-name"
    }
  },
  "Sid": "InvokeLambdaFunction"
}

注意: 將 ARN 取代為適當的區域、帳戶 ID 及資源名稱。

更新資源政策

如果您需要更新資源政策,請執行下列步驟:

  1. 開啟 AWS Lambda 主控台
  2. 選擇目標 Lambda 函數。
  3. 選擇組態索引標籤,然後選取權限
  4. 資源型政策區段中,選擇新增權限
  5. 選取 AWS Service:EventBridge (CloudWatch Events)
  6. 提供陳述式 ID (Sid) 作為政策陳述式的選用識別碼。
  7. 提供主體作為 events.amazonaws.com
    注意: 通常會自動填入。
  8. 提供來源 ARN 作為 EventBridge 規則的 ARN。
  9. 動作中,從下拉式清單中選取 lambda:InvokeFunction
  10. 選擇儲存

您也可以使用 AddPermission API 或 AWS Lambda add-permission AWS CLI 命令更新政策。

例如:

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

將 Amazon SQS 無效字母佇列新增至目標

EventBridge 使用 Amazon Simple Queue Service (Amazon SQS) DLQs 儲存無法傳送到目標的事件。將 Amazon SQS DLQ 連接到目標報告 FailedInvocations。從 DLQ 擷取事件以進行分析,並且取得更多關於該問題的內容。修復後,即可將失敗的事件重新傳送到目標以進行處理。

  1. EventBridge 主控台中開啟相關規則。
  2. 目標下,選取編輯,然後展開其他設定區段。
  3. 無效字母佇列下,選擇在目前的 AWS 帳戶中選取 Amazon SQS 註冊以作為無效字母佇列使用
  4. 選取要作為 DLQ 使用的 SQS 佇列。
  5. 指派 DLQ 後,請完成編輯規則區段中的剩餘步驟以儲存變更。

相關資訊

我的規則已執行,但並未調用 Lambda 函數

為 Amazon EventBridge 使用資源型政策: AWS Lambda 權限

事件重試政策和使用無效字母佇列

改善了 Amazon EventBridge 的失敗復原能力

AWS 官方
AWS 官方已更新 6 個月前