Original source (on modern site)
旗下擁有61.5萬會員、負責管理1,240億澳幣(約820億美元)資金的澳洲退休基金Unisuper,於Google Cloud上的雲端基礎設施服務,因Google Cloud方面的錯誤操作,誤刪用戶的訂閱,導致用戶資料遭到刪除與服務中斷。用戶最後透過位於第3方雲端服務商的備份資料,才得以逐步恢復服務。 負責管理澳洲37所大學退休基金的Unisuper,於2023年6月將其IT基礎架構遷移到Google Cloud(含大約1,900臺虛擬機器、資料庫與應用程式),並採用跨2個服務區域相互複製的高可用架構,以防範服務中斷與資料遺失。 但今年5月2日時,由於Google Cloud內部無意的錯誤配置,導致Unisuper的整個訂閱遭到刪除,而當該用戶的訂閱遭到刪除後,該用戶位於2個服務區域的資料複本也都一同遭到刪除,無法發揮備援效果,服務也因此中斷。 在雙方於5月7日共同發表的聲明中,Google Cloud執行長Thomas Kurian親自表示,這次服務中斷是一系列前所未有的事件引起,是全球Google Cloud用戶未曾發生過、一次孤立的「獨一無二事件」,這次事故並非惡意行為或網路攻擊造成,而是Google Cloud內部設定錯誤,引發未知的軟體錯誤導致。 由於Unisuper先前沒有為其基礎設施採用外部的災難復原措施,所以無法迅速恢復服務。所幸Unisuper在另一雲端服務商處還保有備份,從而得以透過這些第3方的備份複本,逐步復原位於Google Cloud上的基礎設施,於事故發生一周後的5月9日,逐步恢復對會員的服務,截至5月13日,已恢復了會員登入的線上投資服務。 Google Cloud表示將採取措施,確保這種情況不再發生。Unisuper方面也聲明將全面檢討這次事件,確保盡可能減少未來發生服務中斷的風險。 `;
const widget = data?.bottomBarWebinar?.map((item) => {
item.url = getLink(item);
item.time = formatTime(item.duration);
return item;
});
widget?.forEach((item) => {
listElm += renderElm(item);
});
listElm += " ";
const rootElm = document.getElementById("itplusArticleBottom");
rootElm.innerHTML = listElm;
}
function setSignup(item) {
if (isSignupOpen(item) === true) {
return `立即報名`;
}
return "";
}
function isSignupOpen(item) {
const fromStr = item.registerStarted;
const toStr = item.registerFinished;
let isOpen = false;
if (
item.type == "webinar" &&
fromStr.length > 0 &&
toStr.length > 0
) {
const from = new Date(fromStr).getTime();
const to = new Date(toStr).getTime();
const current = Date.now();
if (current >= from && current <= to) {
isOpen = true;
}
}
return isOpen;
}
function getLink(item) {
let link = "";
switch (item.type) {
case "vod":
link = `${rootUrl}/vod-page/${item.id}${utmStr}`;
break;
case "replay":
case "webinar":
link = `${rootUrl}/webinar-page/${item.id}${utmStr}`;
break;
}
return link;
}
function formatTime(timeStr) {
const timeArr = timeStr.split(":");
const newTime = Number(timeArr[0]) * 60 + Number(timeArr[1]);
return newTime;
}
function getSuffix(item) {
let elm = "";
if (item.type == "webinar" && item.liveStatus == "直播中") {
elm += `直播中`;
} else if (item.webinarstarted.length > 0) {
elm += `${item.webinarstarted} `;
} else {
elm = "";
}
return elm;
}
function renderElm(item) {
const result = `