事後分析:未找到 Docker 映像檔案
2023-12-17 Logto 服務中斷事故報告,由於生產 Docker 映像檔案丟失。
總結
我們在 2023-12-17 經歷了一次服務中斷,原因是 Logto 生產 Docker 映像檔案丟失。
- 事故時間:2023-12-17 03:56:00 UTC
- 事故持續時間:18 分鐘
- 服務影響:在事故期間,Logto 雲端服務和 Logto 核心服務無法使用。
- 影響級別:嚴重
- 根本原因:Logto 生產 Docker 映像檔案被誤刪。未能從 GitHub Container Registry 獲取映像檔案。
時間線
時間 | 事件 |
---|---|
早期 2023-12-17 (具體時間未知) | 執行 Logto 自動化 GitHub 映像保留工作流程。logto 和 logto-cloud 生產映像檔案被誤刪。 |
2023-12-17 03:56:00 UTC | Logto 雲端服務和 Logto 核心服務變得無法使用。事故被我們的監控系統檢測到。 |
2023-12-17 04:03:00 UTC | 值班工程師承認事故發生。 |
2023-12-17 04:10:00 UTC | 觸發最新映像的 Logto 雲端服務和 Logto 核心服務的新部署。 |
2023-12-17 04:15:00 UTC | Logto 雲端服務和 Logto 核心服務恢復可用。事故自動解決。 |
事故分析
發生了什麼
Logto 服務生產映像檔案被我們的自動化 GitHub 映像保留工作流程刪除 。雲端服務未能從 GitHub Container Registry 獲取映像檔案,變得無法使用。
為什麼發生
自動化 GitHub 映像保留工作流程誤刪了生產映像檔案。該工作流程旨在刪除所有超過 3 天未標籤的舊版映像檔案。
我們為生產映像檔案標記了 prod
標籤,以識別它們為生產映像檔案。每當觸發生產部署時,都會構建並推送一個新的具有 prod
標籤的映像檔案到 GitHub Container Registry。新的映像檔案成功構建和推送後,舊映像檔案的 prod
標籤將被移除。舊映像檔將變為未標籤,並將被自動化 GitHub 映像保留工作流程刪除。
Logto 服務映像被構建為支持多種架構。該映像使用 buildx
構建,並使用 --platform
標誌推送到 GitHub Container Registry。所有標籤都應用於根 manifest 清單。prod
標籤也應用於根 manifest 清單。列於多架構 manifest 清單下的所有子映像保持未標籤。
由於缺乏對 Docker 映像標籤和 manifest 清單結構的仔細審查,我們簡單地配置了自動化 GitHub 映像保留工作流程以刪除所有未標籤的映像。該工作流程刪除了列於多架構 manifest 清單下的所有子映像。
影響
此事件導致 Logto 雲端服務和 Logto 核心服務無法使用約 18 分鐘。終端用戶無法登錄 Logto 和訪問其客戶端應用程式。Logto 雲端管理入口在事故期間也無法使用。
解決
我們已停止自動化 GitHub 映像保留工作流程,並部署了一個新映像到 GitHub Container Registry,並具 prod
標籤。Logto 雲端服務和 Logto 核心服務成功從 GitHub 容器註冊表獲取了新映像。服務再次可用。
課堂學習
- 在生產環境中未經仔細審查和測試,絕不能發布工作流程。
- 在執行之前,對任何資源刪除作業進行試運行。
- 始終為生產環境準備備用方案。
- 仔細定義新的映像保留政策。
糾正和預防措施
- ✅ 突然停止自動化 GitHub 映像保留工作流程。