為什麼 Kinesis Data Streams 觸發程式無法調用 Lambda 函數?
我已將 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 函數的統計資料設定為 Sum 的 Invocations 指標。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 確認問題。
相關內容
- 已提問 9 個月前lg...
- 已提問 8 個月前lg...
- 已提問 1 年前lg...
- 已提問 10 個月前lg...
- AWS 官方已更新 2 個月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 5 個月前