疑難排解
概觀
瞭解如何使用 CloudFront 疑難排解問題,有助於操作人員 和 SRE 快速修復 Web 應用程式不同部分可能發生的錯誤,例如:CloudFront、邊緣函數或來源。其中一些錯誤包括:不堪負荷的來源傳回 5xx 錯誤、CloudFront 無法連接到來源,或程式碼中出現未處理的異常後 Lambda@Edge 執行失敗。
追蹤使用者請求來源
CloudFront 會針對其處理的每個請求產生唯一的請求 ID。建議在請求流經應用程式堆疊時使用其 ID 來追蹤請求:
- CloudFront 在傳回 HTTP 請求的回應時會新增 x-amz-cf-id 標頭,其中包含請求 ID。
- CloudFront 會將請求 ID 包含在以下位置:為存取日誌中的請求所產生的日誌記錄之 x-edge-request-id 欄位中。如果 AWS WAF WebACL 已附加到 CloudFront 分佈,則 WAF 會將請求 ID 包含在以下位置:為 WAF 日誌中的請求所產生的日誌記錄之 requestId 欄位中。例如,OLX 建立了一個聊天機器人,Slack 中的客戶支援工程師可以使用該機器人透過 WAF 日誌中的請求 ID 來查詢特定請求,以了解其被封鎖的原因,然後每天更快地回應客戶工單。
- 如果在 CloudFront 分佈上設定邊緣函數,則該請求 ID 將可供事件物件中的 requestId 欄位中之函數使用,同時適用於 (CloudFront Functions 和 Lambda@Edge)。
- 如果快取未命中,當 CloudFront 將請求轉發到來源時,會將 x-amz-cf-id 標頭附加到請求中,並帶有請求 ID 的值。建議您在原始伺服器上記錄此標頭。
使用 CloudFront 來疑難排解錯誤
當您的監控系統 (例如 CloudWatch 警示) 偵測到 4xx 或 5xx 錯誤的回應增加時,您需要深入了解錯誤類型以及發生的位置才能修復錯誤。
為此,請篩選導致錯誤代碼的記錄上之 CloudFront 存取日誌,並檢查 x-edge-result-type、x-edge-response-result-type 和 x-edge-detailed-result-type 日誌欄位,以更深入地了解這個問題。分析存取日誌取決於您儲存日誌的位置。有一種非常簡單的方法,那就是使用具有標準 SQL 查詢的 Athena 來查詢儲存在 S3 中的日誌。例如,下列 SQL 查詢會篩選特定日期範圍內的 5xx 錯誤日誌,僅限於前 100 筆記錄。
選取 * AS count FROM cloudfront_logs
WHERE status >= 500 AND "date" BETWEEN DATE '2022-06-09' AND DATE '2022-06-10'
LIMIT 100;
在某些情況下,請考慮 WAF 或 CloudFront 的日誌,以獲取其他疑難排解資訊。例如,AWS WAF 日誌可以解釋特定請求遭到封鎖的原因。您還可以檢查 CloudWatch Logs 中的邊緣函數日誌,以了解導致 5xx 的執行錯誤。最後,建議您了解 CloudFront 快取錯誤的方式,以得知 CloudFront 快取何時會傳回錯誤回應。
使用 CloudFront 來疑難排解延遲
當您的監控系統 (例如,針對來源延遲和快取命中率指標的 CloudWatch 警報) 偵測到回應延遲增加時,您需要了解延遲瓶頸在哪裡才能進行修復。因此,請考慮分析 CloudFront 存取日誌中的延遲欄位。請考慮以下欄位:
- time-to-first-byte:CloudFront 和檢視器之間的第一位元組延遲,可在標準日誌和即時日誌中取得
- time-taken:CloudFront 和檢視器之間的最後位元組延遲,可在標準日誌和即時日誌中取得
- origin-fbl:CloudFront 和您的來源之間的第一位元組延遲,可在即時日誌中取得
- origin-lbl:CloudFront 和您的來源之間的最後位元組延遲,可在即時日誌中取得
您可以將 SQL 查詢分組至其中一個相關維度 (例如 URL 或國家/地區) 來分析這些欄位。這樣做可以幫助您將延遲問題的範圍縮小。此外,如果伺服器計時標頭在回應標頭政策中已設定,您可以使用 CloudFront 的伺服器計時標頭在用戶端找到相同的資訊。下面的伺服器計時標頭解釋說,我的請求是對馬賽 MRS52-P1 彈出的快取命中,下游第一個位元組延遲為 64 毫秒。請注意 CloudFront 產生的 Age 標頭,其用於說明此內容自 61 秒以來已從來源擷取或重新整理。
使用 CloudWatch RUM 來疑難排解 Web 效能
CloudWatch RUM 透過整合 javascript 標籤到您的網頁,讓您能夠監控用戶端的應用程式。javascript 會從瀏覽器 API 收集資料,例如連線步驟 (DNS 查找、TCP 連線等) 或 Google Core Web 核心 (LCP、FID 等) 頁面載入時間明細,然後將其傳送到 CloudWatch RUM 進行儀表板作業。您可透過篩選特定維度 (例如瀏覽器類型、使用者國家/地區或特定頁面 ID) 來分析應用程式效能。
請求 AWS Support 協助
如果您需要 AWS Support 協助進一步疑難排解錯誤或延遲問題,請向支援人員開立工單,其中應包含與緩慢請求或導致錯誤的請求對應的 CloudFront 請求 ID 清單。透過您提供的請求 ID,支援工程師能夠深入研究內部日誌,從而更深入了解問題,並提供有關如何修正問題的建議。
資源
- 文件:疑難排解在設定 Amazon CloudFront 以分發內容時可能遇到的常見問題
- 部落格:在 AWS 上偵錯內容交付的四個步驟。請注意,雖然本部落格已過時,但該方法仍然有效。
- 文件:如何疑難排解並減少 CloudFront 增加的延遲?
- 方法類:AWS Support 提供的 CloudFront 疑難排解文章
- 方法類:AWS Support 提供的 AWS WAF 疑難排解文章
- AWS re:Invent 2021 – 透過 Amazon CloudWatch RUM 運用終端使用者洞察來最佳化應用程式
- 部落格:分析 Amazon CloudWatch Logs 中的 AWS WAF 日誌
- 文件:測試和偵錯 Lambda@Edge 函數
- 部落格:使用 OpenTelemetry 透過 Amazon CloudFront 來設定端對端追蹤