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

2 分的閱讀內容
0

我已將 AWS Lambda 與 Amazon Kinesis Data Streams 整合為事件來源,以處理我的 Amazon Kinesis 資料串流。但是,不會調用 Lambda 函數。為什麼會發生這種情況,我該如何解決此問題?

簡短說明

Lambda 函數錯誤通常是由以下原因引起的:

  • Lambda 函數執行角色的權限不足。
  • 沒有傳入到 Kinesis 資料串流的資料。
  • 因重新建立 Kinesis 資料串流、Lambda 函數或 Lambda 執行角色所造成的非作用中事件來源映射。
  • Lambda 函數超過執行時間上限,導致 Lambda 函數發生逾時錯誤。
  • Lambda 違反其並行執行限制。如需 Lambda 違反其限制的詳細資訊,請參閱 AWS 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) 角色政策。

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 執行函數逾時有關,請增加逾時值以適應更快的處理速度。
  • 如果 Kinesis 資料串流已使用 AWS Key Management Service (AWS KMS) 加密,則取用者和生產者必須擁有適當的存取權。Kinesis 資料串流必須能夠存取用於加密和解密的 AWS KMS key。Lambda 函數的執行角色還必須具有對 KMS 金鑰的讀取存取權,才能從 Kinesis 資料串流成功讀取資料。
  • 如果錯誤是由內部 Lambda 函數錯誤造成的,則此錯誤表示串流處理有問題。若要避免控制平面 API 限流,請將每個串流限制為 4 至 5 個事件來源映射。
  • 如果錯誤是由內部 Lambda 函數錯誤造成的,則此錯誤表示串流處理有問題。將每個串流限制為 4 至 5 個事件來源映射,以避免具有相同資料串流的事件來源映射過多。具有相同串流的多個事件來源映射,可能會導致違反 Kinesis 和 Amazon DynamoDB 控制平面限制。
  • 如果您收到連線逾時錯誤,請在程式碼中所進行的 API 呼叫前後新增記錄陳述式。然後即可識別函數開始失敗的確切程式碼行。
  • 如果您遇到緩慢或停止的碎片,請將事件來源映射設定為以較小的批次大小重試。您也可以限制重試次數或捨棄較舊的記錄。
  • 如果您在 CloudWatch 記錄中看到「已使用記憶體」錯誤訊息,請增加 Lambda 函數的記憶體。
  • 如果您超過 Lambda 函數的逾時上限,請修改用戶端程式庫和用戶端逾時。若要根據 Lambda 容器中的剩餘時間修改逾時工作階段,請使用 context.GetRemainingTimeInMillis 函數。context.GetRemainingTimeInMillis 函數會傳回在逾時之前 Lambda 容器中剩餘的時間。
  • 如果您從 Lambda 函數的程式碼收到錯誤,則表示 Lambda 函數可能正在持續嘗試相同的記錄。使用 try-catch 區塊擷取失敗的資料,然後使用 Amazon SQS 佇列或 Amazon SNS 主題進行記錄。您也可以將 Lambda 觸發條件新增至 Amazon SQS 佇列,其處理邏輯會分別重試失敗請求。
  • 設定 Amazon SQS 無效字母佇列 (DLQ) 以手動調用 Lambda 函數。當您建立或更新 Lambda 函數時,請設定 DeadLetterConfig 屬性。您可以提供 Amazon Simple Queue Service (Amazon SQS) 佇列或 Amazon Simple Notification Service (Amazon SNS) 主題,作為 DLQ 的 TargetArn。然後,Lambda 會寫入事件物件,並在標準重試政策耗盡之後,對指定端點調用 Lambda 函數。
  • 搭配使用 AWS Lambda 與 AWS X-Ray 以偵測、分析和最佳化 Lambda 應用程式的效能問題。AWS X-Ray 會從 Lambda 服務收集中繼資料,並產生用於描述影響 Lambda 應用程式效能問題的圖形。例如,如果呼叫需要很長時間才能執行,則可以使用 AWS X-Ray 確認問題。

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