跳至內容

為什麼 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 重試該批次的記錄,直到處理成功或批次過期為止。如需更多資訊,請參閱 Using Lambda to process records from Amazon Kinesis Data Streams (使用 Lambda 處理來自 Amazon Kinesis Data Streams 的記錄)。

解決方法

對 Lambda 函式進行疑難排解

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

  1. 檢查 Amazon CloudWatch 中 Lambda 函式的統計資料設定為 Sum 的 Invocations 指標。Invocations 指標可協助您確認 Lambda 是否調用該函式。

  2. 檢查 IteratorAge 指標,以查看批次中最後一筆記錄的存留期或處理完成的時間。當您的 Lambda 取用者無法調用時,串流的迭代器存留期會增加。如需更多資訊,請參閱 Performance metrics (效能指標)。

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

  4. 確認您的 IAM 角色具有存取 CloudWatch 的適當許可。若要授與 IAM 角色許可,請使用類似下列範例的政策:

    
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource": "*"
        }
      ]
    }
  5. (選用) 如果您遇到許可錯誤,請更新您的 Lambda 函式政策,以同時授與 Kinesis Data Streams 和 CloudWatch 日誌的許可。使用類似下列範例的政策:

    
    {
      "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 (KMS) 加密 Kinesis 資料串流,則取用者和生產者必須擁有適當的存取權。Kinesis 資料串流必須能夠存取您用於加密和解密的 AWS KMS key。Lambda 函式的執行角色還必須具有對 KMS key 的讀取存取權,才能從 Kinesis 資料串流成功讀取資料。

內部 Lambda 函式錯誤

如果內部 Lambda 函式造成錯誤,則表示資料串流處理發生問題。若要避免控制平面 API 限流,請將每個串流限制為 4 至 5 個事件來源對應。這些限制有助於避免使用相同資料串流建立過多事件來源對應。當您使用相同的資料串流建立多個事件來源對應時,可能會違反 Amazon Kinesis 和 Amazon DynamoDB 控制平面限制。

連線逾時錯誤

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

碎片緩慢或停止

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

"Memory used" 錯誤

如果您在 CloudWatch 日誌中看到 "memory used" 錯誤訊息,請增加 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 官方已更新 6 個月前