測試和偵 Lambda 函數 @Edge - Amazon CloudFront

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

測試和偵 Lambda 函數 @Edge

請務必單獨測試 Lambda @Edge 函數程式碼,以確保它完成預期的工作,並執行整合測試,以確保函數可以正常運作 CloudFront。

在整合測試期間或部署函數之後,您可能需要偵 CloudFront 錯錯誤,例如 HTTP 5xx 錯誤。錯誤可能是從 Lambda 函數傳回的無效回應、觸發函數時的執行錯誤,或是由於 Lambda 服務進行調節所產生的錯誤。本主題中的段落,說明了用來判斷是哪些故障類型造成問題的策略,以及您可採取的問題修正步驟。

注意

當您在疑難排解錯誤時檢閱 CloudWatch 記錄檔或指標時,請注意這些記錄檔或指標會顯示或儲存在 AWS 區域 距離函數執行位置最近的位置。因此,舉例來說,如果您的網站或 Web 應用程式有英國的使用者,而且您的發行版本有關聯的 Lambda 函數,則必須變更區域以檢視倫敦的 CloudWatch 指標或記錄檔 AWS 區域。如需詳細資訊,請參閱 確定 Lambda @Edge 區域

測試您 Lambda @Edge 函數

測試您的 Lambda 函數包括兩個步驟:獨立測試和整合測試。

測試獨立的功能

在將 Lambda 函數新增至之前 CloudFront,請務必先使用 Lambda 主控台中的測試功能或使用其他方法來測試功能。如需有關在 Lambda 主控台中進行測試的詳細資訊,請參閱AWS Lambda 開發人員指南的使用主控台叫用 Lambda 函數

測試你的函數的操作 CloudFront

完成集成測試很重要,其中您的函數與分發相關聯,並根據 CloudFront 事件運行。請確定已針對正確的事件觸發函數,並傳回有效且正確的回應 CloudFront。例如,請確定事件結構是正確的,只包含有效的標頭,以此類推。

當您在 Lambda 主控台中使用函數進行整合測試時,請參閱 Lambda @Edge 教學課程中的步驟,同時修改程式碼或變更呼叫函數的 CloudFront 觸發器。例如,請確定您使用函式的編號版本,如教學課程的這項步驟中所述:步驟 4:添加CloudFront 觸發器以運行該函數

當您進行變更並部署它們時,請注意,更新的函數和 CloudFront 觸發程序將需要幾分鐘的時間才能跨所有區域進行複寫。這通常需要幾分鐘的時間,但最多可能需要 15 分鐘。

您可以通過轉到 CloudFront控制台並查看您的發行版來檢查複寫是否已完成。

若要檢查您的複寫是否已完成部署
  1. 在開啟 CloudFront 主控台https://console.aws.amazon.com/cloudfront/v4/home

  2. 選擇分配名稱。

  3. 檢查分佈的狀態是否已從 In Progress (進行中) 變回 Deployed (已部署),這表示您的函數已複寫完成。接著,請依照下一節的步驟來驗證函數是否正常運作。

請注意,在主控台中進行的測試只會驗證您的函數邏輯,並不會套用 Lambda@Edge 特定的服務配額 (先前稱為限制)。

識別 Lambda 的 @Edge 函數錯誤 CloudFront

在驗證函數邏輯正常工作之後,當您的函數運行時,您可能仍會看到 HTTP 5xx 錯誤。 CloudFront可能會傳回 HTTP 5xx 錯誤的原因有多種,其中CloudFront可能包括中的 Lambda 函數錯誤或其他問題。

  • 如果您使用 Lambda @Edge 函數,則可以使用 CloudFront 主控台中的圖形來協助追蹤造成錯誤的原因,然後進行修正。例如,您可以查看 HTTP 5xx 錯誤是由 Lambda 函數引起 CloudFront 還是由 Lambda 函數引起,然後針對特定函數,您可以檢視相關的記錄檔以調查問題。

  • 若要疑難排解中的 HTTP 錯誤 CloudFront,請參閱下列主題中的疑難排解步驟:從原始伺服器故障診斷錯誤回應

導致 Lambda @Edge 函數錯誤的原因 CloudFront

Lambda 函數造成 HTTP 5xx 錯誤的原因有許多種,您應該依據錯誤的類型採取相應的疑難排解步驟。錯誤分類如下:

Lambda 函數執行錯誤

由於函數中存在未處理的例外狀況或程式碼中有錯誤,因此 CloudFront 沒有從 Lambda 取得回應時,就會產生執行錯誤。例如,如果程式碼包含回呼 (錯誤)。

