訂閱以接收新文章的通知:

Cloudflare 在 2023 年 10 月 30 日發生的事件

2023-11-01

閱讀時間:4 分鐘
本貼文還提供以下語言版本:EnglishFrançaisDeutsch日本語한국어Español简体中文

2023 年 10 月 30 日,多個 Cloudflare 服務在 37 分鐘內不可用。這是由於 Workers KV 使用的部署工具設定錯誤造成的。這是一起令人懊惱的事件,由於 Cloudflare 依賴於我們自己的產品套件,這起事件變得更加棘手。我們對此事給客戶造成的影響深表歉意。下面我們將討論出錯的原因、事件的解決方式以及我們為確保此類事件不再發生而正在開展的工作。

Workers KV 是我們的全球分散式鍵值儲存服務。客戶和 Cloudflare 團隊都使用它來管理設定資料、路由查詢、靜態資產套件、驗證權杖和其他需要低延遲存取的資料。

在此事件中,由於 KV 使用的新部署工具中存在錯誤,KV 傳回了它認為有效的 HTTP 401 (Unauthorized) 狀態碼,而不是請求的鍵值組。

這些錯誤對於每個產品的表現有所不同,具體取決於每個服務使用 KV 的情況,其影響詳述如下。

受到影響的內容

許多 Cloudflare 服務都依賴 Workers KV 在全球範圍內分發設定、路由資訊、靜態資產服務和驗證狀態。這些服務在對 KV 命名空間執行任何 get、put、delete 或 list 操作時,會收到 HTTP 401 (Unauthorized) 錯誤。

使用以下 Cloudflare 產品的客戶遇到該錯誤的可能性更高,而且/或在事件發生期間無法存取部分或全部功能:

