為什麼我的 Lambda 函數沒有被調用,即使它已將 SQS 設定為事件來源?

2 分的閱讀內容
0

我將 AWS Lambda 函數設定為處理 Amazon Simple Queue Service (Amazon SQS) 佇列中的訊息。但是我的 Lambda 函數沒有被調用,也沒有處理佇列的訊息。

解決方法

先決條件

  • 確認 Lambda 函數已將 Amazon SQS 設定為事件來源。
  • 確認 Lambda 函數的 AWS Identity and Access Management (IAM) 角色具有從 SQS 佇列擷取訊息所需的許可。
  • 檢查函數的 Amazon CloudWatch 指標是否有調用和 SQS 佇列,以確認佇列中有可用的訊息。如果看不見訊息或傳送到 SQS 佇列,請確定生產者具有必要的權限。使用者或角色必須具有下列 Amazon SQS 和 AWS Key Management Service (AWS KMS) 權限:
    sqs:SendMessage
    kms:GenerateDataKey
    kms:Decrypt

**注意:**如果佇列未加密,則不需要 AWS KMS 權限。

檢查 Lambda 函數和 SQS 佇列網址是否正確

確認 Lambda 函數上事件來源映射的 Lambda 函數 Amazon Resource Name (ARN) 和 SQS 佇列網址是否正確。另外,開啟事件來源映射。

  1. 開啟 Lambda 主控台
  2. 在導覽窗格中,選擇函數
  3. 選取您要檢查的功能。
  4. 選擇 SQS 觸發條件並展開它以檢查 SQS 佇列網址是否正確。此外,請確認觸發狀態已開啟。如需詳細資訊,請參閱為什麼我的 Lambda Amazon SQS 觸發條件已停用?

若要執行這些檢查,您也可以執行 list-event-source-mapping 命令。

範例:

aws lambda list-event-source-mappings --function-name <my-function> --region <region-name>

**注意:取代<my-function>您的 Lambda 函數名稱,並取代<region name>**您的 AWS 區域。

檢查 Lambda 函數權限

如果 Lambda IAM 角色具備從 SQS 佇列輪詢訊息的權限,請檢查 SQS 佇列的存取政策。尋找可能限制 Lambda 函數的拒絕規則。

  1. 開啟Amazon SQS 主控台
  2. 在導覽窗格中,選擇佇列
  3. 選取 SQS 佇列,然後選擇存取政策索引標籤。
  4. 檢閱可能封鎖 Lambda 流量的任何拒絕政策。如果有封鎖流量的政策,請在拒絕陳述式中新增條件,以忽略來自 Lambda 的請求。

您的 Lambda 函數 IAM 必須具有下列權限:

  • DeleteMessage
  • GetQueueAttributes
  • ReceiveMessage

檢查佇列的加密設定

如果佇列已加密,則 Lambda 函數的 IAM 角色需具備執行 AWS KMS 動作的權限。如果沒有需要的權限,Lambda 函數就無法使用 SQS 佇列的訊息。如果 Amazon SQS 佇列是使用 AWS KMS 加密設定,請完成下列任務:

  • 確定 AWS KMS key 存在。
  • 確定 Lambda 函數角色具有 kms:Decrypt 權限
  • 確定 AWS KMS key 政策權限已設定為允許 Lambda 角色中的動作。

**注意:**使用 Amazon SQS 佇列預設金鑰 (Amazon SQS 的 AWS KMS key) 無法在其他 AWS 帳戶中調用 Lambda 函數。

檢查特定的 Lambda 函數是否節流

Lambda 具有區域並行限制。如果 AWS 區域的其他函數主動使用此容量達到最大值,則該函數可能會出現節流。即使函數本身沒有達到最大容量,也可能發生這種情況。

如果您在函數上將保留並行設定為 0,則該函數不會發生調用。來自 Amazon SQS 的所有訊息都受到節流。在 Amazon CloudWatch 中檢查區域 ConcurrentExecutions (最大值) 指標,以及函數的節流 (總和) 指標。驗證是否已達到區域容量,以及函數是否存在任何節流。確保有足夠的容量調用函數並處理 SQS 訊息。

確認相同的 SQS 佇列上沒有其他作用中取用者

如果 SQS 佇列中有多個有效客戶,則這些客戶可能會使用您的訊息。SQS 訊息專為一位客戶而設計,可同時使用訊息。如果其他客戶正在使用 SQS 佇列,則當您的 Lambda 函數輪詢 SQS 佇列時,可能不會收到任何訊息。使用 Amazon SQS 主控台驗證沒有其他 Lambda 調用或 Amazon SQS 調用作用中。

**注意:**其他客戶可能會以程式設計方式從 SQS 佇列中提取訊息。這些提取不會顯示在主控台。

檢查 SQS 事件來源是否已設定篩選條件

檢查 SQS 事件來源是否已設定任何篩選條件。如果您的 SQS 事件來源設定使用篩選條件,請確保您沒有篩選掉任何 Amazon SQS 訊息。

  1. 開啟 Lambda 主控台
  2. 在導覽窗格中,選擇函數
  3. 選取您要檢查的功能。
  4. 選擇 SQS 觸發條件,然後驗證篩選條件。如果觸發條件設定未顯示金鑰名稱,則不會設定篩選條件。如果已設定篩選條件,請檢閱篩選條件以確認它允許 Lambda 處理有效訊息。若要暫時移除篩選條件,請選擇編輯
  5. 如果在移除篩選條件後調用函數,請修改篩選條件以符合您的使用案例。

如需詳細資訊,請參閱使用 Amazon SQS 篩選實作 Lambda 事件篩選條件的最佳實務

相關資訊

搭配 Amazon SQS 使用 Lambda

為什麼我的 Lambda 函數與 Amazon SQS 事件來源無法達到最佳擴展?

為什麼我的 Lambda 函數正在重試有效的 Amazon SQS 訊息,並將它們放入我的無效字母佇列中?

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