上個月末,南巴西地區的Microsoft Azure DevOps服務突然停止了約十個小時。事后,微軟首席軟件工程經理Eric Mattingly為此次故障向用戶道歉,并揭示了故障的原因:一個簡單的代碼拼寫錯誤導致17個生產數據庫被刪除。

Mattingly解釋說,Azure DevOps工程師偶爾需要對生產數據庫進行快照,以便調查客戶升級或評估潛在的性能改進。為了確保這些快照數據庫得到清理,每天都會運行一個超過特定期限便會將其刪除的后臺作業。

在最近一個敏捷開發的沖刺中,Azure DevOps工程師執行了一個代碼升級,用受支持的Azure.ResourceManager.* NuGet包替換已棄用的Microsoft.Azure.Managment.*包。這導致了一個大的拉取請求,交換了舊包中的API調用和新包中的API調用。拼寫錯誤就隱藏在這個拉取請求中,該錯誤將刪除Azure SQL數據庫的調用替換成刪除托管數據庫的Azure SQL Server的調用。由于錯誤的代碼只在特定條件下運行,因此沒能被現有測試覆蓋。

根據Mattingly的事件報告,在將Sprint 222部署到Ring 0(微軟的內部Azure DevOps 組織)時,由于其中不存在任何快照數據庫,所以沒有執行刪除作業。幾天后,軟件更改被部署到南巴西的客戶環境Ring 1。該環境中存在能夠觸發錯誤的快照數據庫,導致后臺作業刪除了整個Azure SQL Server和所有17個生產數據庫。自此不再能處理任何客戶流量,所幸數據并未丟失。

在此次事件后,微軟表示會采取一系列措施以避免未來發生類似的問題,例如確保所有快照數據庫創建在不同的Azure SQL Server上,以避免與生產數據庫沖突。