.tg {border-collapse:collapse;border-color:#ccc;border-spacing:0;} .tg td{background-color:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;word-break:normal;} .tg th{background-color:#f0f0f0;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;} .tg .tg-7s56{background-color:#F4F5F7;text-align:left;vertical-align:top} .tg .tg-0lax{text-align:left;vertical-align:top}

Product Impact
Workers KV Customers with applications leveraging KV saw those applications fail during the duration of this incident, including both the KV API within Workers, and the REST API.
Workers applications not using KV were not impacted.
Pages Applications hosted on Pages were unreachable for the duration of the incident and returned HTTP 500 errors to users. New Pages deployments also returned HTTP 500 errors to users for the duration.
Access Users who were unauthenticated could not log in; any origin attempting to validate the JWT using the /certs endpoint would fail; any application with a device posture policy failed for all users.
Existing logged-in sessions that did not use the /certs endpoint or posture checks were unaffected. Overall, a large percentage of existing sessions were still affected.
WARP / Zero Trust Users were unable to register new devices or connect to resources subject to policies that enforce Device Posture checks or WARP Session timeouts.
Devices already enrolled, resources not relying on device posture, or that had re-authorized outside of this window were unaffected.
Images The Images API returned errors during the incident. Existing image delivery was not impacted.
Cache Purge (single file) Single file purge was partially unavailable for the duration of the incident as some data centers could not access configuration data in KV. Data centers that had existing configuration data locally cached were unaffected.
Other cache purge mechanisms, including purge by tag, were unaffected.
Workers Uploading or editing Workers through the dashboard, wrangler or API returned errors during the incident. Deployed Workers were not impacted, unless they used KV.
AI Gateway AI Gateway was not able to proxy requests for the duration of the incident.
Waiting Room Waiting Room configuration is stored at the edge in Workers KV. Waiting Room configurations, and configuration changes, were unavailable and the service failed open.
When access to KV was restored, some Waiting Room users would have experienced queuing as the service came back up.
Turnstile and Challenge Pages Turnstile's JavaScript assets are stored in KV, and the entry point for Turnstile (api.js) was not able to be served. Clients accessing pages using Turnstile could not initialize the Turnstile widget and would have failed closed during the incident window.
Challenge Pages (which products like Custom, Managed and Rate Limiting rules use) also use Turnstile infrastructure for presenting challenge pages to users under specific conditions, and would have blocked users who were presented with a challenge during that period.
Cloudflare Dashboard Parts of the Cloudflare dashboard that rely on Turnstile and/or our internal feature flag tooling (which uses KV for configuration) returned errors to users for the duration.

產品

影響

Time Description
2023-10-30 18:58 UTC The Workers KV team began a progressive deployment of a new KV build to production.
2023-10-30 19:29 UTC The internal progressive deployment API returns staging build GUID to a call to list production builds.
2023-10-30 19:40 UTC The progressive deployment API was used to continue rolling out the release. This routed a percentage of traffic to the wrong destination, triggering alerting and leading to the decision to roll back.
2023-10-30 19:54 UTC Rollback via progressive deployment API attempted, traffic starts to fail at scale. — IMPACT START —
2023-10-30 20:15 UTC Cloudflare engineers manually edit (via break glass mechanisms) deployment routes to revert to last known good build for the majority of traffic.
2023-10-30 20:29 UTC Workers KV error rates return to normal pre-incident levels, and impacted services recover within the following minute.
2023-10-30 20:31 UTC Impact resolved — IMPACT END —

Workers KV

對於利用 KV 的應用程式,其客戶會在此次事件期間發現這些應用程式失敗,包括 Workers 中的 KV API 和 REST API。不使用 KV 的 Workers 應用程式不受影響。

Pages

事件發生期間,Pages 上託管的應用程式無法連線,並向使用者傳回了 HTTP 500 錯誤。在此期間,新的 Pages 部署也會向使用者傳回 HTTP 500 錯誤。

Access

未經驗證的使用者無法登入;任何嘗試使用 /certs 端點驗證 JWT 的源都會失敗;任何具有裝置狀態原則的應用程式對所有使用者來說都會失敗。不使用 /certs 端點或狀態檢查的現有登入工作階段不受影響。總體而言,很大一部分現有工作階段仍然受到影響。

WARP / Zero Trust

使用者無法註冊新裝置或連接到受執行裝置狀態檢查或 WARP 工作階段逾時原則約束的資源。已註冊的裝置、不依賴裝置狀態的資源或在此時間段外重新授權的裝置不受影響。

Images

事件發生期間,Images API 傳回了錯誤。現有影像傳遞不受影響。

快取清除(單一檔案)

由於某些資料中心無法存取 KV 中的設定資料,在事件發生期間,單一檔案清除部分不可用。本機快取有現有設定資料的資料中心不受影響。其他快取清除機制(包括依標記清除)未受影響。

Workers

事件發生期間,透過儀表板、Wrangler 或 API 上傳或編輯 Workers 傳回了錯誤。除了利用 KV 的 Workers 外,已部署的 Workers 不受影響。

AI Gateway

事件發生期間,AI Gateway 無法代理請求。

Waiting Room

Waiting Room 設定儲存在邊緣的 Workers KV 中。Waiting Room 設定和設定變更不可用,服務無法開啟。在對 KV 的存取恢復後,一些 Waiting Room 使用者會在服務恢復時遇到排隊問題。

Turnstile 和 Challenge Pages

Turnstile 的 JavaScript 資源儲存在 KV 中,並且無法提供 Turnstile (api.js) 的入口點。使用 Turnstile 存取頁面的用戶端無法初始化 Turnstile 小工具,並且在事件持續期間無法關閉。(自訂、受管理和限速規則等產品使用的)Challenge Pages 也使用 Turnstile 基礎結構在特定條件下向使用者呈現驗證頁面,並且會封鎖在此期間遇到驗證的使用者。

Cloudflare 儀表板

Cloudflare 儀表板中依賴於 Turnstile 和/或我們的內部功能標記工具(使用 KV 進行設定)的部分在此期間向使用者傳回了錯誤。

時間表

所有時間戳記均為世界標准時間 (UTC)。

.tg {border-collapse:collapse;border-color:#ccc;border-spacing:0;} .tg td{background-color:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;word-break:normal;} .tg th{background-color:#f0f0f0;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;} .tg .tg-ppch{background-color:#F4F5F7;color:#000000;font-weight:bold;text-align:left;vertical-align:top} .tg .tg-096r{color:#000000;text-align:left;vertical-align:top}

時間

描述

2023-10-30 18:58 UTC

Workers KV 團隊開始逐步將新的 KV 版本部署到生產。

2023-10-30 19:29 UTC

內部漸進式部署 API 將暫存版本 GUID 傳回給一個呼叫,以列出生產版本。

2023-10-30 19:40 UTC

使用漸進式部署 API 繼續推出發佈版本。這將一定比例的流量路由到錯誤的目的地,觸發警示並導致決定復原。

2023-10-30 19:54 UTC

嘗試透過漸進式部署 API 進行復原,流量開始大規模失敗。 — 影響開始 —

2023-10-30 20:15 UTC

Cloudflare 工程師(透過 break glass 機制)手動編輯部署路線,使大部分流量還原到最後已知的良好版本。

2023-10-30 20:29 UTC

Workers KV 錯誤率恢復到事件前的正常水平,受影響的服務在隨後一分鐘內復原。

2023-10-30 20:31 UTC

影響解決 — 影響結束 —

如上面的時間線所示,我們在世界標准時間 19:54 意識到出現問題,而在世界標准時間 20:15 才實際上能夠執行復原,二者之間存在延遲。

造成這種情況的原因是,Cloudflare 中的多個工具都依賴於 Workers KV,包括 Cloudflare Access。Access 利用 Workers KV 作為其請求驗證流程的一部分。因此,我們無法利用我們的內部工具,只能使用 break-glass 機制來繞過正常的工具。如下所述,我們沒有花費足夠的時間來測試復原機制。我們計畫進一步加強這一點。

解析度

Cloudflare 工程師(透過 break glass 機制)手動將生產路由切換到 Workers KV 的先前工作版本,這立即消除了失敗的請求路徑,並隨後解決了 Workers KV 部署的問題。

分析

Workers KV 是一種低延遲鍵值儲存服務,允許使用者在 Cloudflare 網路上盡可能靠近使用者的地方儲存持久資料。這種分散式鍵值儲存用於許多應用程式,其中一些是 Cloudflare 的第一方產品,如 Pages、Access 和 Zero Trust。

事件發生時,Workers KV 團隊正在使用專門的部署工具逐步部署新版本。部署機制包含一個暫存環境和一個生產環境,並利用一個流程,將生產環境逐步升級到新版本,直到所有生產環境都升級到最新的生產版本。部署工具在其傳回發佈版本及其各自版本的方式上存在一個潛在錯誤。該工具不是從單一環境傳回發佈版本,而是傳回比預期更廣泛的版本清單,導致生產版本和暫存版本一起傳回。

在此次事件中,服務已在暫存中進行了部署和測試。但由於部署自動化錯誤,在升級到生產時,錯誤地引用了已部署到暫存帳戶的指令碼,而不是生產帳戶上的預生產版本。結果,部署機制將生產環境指向一個未在生產環境中任何地方執行的版本,導致阻斷了流量。

發生這種情況時,Workers KV 在生產中變得無法連線,因為對產品的呼叫被導向到未授權生產存取的版本,從而傳回 HTTP 401 錯誤代碼。這導致在 KV 中儲存鍵值組的相依產品失敗,無論鍵值組是否在本機快取。

雖然自動警示系統立即偵測到了問題,但從我們意識到出現問題到實際能夠執行復原之間還是有一定的延遲。造成這種情況的原因是,Cloudflare 中的多個工具都依賴於 Workers KV,包括 Cloudflare Access。Access 使用 Workers KV 作為使用者 JWT(JSON Web 權杖)驗證流程的一部分。

這些工具包括用於還原變更的儀表板,以及存取我們的持續整合 (CI) 系統的驗證機制。由於 Workers KV 出現故障,這些服務也隨之中斷。透過我們的 CI 系統進行的自動復原之前已成功測試,但由於該事件導致的驗證問題(Access 依賴於 KV),使得無法存取復原部署所需的機密。

最終的修復方法是將生產版本路徑手動變更為之前的已知良好狀態。該路徑之前已部署,並且是本次部署嘗試之前的先前生產版本。

後續步驟

隨著 Cloudflare 越來越多的團隊建立在 Workers 之上,我們最終「有組織地」達到了現在的狀態,即由 Workers KV 來支援我們大量產品和服務。此次事件的發生讓我們再一次意識到,我們需要重新審視如何減少關鍵相依性的影響範圍的必要性,其中包括提高部署工具的複雜性、其對於內部團隊的易用性以及對這些相依性的產品層級控制。我們正在優先開展這些工作,以確保不再發生類似事件。

這也加強了 Cloudflare 在內部和為客戶逐步部署 Workers 應用程式時改進工具和工具安全性的必要性。

這包括(但不限於)以下本季度主要後續行動清單(排名不分先後):

  1. 將 KV 部署納入標準化 Workers 部署模型,該模型使用自動化系統進行影響偵測和復原。

  2. 確保復原過程可以存取已知良好的部署識別碼,並且在 Cloudflare Access 關閉時可以正常運作。

  3. 向部署新增預檢查,這將驗證輸入參數,以確保版本不匹配不會傳播到生產環境。

  4. 強化漸進式部署工具,使其以專為多租用戶設計的方式運作。當前設計採用單一租用戶模型。

  5. 向漸進式部署指令碼新增額外的驗證,以驗證部署是否與應用程式環境(生產、暫存等)相匹配。

我們再次對這一事件的發生深表歉意,並非常嚴肅地對待這一事件對客戶造成的影響。

我們保護整個企業網路,協助客戶有效地建置網際網路規模的應用程式,加速任何網站或網際網路應用程式抵禦 DDoS 攻擊,阻止駭客入侵,並且可以協助您實現 Zero Trust

從任何裝置造訪 1.1.1.1,即可開始使用我們的免費應用程式,讓您的網際網路更快速、更安全。

若要進一步瞭解我們協助打造更好的網際網路的使命,請從這裡開始。如果您正在尋找新的職業方向,請查看我們的職缺
Post Mortem

在 X 上進行關注

Matt Silverlock|@elithrar
Cloudflare|@cloudflare

相關貼文