View a markdown version of this page

故障診斷 Lambda Web 函數 - AWS Lambda

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

故障診斷 Lambda Web 函數

從資源狀態、HTTP 回應和請求的日誌開始。Web 函數會公開函數、修訂版、端點和 MultiRegion或 PerRegion 端點的每個區域的不同狀態。一個資源中的失敗不一定會變更其他資源的狀態。

注意

執行本主題中的診斷命令之前,請確定您具有 AWS CLI 呼叫 Lambda Web 函數get-*操作的存取權和許可。

收集診斷資訊

  1. 取得 Web 函數、修訂版和端點。記錄每個 state、updateStatus、 stateReason和 updateStatusReason值。

    aws lambda-web get-web-function \ --function-name my-web-app aws lambda-web get-web-function-revision \ --function-name my-web-app \ --revision-id revision-id aws lambda-web get-web-function-endpoint \ --function-name my-web-app \ --endpoint-name prod

    將 my-web-app 取代為您的函數名稱,將 revision-id 取代為要檢查的修訂,並將 prod 取代為您的端點名稱。

  2. 傳送請求並記錄狀態碼和回應標頭。

    curl --include https://endpoint-domain/path

    lambda-web-request-id 標頭可識別請求。出現時, lambda-web-logstream標頭會識別處理請求的 Amazon CloudWatch Logs 日誌串流,而 lambda-web-error-type標頭會識別平台錯誤。

  3. 在 Web 函數的主區域中,檢閱集中式日誌群組中的應用程式和系統日誌。如需日誌群組名稱和相互關聯指引,請參閱 Amazon CloudWatch Logs 中的 Web 函數日誌。

  4. 對於 MultiRegion和 PerRegion端點,檢查 中的每個項目regionalEndpoints。成功的端點層級狀態並不表示每個區域中的最新更新都成功。

部署和啟動問題

