GSP650
總覽
在「無伺服器 Cloud Run 開發作業」課程的實驗室中,您要支援一家虛構企業,並輔助其中的人物執行無伺服器遷移計畫。
莉莉在 12 年前創立了連鎖獸醫診所 Pet Theory。過去幾年來,診所越開越多,自動化的需求也隨之增加。Pet Theory 在處理檢驗公司傳回的醫療檢測結果時,不僅速度太慢,也很容易出錯,莉莉想要改善這種情況。
目前 Pet Theory 的 IT 管理員阿克是以人工方式處理檢測結果。每當收到檢測結果,他會先撰寫電子郵件,寄給寵物接受檢測的顧客,再用手機輸入簡訊,將結果傳送給對方。
阿克與軟體顧問小茹合作,目標是設計出更具擴充彈性的系統。他們想要打造不需要花太多心力持續維護的解決方案,因此決定採用無伺服器技術。
目標
本實驗室的學習內容包括:
- 建立 Pub/Sub 主題和訂閱項目。
- 建立 Cloud Run 服務,用於發布及接收訊息。
- 建立可觸發 Cloud Run 服務的 Pub/Sub 訂閱項目。
- 測試系統韌性。
先備知識
本實驗室假設您已熟悉 Cloud 控制台和殼層環境。這是系列內容的一部分,先完成前面的實驗室可能會有所幫助,但沒有也無妨:
設定和需求
注意:請以 Username 1 身分登入 Google Cloud 控制台,以便完成本實驗室工作。否則,操作過程中會發生錯誤。
瞭解以下事項後,再點選「Start Lab」按鈕
請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。
您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。
為了順利完成這個實驗室,請先確認:
- 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
- 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。
如何開始實驗室及登入 Google Cloud 控制台
-
按一下「Start Lab」按鈕。如果實驗室會產生費用,請在開啟的對話方塊中選取付款方式。右側的「Lab setup and access」面板會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 此實驗室所需的臨時憑證 (使用者名稱和密碼)
- 完成此實驗室所需的其他資訊 (如有)
請注意,實驗室計時器位於頁面頂端附近,會顯示剩餘時間。
-
按一下「Open Google Cloud console」。如果使用 Chrome 瀏覽器,也可以按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」。
接著,實驗室會啟動相關資源,並開啟另一個分頁,顯示「登入」頁面。
提示:您可以在不同的視窗並排開啟分頁。
注意:頁面顯示「選擇帳戶」對話方塊時,請點選「使用其他帳戶」。
-
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}}
您也可以在「Lab setup and access」面板找到「Username」。
-
點選「下一步」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}}
您也可以在「Lab setup and access」面板找到「Password」。
-
點選「下一步」。
重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。
注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
-
繼續點按後續頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
Google Cloud 控制台稍後會在這個分頁開啟。
注意:如要使用 Google Cloud 產品和服務,請按一下「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。
啟動 Cloud Shell
Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
-
點按 Google Cloud 控制台頂端的「啟用 Cloud Shell」圖示
。
-
系統顯示視窗時,請按照下列步驟操作:
- 繼續操作 Cloud Shell 視窗。
- 授權 Cloud Shell 使用您的憑證發出 Google Cloud API 呼叫。
連線建立完成即代表已通過驗證,而且專案已設為您的 Project_ID:。輸出內容中有一行文字,宣告本工作階段的 Project_ID:
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud 是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。
- (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
- 點按「授權」。
輸出內容:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (選用) 您可以使用下列指令來列出專案 ID:
gcloud config list project
輸出內容:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需 gcloud 的完整說明,請前往 Google Cloud 參閱 gcloud CLI 總覽指南。
設定區域和可用區
某些 Compute Engine 資源位於區域和可用區。「區域」是您可以執行資源的特定地理位置,每個區域中會有一或多個「可用區」。
請在 Cloud Shell 執行下列 gcloud 指令,設定實驗室的預設區域和可用區:
gcloud config set compute/zone "{{{project_0.default_zone|ZONE}}}"
export ZONE=$(gcloud config get compute/zone)
gcloud config set compute/region "{{{project_0.default_region|REGION}}}"
export REGION=$(gcloud config get compute/region)
情境
Pet Theory 希望能自動將檢測結果分享給顧客。預約量持續增加,他們實在難以負荷,因此莉莉決定請小茹幫忙...
|

Pet Theory 創辦人莉莉
|
小茹,你好:
謝謝你之前幫忙處理保險公司入口網站。
關於醫療檢測結果的處理,不知道有沒有更好的做法?我們需要用更有效率的方式將結果傳送給顧客。
莉莉
|
|

軟體顧問小茹
|
莉莉,你好:
沒問題,我來試試看。目前有幾個點子,或許能改善這種情況。
小茹
|
工作 1:架構
Pet Theory 委託外部公司進行醫療檢測,檢驗公司完成檢測後,就會將結果回傳給 Pet Theory。
檢驗公司透過 HTTP(s) POST,將醫療檢驗結果傳送到 Pet Theory 的網路端點。下圖簡單呈現整體架構。

看過目前的一般流程後,小茹認為可以設計一套系統,協助 Pet Theory 完成以下工作:
- 接收 HTTP POST 要求,並向醫療檢驗公司確認已收到結果。
- 用電子郵件將檢測結果寄給顧客。
- 透過簡訊和電子郵件將檢測結果傳送給顧客。
小茹的設計會將上述各項活動都分開處理,需要的項目如下:
- 負責處理醫療檢測結果相關要求與回應的服務
- 透過電子郵件將檢測結果傳送給顧客的服務
- 傳送簡訊給顧客的服務
- 用於服務間通訊的 Pub/Sub
- 用於建立應用程式架構的無伺服器基礎架構
小茹打算採用單一用途函式,開發較容易編寫且錯誤較少的程式碼。
|

軟體顧問小茹
|
阿克,你好:
莉莉想要我建構一個原型來協助處理病歷。
你可以先幫我設定名為 new-lab-report 的 Pub/Sub 主題嗎?
小茹
|
|

IT 管理員阿克
|
小茹,你好:
這個專案聽起來很不錯。我今天早上就能處理好,在 Google Cloud 上設定這些項目很快。
阿克
|
建立 Pub/Sub 主題
請幫阿克建立名為 new-lab-report 的 Pub/Sub 主題。

服務發布 Pub/Sub 訊息時,須為該訊息標示主題。接下來要建立的服務會接收檢驗報告,然後為每份報告發布訊息。
首先,您需要建立可在本工作中使用的主題。
- 執行下列指令,建立 Pub/Sub 主題:
gcloud pubsub topics create new-lab-report
任何訂閱「new-lab-report」主題的服務,都能接收檢驗報告服務發布的訊息。上圖顯示有兩個服務會接收這類訊息,即電子郵件服務和簡訊服務。
- 接著啟用 Cloud Run,讓這項服務在雲端執行程式碼:
gcloud services enable run.googleapis.com
點選「Check my progress」,確認目標已達成。
建立 Pub/Sub 主題
別忘了告訴小茹,Pub/Sub 主題已經準備好了!
|

IT 管理員阿克
|
小茹,你好:
主題設定好了。
如果方便的話,我想瞭解這個原型的建構方式。我可以參與這項工作嗎?
阿克
|
|

軟體顧問小茹
|
阿克,你好:
太好了!感謝你這麼快就處理好。我會安排時間,到時候我們就開始打造這個原型。
小茹
|
工作 2:建構檢驗報告服務
請協助小茹設定新的檢驗報告服務。

這個服務主要用來製作原型,因此只有兩項功能:
- 接收含有報告資料的檢驗報告 HTTPS POST 要求。
- 在 Pub/Sub 上發布訊息。
新增檢驗報告服務的程式碼
- 返回 Cloud Shell,複製本實驗室所需的存放區:
git clone https://github.com/rosera/pet-theory.git
- 前往
lab-service 目錄:
cd pet-theory/lab05/lab-service
- 安裝下列套件,之後接收傳入的 HTTPS 要求和發布訊息至 Pub/Sub 時會用到:
npm install express
npm install body-parser
npm install @google-cloud/pubsub
這些指令會更新 package.json 檔案,指出這項服務需要的依附元件。
接下來要編輯 package.json 檔案,讓 Cloud Run 知道如何啟動程式碼。
-
開啟 package.json 檔案。
-
在 package.json 檔案的「scripts」部分,於第 7 行加入 "start": "node index.js", 這行程式碼 (如下所示),接著儲存檔案:
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
注意:加入程式碼時,請務必完整複製以下內容,包括結尾的逗號:
"start": "node index.js",
否則,部署時會發生錯誤。
- 建立名為
index.js 的新檔案,然後加入以下程式碼:
const {PubSub} = require('@google-cloud/pubsub');
const pubsub = new PubSub();
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.json());
const port = process.env.PORT || 8080;
app.listen(port, () => {
console.log('Listening on port', port);
});
app.post('/', async (req, res) => {
try {
const labReport = req.body;
await publishPubSubMessage(labReport);
res.status(204).send();
}
catch (ex) {
console.log(ex);
res.status(500).send(ex);
}
})
async function publishPubSubMessage(labReport) {
const buffer = Buffer.from(JSON.stringify(labReport));
await pubsub.topic('new-lab-report').publish(buffer);
}
以下這兩行程式碼負責服務的主要工作:
const labReport = req.body;
await publishPubSubMessage(labReport);
具體來說,這兩行的用途是:
- 從 POST 要求中擷取檢驗報告。
- 將剛傳入的檢驗報告加入 PubSub 訊息並發布
- 接著建立
Dockerfile 檔案,並加入以下程式碼:
FROM node:18
WORKDIR /usr/src/app
COPY package.json package*.json ./
RUN npm install --only=production
COPY . .
CMD [ "npm", "start" ]
這個檔案定義要如何將 Cloud Run 服務封裝至容器。
部署 lab-report-service
- 建立名為
deploy.sh 的檔案,然後將以下指令貼到檔案中:
gcloud builds submit \
--tag gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service
gcloud run deploy lab-report-service \
--image gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service \
--platform managed \
--region {{{project_0.default_region | "REGION"}}} \
--allow-unauthenticated \
--max-instances=1
- 在 Cloud Shell 執行以下指令,將這個檔案設為可執行:
chmod u+x deploy.sh
- 可以部署檢驗報告服務了!請執行部署指令碼:
./deploy.sh
部署過程中或許會有時間差的問題,因此第一次執行這個指令時可能會發生錯誤。在這種情況下,只要重新執行 deploy.sh 即可。
部署作業順利完成後,畫面上會顯示類似以下內容的訊息:
Service [lab-report-service] revision [lab-report-service-00001] has been deployed and is serving traffic at https://lab-report-service-[hash].a.run.app
做得好!檢驗報告服務已完成部署,接下來會透過 HTTP 接收醫療檢驗結果。現在您可以測試新服務是否正常運作。
點選「Check my progress」,確認目標已達成。
部署檢驗報告服務:建構
點選「Check my progress」,確認目標已達成。
部署檢驗報告服務:建立修訂版本
測試檢驗報告服務
為了驗證檢驗報告服務,請模擬檢驗公司發出的三個 HTTPS POST 要求,各含有一份檢驗報告。這只是測試,因此建立的檢驗報告中都只有一個 ID。
- 首先,將報告服務網址存入環境變數,方便後續操作。
export LAB_REPORT_SERVICE_URL=$(gcloud run services describe lab-report-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
- 確認已擷取 LAB_REPORT_SERVICE_URL:
echo $LAB_REPORT_SERVICE_URL
- 建立名為
post-reports.sh 的新檔案,然後加入以下程式碼:
curl -X POST \
-H "Content-Type: application/json" \
-d "{\"id\": 12}" \
$LAB_REPORT_SERVICE_URL &
curl -X POST \
-H "Content-Type: application/json" \
-d "{\"id\": 34}" \
$LAB_REPORT_SERVICE_URL &
curl -X POST \
-H "Content-Type: application/json" \
-d "{\"id\": 56}" \
$LAB_REPORT_SERVICE_URL &
以上指令碼會使用 curl 指令,將三個不同的 ID 發布至檢驗報告服務網址。每個指令都會分別在背景中執行。
- 將
post-reports.sh 指令碼設為可執行:
chmod u+x post-reports.sh
- 接著使用上述指令碼,將三個檢驗報告 ID 發布至檢驗報告服務端點,以便測試服務:
./post-reports.sh
這個指令碼已將三份檢驗報告發布至檢驗報告服務。請查看記錄,確認結果!
-
在 Cloud 控制台,依序點選「導覽選單」圖示
>「Cloud Run」。
-
現在您應該會在「服務」清單中,看到新部署的 lab-report-service。請點選該服務。
-
下一頁會顯示 lab-report-service 的詳細資料。請點選「記錄」分頁標籤。
「記錄」頁面會顯示剛才透過指令碼發布的三份測試報告結果。如果一切正常,傳回的 HTTP 狀態碼就會是 204,表示沒問題 (無內容),如下所示。如果沒看到任何項目,請試著使用右側的捲軸上下捲動畫面,讓系統重新載入記錄。
下個工作是編寫簡訊服務和電子郵件服務。檢驗報告服務在「new-lab-report」主題上發布 Pub/Sub 訊息時,就會觸發這些服務。
工作 3:電子郵件服務
請協助小茹設定新的電子郵件服務。

新增電子郵件服務的程式碼
- 前往電子郵件服務目錄:
cd ~/pet-theory/lab05/email-service
- 安裝以下套件,讓程式碼能處理收到的 HTTPS 要求:
npm install express
npm install body-parser
以上指令會更新 package.json 檔案 (其中提供應用程式及其依附元件的說明)。Cloud Run 必須知道如何執行程式碼,因此請加入 start 指令,指定執行方式。
-
開啟 package.json 檔案。
-
在「scripts」部分加入 "start": "node index.js", 這行程式碼 (如下所示),然後儲存檔案:
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
注意:加入程式碼時,請務必完整複製以下內容,包括結尾的逗號:
"start": "node index.js",
否則,部署時會發生錯誤。
- 建立名為
index.js 的新檔案,然後加入以下程式碼:
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.json());
const port = process.env.PORT || 8080;
app.listen(port, () => {
console.log('Listening on port', port);
});
app.post('/', async (req, res) => {
const labReport = decodeBase64Json(req.body.message.data);
try {
console.log(`Email Service: Report ${labReport.id} trying...`);
sendEmail();
console.log(`Email Service: Report ${labReport.id} success :-)`);
res.status(204).send();
}
catch (ex) {
console.log(`Email Service: Report ${labReport.id} failure: ${ex}`);
res.status(500).send();
}
})
function decodeBase64Json(data) {
return JSON.parse(Buffer.from(data, 'base64').toString());
}
function sendEmail() {
console.log('Sending email');
}
系統會在 Pub/Sub 將訊息發布到服務時執行此程式碼。這段程式碼的運作方式如下:
- 將 Pub/Sub 訊息解碼,接著嘗試呼叫
sendEmail() 函式。
- 如果呼叫成功且未擲回例外狀況,就會傳回狀態碼 204,讓 Pub/Sub 知道訊息已處理完畢。
- 如果擲回例外狀況,服務將傳回狀態碼 500,讓 Pub/Sub 知道訊息未處理,稍後應將訊息重新發布至服務。
如果服務之間可以正常通訊,小茹就會在 sendEmail() 函式中加入程式碼,實際傳送電子郵件。
- 接著建立
Dockerfile 檔案,並加入以下程式碼:
FROM node:18
WORKDIR /usr/src/app
COPY package.json package*.json ./
RUN npm install --only=production
COPY . .
CMD [ "npm", "start" ]
這個檔案定義要如何將 Cloud Run 服務封裝至容器。
部署電子郵件服務
- 建立名為
deploy.sh 的新檔案,然後加入以下內容:
gcloud builds submit \
--tag gcr.io/$GOOGLE_CLOUD_PROJECT/email-service
gcloud run deploy email-service \
--image gcr.io/$GOOGLE_CLOUD_PROJECT/email-service \
--platform managed \
--region {{{project_0.default_region | "REGION"}}} \
--no-allow-unauthenticated \
--max-instances=1
- 將
deploy.sh 設為可執行:
chmod u+x deploy.sh
- 部署電子郵件服務:
./deploy.sh
部署完成後,您會看到類似以下內容的訊息:
Service [email-service] revision [email-service-00001] has been deployed and is serving traffic at https://email-service-[hash].a.run.app
服務已部署成功。接下來須確保系統會在有 Pub/Sub 訊息時,觸發電子郵件服務。
點選「Check my progress」,確認目標已達成。
部署電子郵件服務:建構
點選「Check my progress」,確認目標已達成。
部署電子郵件服務:建立修訂版本
設定 Pub/Sub 來觸發電子郵件服務
每當透過「new-lab-report」主題發布新的 Pub/Sub 訊息時,就應觸發電子郵件服務。為完成這項工作,請設定服務帳戶,自動處理這項服務的相關要求。

