為什麼我的 Kinesis Data Streams 觸發程式無法調用 Lambda 函數?

2 分的閱讀內容
0

我已將 AWS Lambda 與 Amazon Kinesis Data Streams 整合為事件來源,以處理我的 Amazon Kinesis 資料串流,但未調用此函數。

簡短描述

以下是 Lambda 函數錯誤的常見原因:

  • Lambda 函數執行角色的許可不足
  • 沒有傳入到 Kinesis 資料串流的資料
  • 因重新建立 Kinesis 資料串流、Lambda 函數或 Lambda 執行角色所造成的非作用中事件來源映射
  • Lambda 函數超過執行時間上限,導致 Lambda 函數發生逾時錯誤
  • Lambda 違反其並行執行限制

如果存在 Lambda 函數錯誤,則不會調用您的函數。此函數也不會處理批次中的記錄。錯誤可能會導致 Lambda 重試該批次的記錄,直到處理成功或批次過期為止。如需 Lambda 函數和 Kinesis 錯誤的詳細資訊,請參閱將 AWS Lambda 與 Amazon Kinesis 搭配使用

解決方法

對 Lambda 函數進行疑難排解

若要識別未調用 Lambda 函數的原因,請完成下列步驟:

  1. 檢查 Amazon CloudWatch 中 Lambda 函數的統計資料設定為 SumInvocations 指標。Invocations 指標可協助您驗證是否調用 Lambda 函數。

  2. 檢查 IteratorAge 指標,以查看批次中最後一筆記錄的存留期或處理完成的時間。當您的 Lambda 取用者無法調用時,串流的迭代器存留期會增加。

  3. 檢查 Lambda 函數的 CloudWatch 日誌。日誌的名稱使用 .../aws/lambda/function_name 格式。針對函數錯誤尋找對應的項目。例如,如果由於 Lambda 的 AWS Identity and Access Management (IAM) 角色許可而發生錯誤,請修改 IAM 角色政策。

  4. 確認您的 IAM 角色具有存取 CloudWatch 的適當許可:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource": "*"
        }
      ]
    }
  5. (選用) 如果您遇到許可錯誤,請更新您的 Lambda 函數政策,並授予其對 Kinesis Data Streams 的存取權:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "kinesis:DescribeStream",
            "kinesis:DescribeStreamSummary",
            "kinesis:GetRecords",
            "kinesis:GetShardIterator",
            "kinesis:ListShards",
            "kinesis:ListStreams",
            "kinesis:SubscribeToShard",
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource": "*"
        }
      ]
    }

    **注意:**AWSLambdaKinesisExecutionRole 政策包含這些權限。

其他疑難排解

若要執行其他疑難排解,請完成下列任務:

Lambda 執行函數逾時

如果錯誤與 Lambda 執行函數逾時相關,請增加逾時值以適應更快的處理速度。

AWS KMS 加密的資料串流

如果您使用 AWS Key Management Service (AWS KMS) 加密 Kinesis 資料串流,則取用者和生產者必須擁有適當的存取權。Kinesis 資料串流必須能夠存取用於加密和解密的 AWS KMS 金鑰。Lambda 函數的執行角色還必須具有對 KMS 金鑰的讀取存取權,才能從 Kinesis 資料串流成功讀取資料。

內部 Lambda 函數錯誤

如果錯誤是由內部 Lambda 函數錯誤造成的,則表示串流處理存在問題。若要避免控制平面 API 限流,請將每個串流限制為 4 至 5 個事件來源映射。這些限制有助於避免使用相同資料串流的事件來源映射太多。具有相同串流的多個事件來源映射,可能會導致違反 Kinesis 和 Amazon DynamoDB 控制平面限制。

連線逾時錯誤

如果您收到連線逾時錯誤,請在程式碼中所進行的 API 呼叫前後新增日誌記錄陳述式。然後,識別函數開始失敗的確切程式碼行。

碎片緩慢或停止

如果您的碎片速度緩慢或停止,請將事件來源映射設定為以較小的批次大小重試。您也可以限制重試次數或捨棄較舊的記錄。

「已使用記憶體」錯誤

如果您在 CloudWatch 日誌中看到「已使用記憶體」錯誤訊息,請增加 Lambda 函數的記憶體。

超過逾時上限

如果您超過 Lambda 函數的逾時上限,請修改用戶端程式庫和用戶端逾時。若要根據 Lambda 容器中的剩餘時間修改逾時工作階段,請使用 context.GetRemainingTimeInMillis 函數。context.GetRemainingTimeInMillis 函數會傳回在逾時之前 Lambda 容器中剩餘的時間。

Lambda 函數程式碼錯誤

如果您從 Lambda 函數的程式碼收到錯誤,則表示 Lambda 函數可能正在持續嘗試相同的記錄。使用 try-catch 區塊來捕捉失敗的資料。然後,使用 Amazon Simple Queue Service (Amazon SQS) 佇列或 Amazon Simple Notification Service (Amazon SNS) 主題來記錄它。您也可以將 Lambda 觸發條件新增至 Amazon SQS 佇列,其處理邏輯會分別重試失敗請求。

SQS DLQ

設定 Amazon SQS 無效字母佇列 (DLQ) 以手動調用 Lambda 函數。當您建立或更新 Lambda 函數時,請設定 DeadLetterConfig 屬性。您可以提供 Amazon SQS 佇列或 Amazon SNS 主題作為 DLQ 的 TargetArn。然後,Lambda 會寫入事件物件,並在標準重試政策耗盡之後,對指定端點調用 Lambda 函數。

Lambda 搭配 X-Ray

將 Lambda 與 AWS X-Ray 搭配使用以偵測、分析和最佳化 Lambda 應用程式的效能問題。X-Ray 會從 Lambda 服務收集中繼資料,並產生用於描述影響 Lambda 應用程式效能問題的圖形。例如,如果呼叫需要很長時間才能執行,您可以使用 AWS X-Ray 確認問題。

AWS 官方
AWS 官方已更新 1 年前