徵狀 要檢查的內容 Resolution
修訂版為 Failed 修訂版的 stateReason、參考的 Amazon S3 物件版本、儲存貯體政策、執行角色、執行時間和 AWS KMS 金鑰。 更正基礎組態並建立新的修訂。修訂是不可變的,失敗的修訂不會傳回 Active。
端點為 Active,但請求在應用程式啟動期間失敗 輸入檔案錯誤、相依性錯誤,或從不監聽 的伺服器的系統和應用程式日誌AWS_LAMBDA_HTTP_ENDPOINT。 在本機執行封裝的應用程式、驗證項目檔案和生產相依性,並聆聽 Lambda 提供的確切主機和連接埠。將更正部署為新的修訂版本。
端點更新失敗 updateStatusReason 端點上的 ,以及每個區域項目上的 MultiRegion和 PerRegion端點上的 。 更正報告的相依性或區域失敗,然後UpdateWebFunctionEndpoint再次呼叫 以重試更新。
create-web-function-revision 的 does not have s3:GetObject 程式碼是從 Amazon S3 讀取,而且儲存貯體政策或發起人的身分政策缺少讀取存取權。 在儲存貯體政策 (適用於 Lambda 服務) s3:GetObject和發起人的身分政策s3:GetObjectVersion中授予 和 。
get-web-function-endpoint 的 AccessDenied IAM 政策Resource不包含端點。 在政策 web-function/name/*中包含 Resource。

為了避免重複部署失敗,請先驗證測試修訂中的組態和啟動,再建立生產修訂。

CLI 和套件錯誤

錯誤或症狀 原因 Resolution
invalid choice: lambda-web 已安裝的 AWS CLI 早於 Web 函數命令。 更新 AWS CLI 並確認 aws lambda-web help列出 Web 函數操作。
Unknown parameter: BuildConfig 請求使用 PascalCase 成員名稱。 使用本指南中顯示的 camelCase 請求成員,例如 buildConfig、 codeConfig和 serviceConfig。
Cannot find module '/var/task/index.js' 封存根缺少必要的項目檔案。 將 index.js放在部署套件的根目錄。包含其匯入的每個檔案和生產相依性。
ERR_MODULE_NOT_FOUND 應用程式檔案的 封存會省略 匯入的來源或建置檔案index.js。 使用 檢查封存unzip -l、新增缺少的檔案,並建立新的修訂。
Application.TimeoutListenError,或第一個請求的 HTTP 502 應用程式接聽僅限迴路的地址,例如 127.0.0.1或 localhost,或是 中 以外的連接埠AWS_LAMBDA_HTTP_ENDPOINT。 剖析AWS_LAMBDA_HTTP_ENDPOINT並接聽該確切的主機和連接埠。
EMFILE 或 too many open files 應用程式會在並行請求間洩漏通訊端、檔案或資料庫連線。 關閉每個請求控點、繫結連線集區,並在持續並行下監控開啟的控點。
JavaScript heap out of memory 應用程式達到預設的 V8 堆積限制,低於執行環境的 2 GB 記憶體限制,或並行請求耗盡剩餘的環境記憶體。 檢查保留的物件和未繫結的快取,並減少並行。如果應用程式需要較大的堆積,請在 --max-old-space-size中使用 設定較大的 V8 堆積限制NODE_OPTIONS。保留緩衝區、原生配置和執行時間的記憶體。
相依性Cannot find module/ERR_MODULE_NOT_FOUND執行時間 node_modules 部署套件中不包含 。 安裝生產相依性並將其包含在套件中:執行 npm ci --omit=dev,然後使用 確認unzip -l function.zip。
靜態檔案傳回 HTTP 404 應用程式會解析與工作目錄相關的檔案路徑,或未封裝檔案。 解決來自模組目錄的路徑 (__dirname在 CommonJS 中,或在 ES 模組import.meta.dirname中),並使用 確認檔案位於套件中unzip -l。
ESM 匯入錯誤,例如「無法使用模組外部的匯入陳述式」 package.json 不會宣告模組類型。 將 "type": "module"新增至 package.json,或一致地使用 CommonJS。

HTTP 請求失敗

回應 常見原因 Resolution
HTTP 400 用戶端使用不支援的 HTTP 方法,或傳送端點無法處理的請求。 使用支援的方法,並檢閱 中的請求標頭和限制HTTP 請求和回應。
HTTP 403

由於下列其中一個原因,IamAuth請求授權失敗:

  • 請求未簽署。

  • 請求會省略必要的內容雜湊標頭。

  • 請求的簽章無效。

  • 發起人沒有 許可。對於跨帳戶呼叫,身分政策或資源型政策可能遺失。

確認請求包含必要的X-Amz-Content-SHA256標頭、檢閱簽章,並在必要的身分和資源政策lambda:InvokeWebFunctionEndpoint中驗證 。如需簽署需求,請參閱 簽署請求。如需許可需求,請參閱 將調用許可授予委託人。
HTTP 404 應用程式不會定義請求的路由,或用戶端正在使用過時的端點網域。Host 標頭可能也不符合端點網域。如果您設定前門,例如 Amazon CloudFront,將檢視器的Host標頭轉送至原始伺服器,Lambda 會傳回此錯誤,並將 lambda-web-error-type 設定為 Platform.InvalidEndpoint。 驗證目前的 、domainName請求路徑和應用程式路由。使用 lambda-web-error-type和 日誌來區分平台回應與應用程式回應。
HTTP 409 端點不是 Active,或端點解析為不是 的修訂版Active。 檢查修訂和端點狀態。如果端點是 Pending,請等待並重試;如果是 Failed,請建立新的端點。對於修訂,從端點權重移除失敗或非作用中的修訂,並在需要時建立替代修訂。
HTTP 429

發生以下其中一項:

  • 請求超過端點速率限制。

  • 端點的環境容量不足。

  • 帳戶已達到區域請求或 vCPU 限制。

  • 端點同時初始化的執行環境太多。

閱讀 lambda-web-error-type標頭以識別套用了哪些限制。請參閱 Web 函數錯誤類型。檢閱調節指標 (EndpointRequestThrottles、EndpointActiveEnvironmentThrottles、 和 AccountActiveVCPUArm64Throttles)AccountRequestThrottles、主動容量指標、端點設定和套用的帳戶限制。並行初始化限流 (Platform.EndpointConcurrentInitThrottle) 不會增加限流指標。使用退避和抖動,僅重試等冪請求。
HTTP 502 您的應用程式在開始提供請求之前失敗,Lambda 無法為您的 Web 函數準備執行環境,或您的應用程式傳回無效的回應。 使用 lambda-web-error-type和 系統日誌來識別原因。請參閱 Web 函數錯誤類型。
HTTP 503 應用程式在處理請求時當機、端點已停用,或 Lambda 無法取得容量或到達應用程式。 存在lambda-web-error-type時使用 ,以及應用程式和系統日誌來識別原因。請參閱 Web 函數錯誤類型。沒有 的 503 lambda-web-error-type可以指出暫時負載卸載或內部錯誤。在任一情況下,使用退避和抖動重試等冪請求。
HTTP 504 應用程式未在修訂逾時 (Runtime.RequestTimeout) 內回應。 檢查修訂版timeoutSeconds和下游延遲。
其他 HTTP 5xx 應用程式傳回 5xx 狀態,或 Lambda 遇到內部錯誤 (無lambda-web-error-type標頭)。 使用請求 ID、日誌串流標頭、應用程式日誌和系統日誌來識別來源,並檢查程序運作狀態。
請求在大型上傳時停止回應或逾時;日誌顯示收到 0 個位元組 當請求內文仍在抵達時,處理常式開始撰寫回應。Web 函數請求路徑為半雙工:Lambda 會在交付應用程式的回應之前轉送完整的請求內文。 寫入回應之前,請先完整讀取請求內文。低於約 1 MB 的身體適合通訊端緩衝區,可以遮罩此緩衝區。

請求標頭限制

兩個限制適用於請求標頭。Lambda 會將標頭區塊限制為 128 KiB,並在到達您的函數之前拒絕較大的請求。函數中的 Node.js HTTP 伺服器也會限制其接受的標頭行數。兩者都會傳回 HTTP 431 請求標頭欄位太大,如下表所示。如需平台限制,請參閱 標頭限制。

徵狀 原因 Resolution
HTTP 431 搭配 lambda-web-error-type: Platform.HeaderTooLarge。沒有叫用和應用程式日誌項目。 請求頭超過 131,072 個位元組 (128 KiB),在用戶端傳送完整請求頭時測量。 減少請求標頭的大小。無法提高此限制。
HTTP 431 搭配 lambda-web-request-id,lambda-web-logstream但不含 lambda-web-error-type。處理常式不會執行。 請求有超過 1,000 個標頭行由Node.js伺服器接收,包括 Lambda 新增的標頭。 在伺服器程式碼server.maxHeadersCount中引發,或減少用戶端傳送的標頭行數。

大小限制會在用戶端傳送請求頭時計數每個位元組。這包括請求行、每個標頭行 (包括用戶端程式庫新增Host的任何標頭),以及行終端器。Lambda 新增的標頭不會計入大小限制。

當請求超過大小限制時,Lambda 會在到達您的函數之前拒絕該請求,因此請求不會產生叫用,也不會產生應用程式日誌項目。lambda-web-error-type 回應標頭可識別原因。

Node.js 計數限制計算標頭行,而不是不同的標頭名稱。重複三次的標頭會計數三次。因此,透過代理鏈累積x-forwarded-for或追蹤標頭的請求可以達到限制。沒有單一標頭需要看起來不尋常,才會發生這種情況。限制是根據函數收到的請求來衡量,其中包含 Lambda 新增的標頭。因此,傳送稍微少於 1,000 個標頭行的用戶端可以到達它。發生這種情況時,請求會到達您的執行環境,而Node.js伺服器會在剖析期間拒絕它。您的處理常式不會執行。回應會攜帶 lambda-web-request-id和 lambda-web-logstream標頭,但不會攜帶 lambda-web-error-type標頭。

如果您的應用程式必須接受超過Node.js預設允許的標頭行,請提高伺服器程式碼中的Node.js限制。將 server.maxHeadersCount設定為要接受的標頭行數,或將其設定為 0以停用Node.js計數檢查。128 KiB 大小限制仍然適用。

const server = http.createServer(handler); server.maxHeadersCount = 2000; server.listen(port, host);

您不需要變更Node.js標頭大小限制。受管Node.js執行時間會將其設定為符合平台限制,因此平台限制會套用至標頭大小。您無法從應用程式程式碼提高平台限制。

若要保持在限制內,請將大量狀態移出 標頭並移入請求內文、修剪 Cookie,以及在請求到達端點之前摺疊備援代理和追蹤標頭。如果 CloudFront 分佈位於端點前面,則僅轉送您的應用程式在原始伺服器請求政策中所需的標頭。

Web 函數錯誤類型

當對 Web 函數端點的請求失敗時,Lambda 會傳回lambda-web-error-type回應標頭,以識別錯誤。此值使用 格式<Prefix>.<ErrorReason>:字首 會告訴您錯誤發生的位置,以及原因指定原因。

字首 發生錯誤的位置
Platform. Lambda 的平台層,可路由和驗證請求、檢查許可和強制執行限制。
Runtime. 載入和執行函數的受管執行時間。
Application. 您的函數程式碼。

例如, Runtime.RequestTimeout表示受管執行時間報告您的函數未在其設定的逾時內回應,而 Application.InitCodeError表示您自己的初始化程式碼擲出錯誤。

當錯誤是由請求本身或您的函數、其組態或其程式碼所造成時,Lambda 會包含 lambda-web-error-type標頭。Lambda 會針對內部服務錯誤和授權失敗省略 標頭,因此不會向未經授權的發起人揭露任何詳細資訊。值表示 Lambda 平台和函數之間的路徑發生問題。在請求路徑上,錯誤會識別請求失敗的位置。在回應路徑上,將 值與您的應用程式遙測一起使用,以了解發生的情況。

錯誤類型 說明
Platform.MalformedRequest Lambda 無法剖析請求,或未接受請求列或方法。
Platform.MissingHostHeader 請求不包含主機標頭,因此 Lambda 無法解析目標端點。
Platform.InvalidEndpoint 主機標頭未解析為有效的現有端點。
Platform.HeaderTooLarge 請求的標頭區段超過 Lambda 標頭大小限制。
Platform.DisallowedHeader 請求包含 Lambda 不接受的標頭。Lambda 傳回 HTTP 400。
Platform.UnsupportedHttpVersion 請求使用 HTTP/1.1 以外的 HTTP 版本,Web 函數需要此版本。
Platform.CannotAssumeRole Lambda 無法擔任函數的執行角色。
Platform.KMSDecryptionError Lambda 無法使用設定的 AWS KMS 金鑰來解密您的環境變數或初始化函數所需的其他資料。
Platform.InvalidNetworkConfiguration 函數依賴的 VPC 聯網資源無效。若要尋找原因,請參閱 網路和連線問題。
Platform.RevisionNotActive 請求鎖定的函數修訂版未處於作用中狀態。修訂可能仍在啟用中,或可能已無法啟用。檢查修訂的狀態;如果啟用仍在進行中,請在短暫延遲後重試。
Platform.EndpointNotActive 端點未處於作用中狀態。端點可能仍在佈建中,否則可能無法使用。檢查端點的狀態;如果仍在建立,請在短暫延遲後重試。
Platform.EndpointDisabled 端點的 rateLimit為 0,因此 Lambda 會使用 HTTP 503 拒絕所有請求。rateLimit 設定為非零值以恢復流量。
Platform.AccountDisabled 帳戶已停用 Web 函數叫用。Lambda 傳回 HTTP 403。聯絡 AWS 支援。
Platform.AccountRequestThrottle 超過帳戶層級請求率配額。
Platform.EndpointRequestThrottle 已超過端點的請求率配額。
Platform.AccountActiveVCPUArm64Throttle 已達到帳戶的作用中 vCPU 配額。
Platform.EndpointMaxEnvThrottle 已達到端點的最大環境限制。
Platform.EndpointConcurrentInitThrottle 端點同時初始化的執行環境太多。以指數退避重試。
Runtime.RequestTimeout 您的函數未在其設定的逾時內傳回回應。
Runtime.OutOfMemory 您的函數超過其記憶體限制,且程序已停止。
Runtime.Unreachable 執行時間程序損毀、結束或拒絕連線。
Runtime.Exit 在請求之間結束的執行時間程序。
Runtime.ExitError 執行時間程序因錯誤而結束。
Runtime.InvalidResponse 執行階段的回應標頭超過讀取緩衝區。
Runtime.OriginRequestError 應用程式處理請求時失敗。如需詳細資訊,請檢查應用程式日誌。
Runtime.ImportCodeError 執行時間無法匯入或解析您的進入點,例如缺少模組或路徑錯誤。
Runtime.InitTimeout 您的函數在佈建沙盒時超過初始逾時。
Application.InitCodeError 您的初始化程式碼在 函數開始提供請求之前擲出錯誤。
Application.TimeoutListenError 您的初始化程式碼未在初始化截止日期之前開始接聽連接埠。

如需識別套用哪些限制的限流指標 (適用於 Platform.AccountRequestThrottle、Platform.AccountActiveVCPUArm64Throttle、 和 Platform.EndpointMaxEnvThrottle錯誤類型)Platform.EndpointRequestThrottle,請參閱 區域用量和限流指標。

日誌或指標遺失

  • 確認執行角色可以建立日誌群組和串流,並放置目的地日誌群組及其.local配套的日誌事件。

  • 查看主區域中的集中式日誌群組。請勿建置取決於臨時複本區域或.local日誌群組的診斷。

  • 當您需要 DEBUG時,將 systemLogLevel設定為 platform.requestComplete。

  • 建立或更新資源後,允許 進行遙測傳送延遲。請勿將暫時缺少指標或日誌事件視為未執行請求的證明。

  • 請記住,指標是稀疏的。設定警示,將遺失的錯誤指標視為未違反適當的錯誤指標。

如果完全沒有應用程式日誌出現,執行角色可能缺少 Amazon CloudWatch Logs 許可。將 AWSLambdaBasicExecutionRole受管政策連接至執行角色,或授予 logs:CreateLogGroup、 logs:CreateLogStream和 logs:PutLogEvents。如要了解必要的許可,請參閱 執行角色。

程式碼儲存和加密問題

遺失或無法存取的 Amazon S3 物件版本

確認儲存貯體仍然已啟用版本控制、存在確切的物件版本,以及發起人和 Lambda 服務主體都具有所需的讀取許可。如果作用中修訂版無法存取其固定物件版本,請建立參考可用版本的新修訂版。如需詳細資訊,請參閱從 Amazon S3 部署 Web 函數程式碼。

AWS KMS 存取失敗

檢查發起人許可、金鑰政策、加密內容、金鑰狀態和 Lambda 服務主體的kms:Decrypt許可。對於 MultiRegion和 PerRegion端點,驗證多區域 AWS KMS 金鑰的複本是否存在,並且在每個目標區域中都可用。如需詳細資訊,請參閱Web 函數的靜態加密。

MultiRegion 和 PerRegion端點的問題

使用 regionalEndpoints 欄位來識別受影響的區域。比較其 stateReason和 updateStatusReason與運作狀態良好的區域。檢查區域配額、 AWS KMS 金鑰複本、執行時間可用性,以及修訂的複寫狀態。修正原因後,重複端點更新。如需複寫模型,請參閱 多區域部署。

對於MultiRegion端點,以延遲為基礎的路由 (將請求導向測量到最低延遲的區域) 不保證每個請求都會進入最低延遲的區域。從受影響的用戶端位置進行測試,並檢查應用程式日誌,以判斷處理請求的區域。對於PerRegion端點,也請驗證外部 DNS 或前門路由組態。

網路和連線問題

大多數連線問題來自沒有連接器參考或參考舊版連接器的服務修訂版,或來自封鎖流量的連接器子網路、安全群組或路由。

使用下列序列來隔離連線問題:

  1. 執行 get-web-function-endpoint。檢查自動部署模式,並確認哪些修訂或修訂會接收流量。

  2. get-web-function-revision 為每個服務修訂執行 。確認其狀態為 Active且參考預期的連接器版本。

  3. aws lambda-core get-network-connector --identifier 使用修訂版 的連接器 ARN 執行 egressNetworkConnectorArn。確認 State 是 ACTIVE ,如果連接器已更新,LastUpdateStatus則為 Successful。否則,請使用 StateReasonCode或 LastUpdateStatusReasonCode來識別原因,例如 InsufficientRolePermissions、 InvalidSubnet或 SubnetOutOfIPAddresses。

  4. 依 IP 地址測試目的地,將網路連線能力與 DNS 解析分開。

  5. 檢查連接器子網路路由、目的地安全群組和網路 ACLs。

  6. 檢閱連接器子網路上的 VPC 流程日誌。

常見的症狀包括下列項目。

徵狀Check
公有網際網路可運作,但 VPC 資源無法運作服務修訂版沒有連接器參考。
VPC 存取適用於某些請求端點正路由至具有不同連接器組態的兩個修訂版。
連接器更新沒有效果服務修訂版參考較舊的連接器版本。
新增連接器後公有存取會停止連接器子網路沒有所需的 NAT 或 IPv6 路由。
一個 VPC 目的地逾時目的地安全群組、路由表或網路 ACL 會封鎖連線。
流程日誌不包含相符的記錄流量未輸入 VPC。重新檢查服務修訂版和連接器參考。
私有名稱失敗,但直接 IP 連線正常運作檢查 VPC DNS 屬性和私有託管區域關聯。
IPv4 正常運作,但 IPv6 失敗檢查DualStack連接器版本、IPv6 路由和 IPv6 安全規則。
服務修訂是 ,Active但函數無法連接私有 VPC 資源 服務修訂版不會設定輸出網路連接器 (egressNetworkConnectorArn)。使用 讀取 欄位get-web-function-revision;如果是空的,請建立設定 的修訂egressNetworkConnectorArn。如需詳細資訊,請參閱設定 AWS Lambda Web 函數的聯網。

沒有 Web Function 執行環境的互動式存取權。使用應用程式日誌、端點回應標頭、資源狀態欄位、CloudWatch 指標和 VPC 流程日誌來診斷失敗。

準備呈報套件

如果上述檢查無法識別原因,請在開啟 AWS 支援 案例之前收集下列資訊。這可讓支援工程師關聯控制平面操作、區域部署、請求和遙測:

  • AWS 帳戶 ID、主區域、函數名稱、修訂 ID、端點名稱、端點類型和目標區域。

  • 代表性失敗的 UTC 時間戳記和請求路徑,以及 HTTP 狀態、lambda-web-logstream、 lambda-web-request-id和 lambda-web-error-type回應標頭。

  • 函數、修訂版、端點和區域 state、stateReason、 updateStatus和 updateStatusReason值。

  • 相關的集中式應用程式和系統日誌事件、調節和容量指標,以及發生問題時的近似流量速率。

  • 管理請求的 AWS CLI 版本和修訂後的複本。移除登入資料、應用程式秘密、字符和敏感請求資料。