- 建立新的服務帳戶,用於觸發回應 Pub/Sub 訊息的服務:
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"
點選「Check my progress」,確認目標已達成。
建立服務帳戶
- 為新服務帳戶授予叫用電子郵件服務的權限:
gcloud run services add-iam-policy-binding email-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed
接下來,請指示 Pub/Sub 在「new-lab-report」訊息發布時叫用簡訊服務。
- 將專案編號存入環境變數,以便存取:
PROJECT_NUMBER=$(gcloud projects list --filter="qwiklabs-gcp" --format='value(PROJECT_NUMBER)')
接下來,請為專案授予建立 Pub/Sub 驗證權杖的權限。
- 執行以下程式碼:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com --role=roles/iam.serviceAccountTokenCreator
- 將電子郵件服務的網址存入另一個環境變數中:
EMAIL_SERVICE_URL=$(gcloud run services describe email-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
- 確認已擷取 EMAIL_SERVICE_URL:
echo $EMAIL_SERVICE_URL
- 為電子郵件服務建立 Pub/Sub 訂閱項目。
gcloud pubsub subscriptions create email-service-sub --topic new-lab-report --push-endpoint=$EMAIL_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
做得好!現在服務已設定完畢,可以回應 Cloud Pub/Sub 訊息了。下一步是驗證程式碼是否符合要求。
點選「Check my progress」,確認目標已達成。
建立 Pub/Sub 訂閱項目
一起測試檢驗報告服務和電子郵件服務
- 使用先前建立的指令碼,再次發布檢驗報告:
~/pet-theory/lab05/lab-service/post-reports.sh
-
接著開啟記錄 (依序點選「導覽選單」圖示 >「Cloud Run」)。您會在帳戶中看到 email-service 和 lab-report-service 這兩項 Cloud Run 服務。
-
依序點選「email-service」和「記錄」。
您會看到 Pub/Sub 觸發這項服務後的結果。如果沒有看到該出現的訊息,可能需要使用捲軸上下捲動畫面,藉此重新整理記錄。
太棒了!現在只要電子郵件服務處理 Cloud Pub/Sub 主題佇列中的訊息,就能將資訊寫入記錄!最後一項工作是編寫簡訊服務。
工作 4:簡訊服務
請協助小茹設定新的簡訊服務。

新增簡訊服務的程式碼
- 建立簡訊服務目錄:
cd ~/pet-theory/lab05/sms-service
- 安裝接收傳入 HTTPS 要求所需的套件:
npm install express
npm install body-parser
-
開啟 package.json 檔案。
-
在「scripts」部分加入 "start": "node index.js", 這行程式碼 (如下所示),然後儲存檔案:
...
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
...
注意:加入程式碼時,請務必完整複製以下內容,包括結尾的逗號:
"start": "node index.js",
否則,部署時會發生錯誤。
- 建立名為
index.js 的新檔案,然後加入以下程式碼:
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.json());
const port = process.env.PORT || 8080;
app.listen(port, () => {
console.log('Listening on port', port);
});
app.post('/', async (req, res) => {
const labReport = decodeBase64Json(req.body.message.data);
try {
console.log(`SMS Service: Report ${labReport.id} trying...`);
sendSms();
console.log(`SMS Service: Report ${labReport.id} success :-)`);
res.status(204).send();
}
catch (ex) {
console.log(`SMS Service: Report ${labReport.id} failure: ${ex}`);
res.status(500).send();
}
})
function decodeBase64Json(data) {
return JSON.parse(Buffer.from(data, 'base64').toString());
}
function sendSms() {
console.log('Sending SMS');
}
- 接著建立
Dockerfile 檔案,並加入以下程式碼:
FROM node:18
WORKDIR /usr/src/app
COPY package.json package*.json ./
RUN npm install --only=production
COPY . .
CMD [ "npm", "start" ]
這個檔案定義要如何將 Cloud Run 服務封裝至容器。程式碼建立完畢後,接下來就要部署服務。
部署簡訊服務
- 建立名為
deploy.sh 的檔案,然後加入以下程式碼:
gcloud builds submit \
--tag gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service
gcloud run deploy sms-service \
--image gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service \
--platform managed \
--region {{{project_0.default_region | "REGION"}}} \
--no-allow-unauthenticated \
--max-instances=1
- 將
deploy.sh 設為可執行:
chmod u+x deploy.sh
- 部署簡訊服務:
./deploy.sh
部署完成後,系統會顯示類似以下內容的訊息:
Service [sms-service] revision [sms-service-00001] has been deployed and is serving traffic at https://sms-service-[hash].a.run.app
簡訊服務已部署成功,但並未連結至 Cloud Pub/Sub 服務。請在下一節修正這個問題。
點選「Check my progress」,確認目標已達成。
部署簡訊服務
設定 Cloud Pub/Sub 來觸發簡訊服務
與電子郵件服務相同,Cloud Pub/Sub 與簡訊服務之間也需要設定連結,才能接收訊息。

