本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
針對 Lambda 中的部署問題進行疑難排解
當您更新函數時,Lambda 會透過啟動包含更新程式碼或設定的函數新執行個體,來部署變更。部署錯誤會導致您無法使用新版本,而造成這類錯誤的可能原因包含您部署套件、程式碼、許可或工具的問題。
當您使用 Lambda API 或 等用戶端直接部署更新至函數時 AWS CLI,您可以直接在輸出中看到來自 Lambda 的錯誤。如果您使用 AWS CloudFormation AWS CodeDeploy、 或 等服務 AWS CodePipeline,請在該服務的日誌或事件串流中尋找來自 Lambda 的回應。
下列主題提供您在使用 Lambda API、主控台或工具時可能遭遇錯誤和問題的故障診斷建議。如果您發現未列在此處的問題,您可以使用此頁面上的 Feedback (意見回饋) 按鈕來報告。
如需更多故障診段建議和常見支援問題的解答,請瀏覽 AWS 知識中心
如需有關偵錯和疑難排解 Lambda 應用程式的詳細資訊,請參閱無伺服器園地中的偵錯
主題
一般:許可遭拒/無法載入此類檔案
錯誤:EACCES:拒絕許可,開啟 '/var/task/index.js'
錯誤:無法載入這類檔案 – 函數
錯誤:[Errno 13] 拒絕許可:'/var/task/function.py'
Lambda 執行時間需有許可才能讀取部署套裝服務中的檔案。在 Linux 許可八進位標記法中,Lambda 需要 644 個許可 (rw-r--r--) 用於非可執行檔,以及 755 個許可 (rwxr-x) 用於目錄和可執行檔。
在 Linux 和 MacOS 中,使用 chmod 命令變更部署套件中檔案和目錄的檔案許可。例如,若要為非可執行檔提供正確的許可,請執行下列命令。
chmod 644 <filepath>
若要在 Windows 中變更檔案許可,請參閱 Microsoft Windows 文件的 Set, View, Change, or Remove Permissions on an Object
注意
如果您未授予 Lambda 存取部署套件中的目錄所需的許可,Lambda 會將這些目錄的許可設定為 755 (rwxr-xr-x)。
一般:呼叫 UpdateFunctionCode 時發生錯誤
錯誤:呼叫 UpdateFunctionCode 操作時發生錯誤 (RequestEntityTooLargeException)
當您將部署套裝服務或 Layer 存檔直接上傳至 Lambda 時,ZIP 檔案的大小限制為 50 MB。若要上傳更大的檔案,請將它存放在 Amazon S3 中並使用 S3Bucket 和 S3Key 參數。
注意
當您直接使用 AWS CLI、 AWS SDK 或其他方式上傳檔案時,二進位 ZIP 檔案會轉換為 base64,這會將其大小增加約 30%。若要允許此操作,以及請求中其他參數的大小,Lambda 套用的實際請求大小限制會更大。因此,50 MB 的限制是概略值。
Amazon S3:錯誤代碼 PermanentRedirect。
錯誤:GetObject 時發生錯誤。S3 錯誤代碼:PermanentRedirect. S3 錯誤訊息:儲存貯體位於此區域:us-east-2。請使用此區域重試請求
當您從 Amazon S3 儲存貯體上傳函數的部署套件時,儲存貯體必須位於與函數相同的區域。當您在呼叫 UpdateFunctionCode 時指定 Amazon S3 物件,或在 AWS CLI 或 AWS SAM CLI 中使用 套件和部署命令時,可能會發生此問題。為開發應用程式的每個區域建立部署成品儲存貯體。
一般:找不到、無法載入、無法匯入、找不到類別、沒有此類檔案或目錄
錯誤: Cannot find module 'function' (找不到 'function' 模組)
錯誤:無法載入這類檔案 – 函數
錯誤: Unable to import module 'function' (無法匯入 'function' 模組)
錯誤: Class not found: function.Handler (找不到類別:function.Handler)
錯誤: fork/exec /var/task/function: no such file or directory (fork/exec /var/task/function:找不到檔案或目錄)
錯誤: Unable to load type 'Function.Handler' from assembly 'Function'. (無法從 'Function' 組件載入 'Function.Handler' 類型。)
您函數處理器組態中的檔案或類別名稱與您的程式碼不相符。如需詳細資訊,請參閱下一節。
一般:未定義的方法處理常式
錯誤: index.handler is undefined or not exported (index.handler 未定義或尚未匯出)
錯誤: Handler 'handler' missing on module 'function' ('function' 模組上找不到 'handler' 處理器)
錯誤: 未定義 #<LambdaHandler:0x000055b76ccebf98> 的 `handler' 方法
錯誤: No public method named handleRequest with appropriate method signature found on class function.Handler (在 function.Handler 類別上找不到具備適當方法簽章,名為 handleRequest 的公有方法)
錯誤: Unable to find method 'handleRequest' in type 'Function.Handler' from assembly 'Function' (在來自 'Function' 組件的 'Function.Handler' 類型中找不到 'handleRequest' 方法)
您函數處理器組態中的處理器方法名稱與您的程式碼不相符。每個執行時間都會定義處理器的命名慣例,例如 filename.methodname。處理器是您函數程式碼中的方法,執行時間會在調用您的函數時執行該方法。
針對某些語言,Lambda 提供了程式庫,其中包含預期處理器方法具備特定名稱的界面。如需每種語言的處理器命名詳細資訊,請參閱下列主題。
一般:超過 Lambda 程式碼儲存限制
錯誤:超過程式碼儲存限制。
Lambda 會將函數程式碼的副本存放在您帳戶中私有的內部 S3 儲存貯體中。每個 AWS 帳戶在每個區域中配置 300 GB 的程式碼儲存 (解壓縮)。程式碼儲存包含 Lambda 函數和層使用的總儲存空間。如果您達到配額,在嘗試部署新函數時,會收到 CodeStorageExceededException。
若要解決此問題,您可以清除舊版本的函數、移除未使用的程式碼,或使用 Lambda 層來取消重複函數之間共用的常見程式碼。此外,最佳實務是針對個別工作負載使用個別 AWS 帳戶,以協助管理儲存配額。
或者,您可以將函數和 layer 設定為使用自我管理的 S3 程式碼儲存。使用自我管理的 S3 程式碼儲存,Lambda 會直接從 S3 儲存貯體參考您的程式碼,這不會計入您的儲存配額。
您可以在 Lambda 主控台的儀表板子選單下檢視儲存體總用量:
Lambda:分層轉換失敗
錯誤:Lambda 分層轉換失敗。如需有關解決此問題的建議,請參閱《Lambda 使用者指南》中的「Lambda 部署問題疑難排解」頁面。
當您使用分層設定 Lambda 函數,Lambda 會將該分層與函數程式碼合併。如果此程序無法完成,Lambda 便會傳回此錯誤。如果出現此錯誤,請執行下列步驟:
-
從分層中刪除所有未使用的檔案
-
刪除分層中的所有符號連結
-
重新命名任何與函數分層中目錄名稱相同的所有檔案
Lambda:InvalidParameterValueException 或 RequestEntityTooLargeException
錯誤:InvalidParameterValueException:Lambda 因為您提供的環境變數超過 4KB 限制,Lambda 無法設定您的環境變數。測量的字串:{"A1":"uSFeY5cyPiPn7AtnX5BsM...
錯誤: RequestEntityTooLargeException:請求必須小於 5120 位元組的 UpdateFunctionConfiguration 操作
儲存在函數組態中的變數物件大小上限不得超過 4,096 個位元組。這包括金鑰名稱、值、引號、逗號和括號。HTTP 請求主體的大小總計也受到限制。
{ "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs24.x", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Environment": { "Variables":{ "BUCKET": "amzn-s3-demo-bucket", "KEY": "file.txt" }}, ... }
在此範例中,物件是 39 個字元,並在其存放為字串 {"BUCKET":"amzn-s3-demo-bucket","KEY":"file.txt"} (不含空格) 時,最多佔用 39 個位元組。環境變數值中每個標準 ASCII 字元使用一個位元組。每個延伸的 ASCII 字元和 Unicode 字元可以使用 2 個位元組到 4 個位元組。
Lambda:InvalidParameterValueException
錯誤: InvalidParameterValueException:因為您提供的環境變數已包含目前不支援修改的預留金鑰,Lambda 無法設定您的環境變數。
Lambda 保留一些環境變數金鑰以供內部使用。例如,執行時間使用的 AWS_REGION 可決定目前區域,而且不可置換。但是,執行時間使用的其他變數,例如 PATH,可在函數組態中擴充。如需完整清單,請參閱定義執行時間環境變數。
Lambda:並行和記憶體配額
錯誤:指定的函數 ConcurrentExecutions 使帳戶的 UnreservedConcurrentExecution 降低到其最小值以下
錯誤:「MemorySize」值無法滿足限制條件:成員的值必須小於或等於 3008
當您超過帳戶的並行或記憶體配額時,就會發生這些錯誤。新 AWS 帳戶已減少並行和記憶體配額。若要解決與並行相關的錯誤,您可以請求提高配額。您無法請求增加記憶體配額。
-
並行:如果您嘗試使用保留或佈建的並行建立函數,或者您的每個函數並行請求 (PutFunctionConcurrency) 超過帳戶的並行配額,便可能發生錯誤。
-
記憶體:如果分配給函數的記憶體數量超過帳戶的記憶體配額,就會發生錯誤。
Lambda:佈建並行的別名組態無效
錯誤:佈建並行的別名組態無效
當您嘗試更新 Lambda 函式的程式碼或組態,而某個具有佈建並行的別名指向有問題的版本時,就會發生此錯誤。Lambda 會為佈建並行預先初始化執行環境,若這些環境因程式碼錯誤、資源限制或受影響的堆疊和別名而無法正確初始化,部署就會失敗。如果遇到此問題,請執行下列步驟:
-
復原別名:暫時更新別名,使其指向先前可正常運作的版本。
aws lambda update-alias \ --function-name <function-name> \ --name <alias-name> \ --function-version <known-good-version> -
修正 Lambda 初始化程式碼:確保在處理常式外部執行的初始化程式碼不包含任何未捕捉的例外狀況,並完成用戶端與連線的初始化。
-
安全地重新部署:部署已修正的程式碼並發布新版本。接著,更新別名,使其指向已修正的版本。如有必要,也可以重新啟用佈建並行。
如果使用 AWS CloudFormation,請更新堆疊定義,FunctionVersion:!GetAtt version.Version讓別名指向工作版本:
alias: Type: AWS::Lambda::Alias Properties:FunctionName: !Ref function FunctionVersion: !GetAtt version.Version Name: BLUE ProvisionedConcurrencyConfig: ProvisionedConcurrentExecutions: 1