繁體中文(香港)
  • 事後報告
  • 雲端服務
  • 事故

事後報告:Bad Gateway

2024年1月11日 Logto 服務中斷的事故報告,原因是域名續期失敗。

Gao
Gao
Founder

摘要

在 2024 年 1 月 11 日,Logto 服務經歷了服務中斷,出現許多 502 Bad Gateway 錯誤。

  • 開始時間: 大約在 2024 年 1 月 11 日 15:28 UTC
  • 解決時間: 大約在 2024 年 1 月 12 日 00:49 UTC
  • 持續時間: 大約 9 小時
  • 受影響的服務: Logto 驗證服務,Logto 雲端服務
  • 影響程度: 嚴重
  • 根本原因: logto.app 域名到期,續期未能完成。

時間線

  • 2024 年 1 月 11 日 15:28 UTC 使用者報告在訪問 Logto 驗證服務時遇到 502 Bad Gateway 錯誤。
  • 2024 年 1 月 11 日 15:42 UTC 更多使用者報告相同問題。
  • 2024 年 1 月 11 日 15:50 UTC 我們的團隊成員開始調查問題,並致電其他團隊成員。由於對部分成員已經是深夜,普通電話未能強烈地喚醒他們。
  • 2024 年 1 月 12 日 23:54 UTC 我們發現雲端服務正在向驗證服務發送請求,但由於出現 ERR_TLS_CERT_ALTNAME_INVALID 錯誤,請求失敗。
  • 2024 年 1 月 12 日 00:36 UTC 我們清除了 DNS 緩存,希望有幫助,但沒有。
  • 2024 年 1 月 12 日 00:38 UTC 我們重新簽發了 TLS 證書,希望有幫助,但仍無效。
  • 2024 年 1 月 12 日 00:45 UTC 我們注意到 logto.app 域名可能已經到期。檢查域名註冊商後發現未成功續期,域名已過期。
  • 2024 年 1 月 12 日 00:49 UTC 域名續期完成。服務逐漸恢復正常。

事件分析

發生了什麼?

我們的域名通常通過域名註冊商自動續期。然而,此次續期過程因潛在的配置錯誤而失敗。因此,logto.app 域名過期,DNS 記錄被更新指向註冊商的停車頁面。

目前,驗證服務仍在運行,但大多數請求無法到達。惟一例外的是綁定到 auth.logto.io 域名的 Logto 管理租戶,不受過期影響。

除了驗證服務,我們還有一個協調 Logto 租戶和提供 Logto 雲端控制台(前端應用程式)的雲端服務。

當使用者操作雲端控制台時,應用程式不直接調用驗證服務,而是調用雲端服務進行所有管理操作。

為了對應 Logto 管理 API,我們設計了一個 "管理 API 代理" 端點來轉發請求到驗證服務。整個流程如下:

由於 *.logto.app 域名存在證書不匹配問題,雲端服務(Node.js)拒絕請求並拋出錯誤。

通常情況下,請求錯誤會被捕獲以防止整個服務崩潰。然而,由於錯誤是從代理模塊傳遞出來的,現有的錯誤處理邏輯未能捕獲,導致服務崩潰。

儘管每個 Logto 服務至少有三個副本,所有副本因雲端控制台的幾乎每個請求都會發生錯誤而輕易崩潰。自動恢復機制需要一些時間來生效,導致服務在一段時間內無法使用。

這就是為什麼使用者看到 502 Bad Gateway 錯誤的原因(所有副本崩潰)。一旦雲端服務恢復,上新的及重試的雲端控制台請求進來,崩潰循環繼續。

當雲端服務中斷時,它也影響驗證服務的某些端點,主要是 /api/.well-known/sign-in-exp。這個端點用於獲取包含連接器信息的登錄體驗配置,需要從雲端服務獲取。

解決方案

  • 手動續期域名。

經驗教訓

  • 始終設置域名到期監控或長時間購買。
  • 注意時區差異可能導致事件響應延遲。
  • 確保監控涵蓋所有域名。
  • 在與可拋出模塊交互時需謹慎,確保能捕獲並妥善處理錯誤。

糾正和預防措施

  • ✅ 添加每月域名到期的監控,無論是否啟用自動續期。
  • ✅ 添加對 logto.app 的監控。
  • ✅ 更新雲端服務的錯誤處理邏輯,妥善捕獲和處理代理錯誤。
  • ✅ 實施更強的警報機制,以在有全時區覆蓋的 SRE 團隊出現之前喚醒團隊面對事故。