傳回無效的 Lambda 函數回應 CloudFront

函數運行後, CloudFront 接收來自 Lambda 的響應。如果回應的物件結構不符合 Lambda@Edge 事件結構說明頁面,或回應中包含無效的標頭或其他無效的欄位,系統會傳回錯誤。

由於 Lambda 服務配額 (先前稱為限制),中 CloudFront 的執行會受到限制

Lambda 服務會在各區域中調節執行作業,並在您超出配額時傳回錯誤。如需詳細資訊,請參閱 Lambda@Edge 的配額

如何判斷故障的類型

為了協助您決定在偵錯和解決傳回的錯誤時要集中在何處 CloudFront,找出傳回 HTTP 錯誤的原 CloudFront 因會很有幫助。若要開始使用,您可以使用 CloudFront 主控台的 [監視] 區段中提供的圖形 AWS Management Console。如需有關在主控台的 [視] 區段中檢視圖形的詳細資 CloudFront 訊,請參閱使用 Amazon CloudFront 監控指標 CloudWatch

以下圖表在您追縱原始伺服器或 Lambda 函數是否傳回錯誤時特別實用,當錯誤是由於 Lambda 函數造成時,也可縮小問題的類型。

錯誤率圖表

在每一個分佈的 Overview (概觀) 標籤上,您可以檢視的其中一個圖表就是 Error rates (錯誤率) 圖表。此圖表顯示錯誤率佔進入您分配的請求總數的百分比。此圖表顯示總錯誤率,總共 4xx 個錯誤、總共 5xx 個錯誤,以及總共 5xx 個 Lambda 函數的錯誤。根據錯誤類型和磁碟區,您可以採取步驟以針對原因進行調查和故障診斷。

CloudFront 分配的錯誤率圖表
  • 如果您看到 Lambda 錯誤,您可以透過查看該函數傳回的特定錯誤類型,以進一步進行調查。Lambda@Edge 錯誤標籤包含了依類型分類的函數錯誤圖表,可協助您找出特定函數的問題。

  • 如果您看到 CloudFront 錯誤,您可以進行疑難排解並努力修復原始錯誤或變更您的 CloudFront 組態。如需詳細資訊,請參閱 從原始伺服器故障診斷錯誤回應

執行錯誤和無效函數回應圖表

Lambda@Edge 錯誤標籤包含針對特定分佈 (依類型) 分類 Lambda@Edge 錯誤的圖表。例如,一個圖形顯示所有執行錯誤 AWS 區域。

若要更容易疑難排解問題,您可以依照區域開啟並檢查記錄檔中的特定功能,以尋找特定問題。

若要依區域檢視特定功能的記錄檔
  1. Lambda @Edge 錯誤索引標籤的關聯 Lambda @Edge 函數下,選擇函數名稱,然後選擇檢視指標

  2. 接下來,在具有函數名稱的頁面上,選擇右上角的 [檢視功能記錄],然後選擇 [區域]。

    例如,如果您在美國西部 (奧勒岡) 區域的「錯誤」圖表中看到問題,請從下拉式清單中選擇該區域。這將打開 Amazon CloudWatch 控制台。

  3. 在該區域的 CloudWatch 主控台的 [記錄串流] 下,選擇記錄資料流以檢視函數的事件。

此外,請閱讀此章的下列各節,以了解有關故障排除和修復錯誤的更多建議。

調節圖表

Lambda@Edge 錯誤標籤也包含調節圖表。有時,如果您到達區域並行數量配額 (先前稱為限制),則 Lambda 服務會依每一區域為基礎調節您的函數呼叫。如果出現超過限制錯誤,表示您的函數已到達 Lambda 服務對「區域」中的執行作業所施加的配額。如需詳細資訊,包括如何請求提高配額,請參閱Lambda@Edge 的配額

Lambda @Edge 函數執行的節流圖。

如需如何使用此資訊進行 HTTP 錯誤故障診斷的詳細資訊,請參閱在 AWS上針對您的內容交付執行偵錯的四個步驟

疑難排解無效的 Lambda @Edge 函數回應 (驗證錯誤)

如果您發現問題是 Lambda 驗證錯誤,則表示您的 Lambda 函數傳回無效的回應 CloudFront。請遵循本節中的指引,採取步驟檢閱您的功能,並確保您的回應符合需 CloudFront 求。

