針對 Lambda 中的執行問題進行疑難排解 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

針對 Lambda 中的執行問題進行疑難排解

當 Lambda 執行時間執行您的函數程式碼時,可能會在已經處理事件一段時間的函數執行個體上處理事件,或是需要初始化新的執行個體。函數初始化期間、您的處理器程式碼處理事件時,或是您的函數傳回回應時 (或是無法傳回時),都可能會發生錯誤。

造成函數執行錯誤的可能原因包含了您程式碼、函數組態、下游資源或是許可的問題。如果您直接叫用您的函數,您會在 Lambda 的回應中看到函數錯誤。如果您透過事件來源映射或是其他服務以非同步方式叫用您的函數,您可能會在日誌、無效字母佇列或是失敗的目的地上找到錯誤。錯誤處理選項和重試行為會因您叫用函數的方式,以及錯誤的類型而有所不同。

當您的函數程式碼或 Lambda 執行時間傳回錯誤時,Lambda 回應中的狀態碼將會是 200 OK。名為 X-Amz-Function-Error 的標頭指示回應中存在錯誤。400 和 500 系列的狀態碼為叫用錯誤預留。

Lambda:執行時間太長

問題:函數執行時間過長。

如果您的程式碼在 Lambda 中執行的時間比在本機機器上長,可能是因為函數可用的記憶體或處理能力受到限制。使用額外的內存配置功能以增加內存和CPU.

Lambda:日誌或追蹤沒有出現

問題:記錄檔不會出現在 CloudWatch 記錄檔中。

問題:追蹤不會出現在中 AWS X-Ray。

您的功能需要許可才能調用 CloudWatch 日誌和 X-Ray。更新其執行角色以授予許可。新增下列受管政策來啟用日誌和追蹤。

  • AWSLambdaBasicExecutionRole

  • AWSXRayDaemonWriteAccess

當您向函數添加權限時,也對其代碼或配置執行簡單的更新。若您函數的執行中執行個體具有已過期的憑證,上述動作會強制停止並取代這些執行個體。

注意

在函數調用後,日誌可能需要 5 到 10 分鐘才會顯示。

Lambda:並非所有函數的日誌都會顯示

問題:即使我的權限是正確的,在 CloudWatch 日誌中缺少功能日誌

如果您 AWS 帳戶 達到其CloudWatch 日誌配額限制,請 CloudWatch 節流功能日誌記錄。發生這種情況時,您的函數輸出的某些日誌可能不會出現在 CloudWatch 日誌中。

如果您的函數以過高的速率輸出日誌,Lambda 處理它們,這也可能導致日誌輸出不出現在 CloudWatch 日誌中。當 Lambda 無法以函數產生記錄的速度傳送記錄檔時,會捨棄記錄檔以防止函數的執行速度變慢。 CloudWatch 當單一記錄串流的記錄輸送量超過 2 MB/s 時,預期會持續觀察捨棄的記錄檔。

如果您的函數設定為使用JSON格式化記錄,Lambda 會在卸除 CloudWatch 記錄檔時嘗試將logsDropped事件傳送至記錄檔。但是,當 CloudWatch 調節函數的日誌記錄時,此事件可能無法到達 CloudWatch 日誌,因此 Lambda 丟棄日誌時不會始終看到記錄。

若要檢查您的記錄檔是否 AWS 帳戶 已達到其 CloudWatch 記錄配額限制,請執行下列動作:

  1. 開啟 Service Quotas 主控台

  2. 在導覽窗格中,選擇 AWS services (AWS 服務)

  3. AWS 服務清單中搜尋 Amazon CloudWatch 日誌。

  4. Service Quotas 清單中,選擇 CreateLogGroup throttle limit in transactions per secondCreateLogStream throttle limit in transactions per secondPutLogEvents throttle limit in transactions per second 配額,以檢視您的使用率。

您也可以設定 CloudWatch 警示,在您的帳戶使用率超過您為這些配額指定的限制時提醒您。如需詳細資訊,請參閱根據靜態閾值建立 CloudWatch 警示

如果記 CloudWatch 錄檔的預設配額限制不足以滿足您的使用案例,您可以要求提高配額

Lambda:該函數在執行完成之前傳回

問題:(Node.js) 函數在程式碼完成執行前傳回

許多程式庫 (包括) 會 AWS SDK以非同步方式運作。當您進行網路呼叫或是執行需要等待回應的其他操作時,程式庫會傳回稱為 promise 的物件,在背景追蹤操作的進度。

若要等待 promise 解析為回應,請使用 await 關鍵字。這會阻止您的處理器在包含回應的 promise 解析為物件前執行。如果您不需要在程式碼中使用回應中的資料,您可以直接將 promise 傳回執行時間。

有些程式庫不會傳回 promise,但是可以包裝在傳回 promise 的程式碼中。如需詳細資訊,請參閱在 Node.js 中 Lambda 義函數處理常式

AWS SDK:版本和更新

問題:運行時 AWS SDK包含的不是最新版本

問題:運行時 AWS SDK包含的自動更新

指令碼語言的執行階段包括, AWS SDK且會定期更新至最新版本。每個執行時間目前的版本都會列在執行時間頁面上。若要使用較新版本的 AWS SDK,或將函數鎖定到特定版本,您可以將程式庫與函數程式碼結合在一起,或建立 Lambda 層。如需建立包含相依性部署套件的詳細資訊,請參閱下列主題:

Node.js

使用 .zip 封存檔部署 Node.js Lambda 函數

Python

使用 .zip 封存檔部署 Python Lambda 函數

Ruby

使用 .zip 封存檔部署 Ruby Lambda 函數

Java

使用 .zip 或JAR檔案封存來部署 Java Lambda 函數

Go

使用 .zip 封存檔部署 Go Lambda 函數

C#

使用 .zip 封存檔建置和部署 C# Lambda 函數

PowerShell

使用 .zip 檔案封存部署 PowerShell Lambda 函數

Python:程式庫的載入不正確

問題:(Python) 有些程式庫無法從部署套件正確載入

使用以 C 或 C++ 撰寫延伸模組的程式庫必須在處理器架構與 Lambda 相同的環境中編譯 (Amazon Linux)。如需詳細資訊,請參閱使用 .zip 封存檔部署 Python Lambda 函數

Java:從 Java 11 更新到 Java 17 後,您的函數需要更長的時間來處理事件

問題:(Java) 從 Java 11 更新為 Java 17 後,您的函數需要更長的時間來處理事件

使用JAVA_TOOL_OPTIONS參數調整您的編譯器。Java 17 及更新版本 Java 版本的 Lambda 執行階段會變更預設的編譯器選項。這項變更可改善短暫函式的冷啟動時間,但先前的行為更適合運算密集型、較長時間執行的函式。設定JAVA_TOOL_OPTIONS-XX:-TieredCompilation為可還原為 Java 11 行為。如需 JAVA_TOOL_OPTIONS 參數的詳細資訊,請參閱 了解環JAVA_TOOL_OPTIONS境變量