- 設定權限,讓 Pub/Sub 能夠觸發簡訊服務:
gcloud run services add-iam-policy-binding sms-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed
接下來,請指示 Pub/Sub 在「new-lab-report」訊息發布時叫用簡訊服務。
- 第一步是將簡訊服務的網址存入環境變數:
SMS_SERVICE_URL=$(gcloud run services describe sms-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
-
確認已擷取 SMS_SERVICE_URL:
echo $SMS_SERVICE_URL
-
接著建立 Pub/Sub 訂閱項目:
gcloud pubsub subscriptions create sms-service-sub --topic new-lab-report --push-endpoint=$SMS_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
- 再次執行測試指令碼,將三份檢驗報告發布至檢驗報告服務:
~/pet-theory/lab05/lab-service/post-reports.sh
-
接著開啟記錄 (依序點選「導覽選單」圖示 >「Cloud Run」)。您會在帳戶中看到 email-service、lab-report-service 和 sms-service 這三項 Cloud Run 服務。
-
依序點選「sms-service」和「記錄」。您會看到 Pub/Sub 觸發這項服務後的結果。
原型系統已建立並測試成功。不過,阿克擔心在初步驗證過程中,還沒有測試系統韌性。
工作 5:測試系統韌性
如果其中一個服務中斷,會有什麼影響?阿克之前遇過這種情況,這類問題很常見。
請協助小茹瞭解如何確保系統能因應這種情況。她想要部署有問題的電子郵件服務版本,測試服務故障時會有什麼結果。
- 返回
email-service 目錄:
cd ~/pet-theory/lab05/email-service
請在電子郵件服務應用程式中加入一些無效文字來引發錯誤。
- 編輯
index.js,並在 sendEmail() 函式中加入 throw 這行內容,如下所示。系統會擲回例外狀況,模擬電子郵件伺服器停止運作。
...
function sendEmail() {
throw 'Email server is down';
console.log('Sending email');
}
...
加入這段程式碼後,只要叫用服務,就會造成服務當機。
- 部署這個有問題的電子郵件服務版本:
./deploy.sh
- 電子郵件服務部署作業順利完成後,請再次將資料發布至檢驗報告服務,接著仔細觀察 email-service 的記錄狀態。
~/pet-theory/lab05/lab-service/post-reports.sh
-
開啟電子郵件服務記錄,查看有問題版本的記錄:依序點選「導覽選單」圖示 >「Cloud Run」。
-
在帳戶中看到三項 Cloud Run 服務後,請點選「email-service」。
系統正在叫用電子郵件服務,但該服務會不斷當機。如果您稍微往回捲動記錄畫面,會發現根本原因是「Email server is down」(即伺服器停止運作)。您也可以看到服務傳回狀態碼 500,以及 Pub/Sub 持續重新呼叫服務。
如果查看簡訊服務的記錄,您會發現該服務運作正常。
接下來,請修正電子郵件服務的錯誤,讓應用程式恢復正常!
- 開啟
index.js 檔案,並移除先前輸入的那行 throw 程式碼,然後儲存檔案。
index.js sendEmail 函式內容現在應大致如下:
function sendEmail() {
console.log('Sending email');
}
- 部署修正後的電子郵件服務版本:
./deploy.sh
- 部署完成後,請點選右上角的「重新整理」圖示。
您會發現報告 12、34 和 56 的電子郵件終於成功送出,電子郵件服務傳回狀態碼 204,而 Pub/Sub 也停止叫用該服務。沒有任何資料遺失,因為 Pub/Sub 會持續重試,直到成功為止。這就是穩健系統的基礎!
重點摘要
- 如果服務是透過 Pub/Sub 以非同步方式相互通訊,而非直接呼叫彼此,系統就會較有韌性。
- 由於使用 Pub/Sub,檢驗報告服務的觸發機制不會受到其他服務影響。舉例來說,如果顧客也想透過其他訊息服務接收檢驗結果,可以直接新增該服務,不必更新檢驗報告服務。
- Cloud Pub/Sub 會負責重試,服務不必處理這項工作,只需要傳回成功或失敗的狀態碼即可。
- 有了 Pub/Sub 的重試機制,如果某項服務停止運作,系統就能在該服務恢復上線後自動「復原」。
恭喜!
多虧您的協助,小茹成功建構了一套富有韌性的原型系統。服務可以自動將電子郵件和簡訊傳送給所有顧客。如有個別服務暫時無法運作,系統會啟用重試機制,因此不會有任何資料遺失。小茹也收到了應得的讚許...
|

Pet Theory 創辦人莉莉
|
小茹,你好:
這段時間辛苦了,也謝謝你帶領大家完成這項專案。
本公司的重要系統居然在短時間內就徹底完成改造。
我們想在星期五辦場小型聚會慶祝,誠摯邀請你前來參加,擔任我們的榮譽嘉賓!
莉莉
|
|
總經理美玲
|
小茹,你好:
Pet Theory 對你的工作表現讚譽有加。我們整個團隊都與有榮焉。
既然這項工作已經完成,我想跟你聊聊,看看你是否願意在新專案中擔任更高階的職務。
美玲
總經理
Computer Consulting Inc.
|
後續步驟/瞭解詳情
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2024 年 7 月 23 日
實驗室上次測試日期:2024 年 7 月 23 日
Copyright 2026 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。