

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

# 針對 Lambda 中的調用問題進行疑難排解
<a name="troubleshooting-invocation"></a>

當您調用 Lambda 函數時，Lambda 會先驗證請求並檢查擴展容量，再將事件傳送到您的函數，或是事件佇列 (針對非同步調用)。導致調用錯誤的可能原因包含請求參數、事件結構、函數設定、使用者許可、資源許可或限制等問題。

如果您直接調用函數，您會在 Lambda 的回應中看到調用錯誤。如果您透過事件來源映射或是其他服務以非同步方式調用您的函數，您可能會在日誌、無效字母佇列或是失敗事件目的地上找到錯誤。錯誤處理選項和重試行為會因您調用函數的方式，以及錯誤的類型而有所不同。

如需 `Invoke` 操作可以傳回的錯誤類型清單，請參閱[調用](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)。

**Topics**
+ [Lambda：函數在初始化階段逾時 (Sandbox.Timedout)](#troubleshooting-timeouts)
+ [IAM：lambda:InvokeFunction 未獲授權](#troubleshooting-invocation-noauth)
+ [Lambda：找不到有效的引導程序 (Runtime.InvalidEntrypoint)](#troubleshooting-invocation-bootstrap)
+ [Lambda：無法執行操作 ResourceConflictException](#troubleshooting-invocation-ResourceConflictException)
+ [Lambda：函數卡在待定狀態](#troubleshooting-invocation-pending)
+ [Lambda：一個函數正在使用所有並行](#troubleshooting-invocation-allconcurrency)
+ [一般：無法使用其他帳戶或服務調用函數](#troubleshooting-invocation-cannotinvoke)
+ [一般：函數調用正在循環](#troubleshooting-invocation-loop)
+ [Lambda：具有佈建並行的別名路由](#troubleshooting-invocation-alias)
+ [Lambda：使用佈建並行的冷啟動](#troubleshooting-invocation-coldstart)
+ [Lambda：新版本的冷啟動](#troubleshooting-invocation-newversion)
+ [Lambda：未預期的 Node.js 在執行時間結束 (Runtime.NodejsExit)](#troubleshooting-invocation-nodejs-exit)
+ [EFS：函數無法掛載 EFS 檔案系統](#troubleshooting-invocation-efsmount)
+ [EFS：函數無法連線到 EFS 檔案系統](#troubleshooting-invocation-efsconnect)
+ [EFS：因為逾時，函數無法掛載 EFS 檔案系統](#troubleshooting-invocation-efstimeout)
+ [Lambda：Lambda 偵測到耗時太久的 IO 程序](#troubleshooting-invocation-ioprocess)
+ [容器：CodeArtifactUserException 錯誤](#troubleshooting-deployment-container-artifact)
+ [容器：InvalidEntrypoint 錯誤](#troubleshooting-deployment-container-entrypoint)

## Lambda：函數在初始化階段逾時 (Sandbox.Timedout)
<a name="troubleshooting-timeouts"></a>

 **錯誤：***任務在 3.00 秒後逾時* 

當[初始化](lambda-runtime-environment.md#runtimes-lifecycle-ib)階段出現逾時，Lambda 會在下一個調用請求到達時重新執行`Init`階段，以再次初始化執行環境。(我們將其稱為[隱藏的初始化](lambda-runtime-environment.md#suppressed-init)。) 不過，如果函數設定了較短的[逾時持續時間](configuration-timeout.md) (通常大約 3 秒)，則隱藏的初始化可能無法在配置的逾時前完成，導致`Init`階段再次逾時。或者，隱藏的初始化雖然完成，但留給[調用](lambda-runtime-environment.md#runtimes-lifecycle-invoke)階段的時間不夠，導致後者無法完成，從而造成`Invoke`階段逾時。

若要減少逾時錯誤，請使用以下其中一種或幾種策略：
+ **延長函數逾時期間**：延長[逾時](configuration-timeout.md)，讓`Init`和`Invoke`階段有時間成功完成。
+ **增加分配給函數的記憶體**：更多的[記憶體](configuration-memory.md)意味著更多的 CPU 運算能力，這可以加快`Init`和`Invoke`階段的速度。
+ **最佳化函數初始化程式碼**：縮短初始化所需的時間，以確保`Init`和`Invoke`階段可以在設定的逾時內完成。

## IAM：lambda:InvokeFunction 未獲授權
<a name="troubleshooting-invocation-noauth"></a>

 **錯誤：***使用者 arn:aws:iam::123456789012:user/developer 無權對資源 my-function 執行 lambda:InvokeFunction* 

您的使用者或您擔任的角色必須有調用函數的許可。此要求也適用於 Lambda 函數及其他調用函數的運算資源。將 AWS 受管政策 **AWSLambdaRole** 新增至您的使用者，或新增允許對目標函數`lambda:InvokeFunction`執行動作的自訂政策。

**注意**  
IAM 動作的名稱 (`lambda:InvokeFunction`) 指的是 `Invoke` Lambda API 操作。

如需詳細資訊，請參閱 [在 中管理許可 AWS Lambda](lambda-permissions.md)。

## Lambda：找不到有效的引導程序 (Runtime.InvalidEntrypoint)
<a name="troubleshooting-invocation-bootstrap"></a>

 **錯誤：***找不到有效的引導程序：[/var/task/bootstrap /opt/bootstrap]* 

當部署套件的根層級不包含名為 `bootstrap` 的可執行檔時，通常會發生此錯誤。例如，如果您使用 .zip 檔案部署 `provided.al2023` 函數，則 `bootstrap` 檔案必須位於 .zip 檔案的根層級，而不在目錄中。

## Lambda：無法執行操作 ResourceConflictException
<a name="troubleshooting-invocation-ResourceConflictException"></a>

 **錯誤：***ResourceConflictException：此時無法執行操作。函數量前處於下列狀態：擱置中* 

當您在建立時將函數連接到 Virtual Private Cloud (VPC) 時，函數會在 Lambda 建立彈性網路界面的同時，進入 `Pending` 狀態。在此期間，您無法調用或修改函數。如果您在建立後將函數連接到 VPC，則可以在更新擱置時調用該函數，但無法修改其程式碼或組態。

如需詳細資訊，請參閱 [Lambda 函數狀態](functions-states.md)。

## Lambda：函數卡在待定狀態
<a name="troubleshooting-invocation-pending"></a>

 **錯誤：** *函數停留在 `Pending` 狀態幾分鐘的時間。*

如果函數卡在 `Pending` 狀態的時間超過六分鐘，請呼叫下列其中一個 API 操作來解除封鎖：
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)

Lambda 會取消待處理的操作並將該函數放入 `Failed` 狀態。您接著可以嘗試另一個更新。

## Lambda：一個函數正在使用所有並行
<a name="troubleshooting-invocation-allconcurrency"></a>

 **問題：***單一函數正在使用所有可用的並行，造成其他函數遭到調節。*

若要將 區域中 AWS 您帳戶的可用並行分割為集 AWS 區，請使用[預留並行](configuration-concurrency.md)。預留並行可確保函數一律會擴展至其受到指派的並行，且函數擴展的並行也不會超過其受到指派的並行。

## 一般：無法使用其他帳戶或服務調用函數
<a name="troubleshooting-invocation-cannotinvoke"></a>

 **問題：***您可以直接調用函數，但當其他服務或帳戶調用該函數時，它不會執行。*

您在函數[以資源為基礎的政策](access-control-resource-based.md)中，授予[其他服務和](lambda-services.md)帳戶調用函數的許可。如果調用者屬於另一個帳戶，則該使用者也必須具備[函數的調用許可](access-control-identity-based.md)。

## 一般：函數調用正在循環
<a name="troubleshooting-invocation-loop"></a>

 **問題：** *在迴圈中連續調用函數。*

這通常發生在函數在觸發它的相同 AWS 服務中管理資源時。例如，可以建立函數，將物件存放在所設定的 Amazon Simple Storage Service (Amazon S3) 儲存貯體中，該儲存貯體具有[再次調用函數的通知](with-s3.md)。若要阻止函數執行，可將函數的可用[並行處理](lambda-concurrency.md)降為零，這會限制所有將來的調用。然後，識別造成遞迴調用的程式碼路徑或組態錯誤。Lambda 會自動偵測並停止某些 AWS 服務和 SDKs遞迴迴圈。如需詳細資訊，請參閱[使用 Lambda 遞迴迴圈偵測功能防止無限迴圈](invocation-recursion.md)。

## Lambda：具有佈建並行的別名路由
<a name="troubleshooting-invocation-alias"></a>

 **問題：** *在別名路由期間佈建並行溢出調用。*

Lambda 使用簡單的概率模型來在兩個函數版本之間分配流量。在流量較低時，您可能會看到每個版本已設定流量百分比與實際流量百分比之間，存在很大差異。如果您的函數使用佈建並行，透過在別名路由作用期間設定較高數目的已佈建並行執行個體，則可以避免[溢出調用](monitoring-metrics-types.md#invocation-metrics)。

## Lambda：使用佈建並行的冷啟動
<a name="troubleshooting-invocation-coldstart"></a>

 **問題：***啟用佈建的並行後，您會看到冷啟動。*

當函數上的並行執行次數少於或等於[已設定的佈建並行層級](provisioned-concurrency.md)，則不應該發生任何冷啟動。若要協助您確認佈建的並行是否能正常運作，請執行下列動作：
+  請在函數版本或別名上[檢查佈建的並行是否啟用](provisioned-concurrency.md)。
**注意**  
[函數的未發佈版本](configuration-versions.md) (\$1LATEST) 無法設定佈建並行。
+ 確保您的觸發條件調用的是正確的函數版本或別名。例如，如果您使用的是 Amazon API Gateway，請檢查 API Gateway 調用的函數版本或別名具有佈建的並行，而不是 \$1LATEST。若要確認正在使用佈建的並行，您可以檢查 [ProvisionedConcurrencyInvocations Amazon CloudWatch 指標](monitoring-concurrency.md#provisioned-concurrency-metrics)。非零值表示函數正在初始化執行環境上處理調用。
+ 判斷您的函數並行是否超過已佈建並行的設定層級，方法是檢查 [ProvisionedConcurrencySpilloverInvocations CloudWatch 指標](monitoring-concurrency.md#provisioned-concurrency-metrics)。非零值表示所有已佈建的並行處於使用中的狀態，而某些調用會在冷啟動時發生。
+ 檢查[調用頻率](gettingstarted-limits.md#api-requests) (每秒請求數)。具有佈建並行的函數，每個佈建並行的請求速率上限為每秒 10 個。例如，設定為具備 100 個佈建並行的函數每秒可以處理 1,000 個請求。如果調用速率超過每秒 1,000 個請求，就可能會發生冷啟動。

## Lambda：新版本的冷啟動
<a name="troubleshooting-invocation-newversion"></a>

 **問題：***在部署新版的函數時，您會看到冷啟動。*

當您更新函數別名時，Lambda 會根據別名上設定的權重，自動將佈建的並行移至新版本。

 **錯誤：***KMSDisabledException：因為使用的 KMS 金鑰已停用，Lambda 無法解密環境變數。請檢查函數的 KMS 金鑰設定。*

如果您的 AWS Key Management Service (AWS KMS) 金鑰已停用，或如果允許 Lambda 使用該金鑰的授予遭到撤銷，則可能會發生此錯誤。如果授權遺失，請將函數設定為使用不同的金鑰。然後重新分配自訂金鑰以重新建立授權。

## Lambda：未預期的 Node.js 在執行時間結束 (Runtime.NodejsExit)
<a name="troubleshooting-invocation-nodejs-exit"></a>

**問題：***Lambda 執行期用戶端偵測到非預期的 Node.js 結束碼。*

當您的函數在解決所有 Promises 之前結束時，就會發生此錯誤，例如由於程式碼錯誤。當 Node.js 偵測到防止 Promises 解決的死結時，也可能發生這種情況。此錯誤只會影響非同步樣式處理常式，不會影響回呼樣式處理常式。

**受影響的執行時間：**Node.js 18 及更新版本。

**若要解決此問題：**

1. 檢查您的函數程式碼是否有非同步處理常式中未解決的承諾。

1. 在函數完成之前，確保所有承諾都已正確解決 （已解決或拒絕）。

1. 檢閱您的程式碼是否有非同步操作中的潛在競爭條件。

如需 Node.js 結束代碼和程序終止的詳細資訊，請參閱 [Node.js 文件](https://nodejs.org/docs/latest/api/process.html#exit-codes)。

## EFS：函數無法掛載 EFS 檔案系統
<a name="troubleshooting-invocation-efsmount"></a>

 **錯誤：***EFSMountFailureException：函數無法使用存取點 arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd 掛載 EFS 檔案系統。*

對[檔案系統](configuration-filesystem.md)的掛載要求已遭拒。檢查函數的許可，並確認其檔案系統和存取點是否存在，且可供使用。

## EFS：函數無法連線到 EFS 檔案系統
<a name="troubleshooting-invocation-efsconnect"></a>

 **錯誤：***EFSMountConnectivityException：函數無法使用存取點 arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd 連線至 Amazon EFS 檔案系統。請檢查您的網路組態，並再試一次。*

函數無法使用 NFS 通訊協定 (TCP 連接埠 2049) 建立函數[檔案系統](configuration-filesystem.md)的連線。為 VPC 的子網路檢查[安全群組與路由組態](https://docs.aws.amazon.com/efs/latest/ug/network-access.html)。

如果您在更新函數的 VPC 組態設定後遇到這些錯誤，請嘗試卸載並重新掛載檔案系統。

## EFS：因為逾時，函數無法掛載 EFS 檔案系統
<a name="troubleshooting-invocation-efstimeout"></a>

 **錯誤：***EFSMountTimeoutException：由於掛載逾時，函數無法使用存取點 \$1arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd\$1 掛載 EFS 檔案系統*。

函數可以連線至函數的[檔案系統](configuration-filesystem.md)，但掛載操作逾時。稍後再試一次，並考慮限制函數的[並行數量](configuration-concurrency.md)，以減少檔案系統的負載。

## Lambda：Lambda 偵測到耗時太久的 IO 程序
<a name="troubleshooting-invocation-ioprocess"></a>

 *EFSIOException：函數執行個體已停止，因為 Lambda 偵測到耗時太久的 IO 處理序。*

先前的調用逾時，而且 Lambda 無法終止函數處理常式。當附加的檔案系統用完高載額度，且基準輸送量不足時，可能會發生此問題。若要增加輸送量，您可以增加檔案系統的大小，或使用佈建的輸送量。

## 容器：CodeArtifactUserException 錯誤
<a name="troubleshooting-deployment-container-artifact"></a>

**錯誤：***CodeArtifactUserPendingException 錯誤訊息*

CodeArtifact 正在等待最佳化。當 Lambda 完成最佳化時，函式會轉換為[作用中狀態](functions-states.md)。HTTP 回應代碼 409。

**錯誤：***CodeArtifactUserDeletedException 錯誤訊息*

CodeArtifact 已排程待刪除。HTTP 回應代碼 409。

**錯誤：***CodeArtifactUserFailedException 錯誤訊息*

Lambda 無法最佳化程式碼。您需要更正程式碼並重新上傳。HTTP 回應代碼 409。

## 容器：InvalidEntrypoint 錯誤
<a name="troubleshooting-deployment-container-entrypoint"></a>

**錯誤：***Runtime.ExitError 或 "errorType": "Runtime.InvalidEntrypoint"*

確認容器映像的 ENTRYPOINT 包含作為位置的絕對路徑。同時請確認映像不含作為 ENTRYPOINT 的符號連結。

**錯誤：***您正在使用 CloudFormation 範本，且您的容器 ENTRYPOINT 正在以 null 或空值覆寫。*

檢閱 CloudFormation 範本中的 [ImageConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-lambda-function-imageconfig.html) 資源。如果您在範本中宣告 `ImageConfig` 資源，則必須為所有三個屬性提供非空值。