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

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

針對 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-xr-x

在 Linux 和 MacOS 中,使用 chmod 命令變更部署套件中檔案和目錄的檔案許可。例如,若要提供可執行檔正確的許可,請執行下列命令。

chmod 755 <filepath>

若要在 Windows 中變更檔案許可,請參閱 Microsoft Windows 文件的 Set, View, Change, or Remove Permissions on an Object

一般:呼叫時發生錯誤 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 儲存貯體上傳函數的部署套件時,儲存貯體必須位於與函數相同的區域。當您在呼叫時指定 Amazon S3 物件 UpdateFunctionCode,或使用套件並在 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' 處理器)

錯誤:未定義的方法「處理程序」用於 #:0 LambdaHandler

錯誤: 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 分層轉換失敗。如需有關解決此問題的建議,請參閱《Lambda 使用者指南》中的「Lambda 部署問題疑難排解」頁面。

當您使用分層設定 Lambda 函數,Lambda 會將該分層與函數程式碼合併。如果此程序無法完成,Lambda 便會傳回此錯誤。如果出現此錯誤,請執行下列步驟:

  • 從分層中刪除所有未使用的檔案

  • 刪除分層中的所有符號連結

  • 重新命名任何與函數分層中目錄名稱相同的所有檔案

Lambda: InvalidParameterValueException或 RequestEntityTooLargeException

錯誤:InvalidParameterValueException: Lambda 無法設定您的環境變數,因為您提供的環境變數超過 4KB 的限制。測量的字串:{"A1":" USFE cyPiPn Y5 7 X 5 B...

錯誤:RequestEntityTooLargeException: 請求必須小於 5120 字節的 UpdateFunctionConfiguration 操作

儲存在函數組態中的變數物件大小上限不得超過 4,096 個位元組。這包括金鑰名稱、值、引號、逗號和括號。HTTP 請求主體的大小總計也受到限制。

{ "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs20.x", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Environment": { "Variables": { "BUCKET": "DOC-EXAMPLE-BUCKET", "KEY": "file.txt" } }, ... }

在此範例中,物件是 39 個字元,並在其存放為字串 {"BUCKET":"DOC-EXAMPLE-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) 超過帳戶的並行配額,則可能會收到錯誤訊息。

  • 記憶體:如果分配給函數的記憶體數量超過帳戶的記憶體配額,就會發生錯誤。