CloudFront 驗證來自 Lambda 函數的回應有兩種方式:

  • Lambda 回應必須符合所請求的物件結構。錯誤的物件結構範例包括:無法剖析的 JSON、遺漏必要的欄位,以及在回應中包含無效的物件。如需更多資訊,請參閱Lambda@Edge 事件結構說明頁面

  • 回應必須只包含有效的物件值。如果回應中包含有效的物件,但是具有不支援的值,將會發生錯誤。此種情況的範例包括:新增或更新被列入不允許或唯讀的標頭 (請參閱 對邊緣函數的限制)、超過內文大小的上限 (請參閱 Lambda@Edge 錯誤 主題中的對所產生回應的大小限制),以及無效的字元或值 (請參閱 Lambda@Edge 事件結構說明頁面)。

當 Lambda 傳回無效的回應時 CloudFront,會將錯誤訊息寫入日誌檔中,該記錄檔會CloudWatch 在 Lambda 函數執行的區域中 CloudFront 推送到。這是發生無效回應 CloudWatch時將記錄檔傳送至的預設行為。但是,如果您在功能發布 CloudFront 之前將 Lambda 函數與相關聯,則可能不會為您的函數啟用該函數。如需詳細資訊,請參閱主題中的判斷您的帳戶是否將記錄檔推送至 CloudWatch稍後。

CloudFront 將日誌文件推送到與您的分發相關聯的日誌組中的功能執行位置對應的區域。日誌組具有以下格式:/aws/cloudfront/LambdaEdge/DistributionId,其中DistributionId是分發的 ID。若要判斷可以找到 CloudWatch 記錄檔的區域,請參閱本主題稍後的判斷 Lambda @Edge 區域

如果錯誤可重現,您可以建立會導致錯誤的新要求,然後在失敗的 CloudFront 回應 (X-Amz-Cf-Id標頭) 中尋找要求識別碼,以便在記錄檔中尋找單一失敗。日誌檔案記錄所包含的資訊,可協助您找出傳回錯誤的原因,也可以列出對應的 Lambda 請求 ID,來讓您針對單一請求的範圍,分析錯誤的根本原因。

如果錯誤是間歇性的,您可以使用 CloudFront 存取記錄檔來尋找失敗之要求的要求識別碼,然後搜尋對應錯誤訊息的 CloudWatch 記錄檔。如需詳細資訊,請參閱先前的段落判斷故障的類型

疑難 Lambda 解函數執行錯誤 @Edge

如果問題是 Lambda 執行錯誤,建立 Lambda 函數的記錄陳述式、將訊息寫入記 CloudWatch 錄檔,以監控函數的執行情況,以 CloudFront 及判斷其是否如預期般運作會很有幫助。然後,您可以在 CloudWatch 記錄檔中搜尋這些陳述式,以確認您的函數是否正常運作。

注意

即使您未變更您的 Lambda@ Edge 函數,Lambda 函數執行環境的更新仍會對其造成影響,並因而傳回執行錯誤。如需測試及移轉至更新版本的相關資訊,請參閱 AWS Lambda 和 AWS Lambda @Edge 執行環境的即將更新。

確定 Lambda @Edge 區域

若要查看 Lambda @Edge 函數接收流量的區域,請在CloudFront 主控台上檢視該函數的指標 AWS Management Console。顯示每個 AWS 區域的量度。在同一頁面中,您可以選擇一個區域並檢視該區域的日誌檔,以便調查問題。您必須檢閱正確 AWS 區域中的 CloudWatch 記錄檔,以查看 CloudFront 執行 Lambda 函數時建立的記錄檔。

如需有關在主控台的 [視] 區段中檢視圖形的詳細資 CloudFront 訊,請參閱使用 Amazon CloudFront 監控指標 CloudWatch

判斷您的帳戶是否將記錄推送至 CloudWatch

依預設,會 CloudFront 啟用記錄無效的 Lambda 函數回應,並使用其中一個將記錄檔推 CloudWatch 送至. Lambda@Edge 的服務連結角色 如果您在發行無效的 Lambda 函數回應記錄功能 CloudFront 之前已新增 Lambda @Edge 函數,則會在您下次更新 Lambda @Edge 組態時 (例如新增 CloudFront觸發程序) 啟用記錄功能。

您可以執行下列動作,確認您 CloudWatch 的帳戶已啟用將記錄檔推送至:

  • 檢查日誌是否出現在中 CloudWatch — 確保您查看 Lambda @Edge 函數執行的區域。如需詳細資訊,請參閱 確定 Lambda @Edge 區域

  • 判斷 IAM 中的帳戶中是否存在相關的服務連結角色 — 您的帳AWSServiceRoleForCloudFrontLogger中必須具有 IAM 角色。如需有關此角色的詳細資訊,請參閱 Lambda@Edge 的服務連結角色