Create a Pub/Sub topic

Check my progress

/ 10

Deploy the Lab Report Service: Build

Check my progress

/ 15

Create a Revision for Cloud Run

Check my progress

/ 15

Deploy the Email Service: Build

Check my progress

/ 15

Create a new Revision

Check my progress

/ 15

Create a service account

Check my progress

/ 10

Create a Pub/Sub subscription

Check my progress

/ 10

Deploy the SMS Service

Check my progress

/ 10

This lab may incorporate AI tools to support your learning.

GSP650

Google Cloud 自學實驗室 Pet Theory 標誌

總覽

在「無伺服器 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 控制台

  1. 按一下「Start Lab」按鈕。如果實驗室會產生費用,請在開啟的對話方塊中選取付款方式。右側的「Lab setup and access」面板會顯示下列項目:

    • 「Open Google Cloud console」按鈕
    • 此實驗室所需的臨時憑證 (使用者名稱和密碼)
    • 完成此實驗室所需的其他資訊 (如有)

    請注意,實驗室計時器位於頁面頂端附近,會顯示剩餘時間。

  2. 按一下「Open Google Cloud console」。如果使用 Chrome 瀏覽器,也可以按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」

    接著,實驗室會啟動相關資源,並開啟另一個分頁,顯示「登入」頁面。

    提示:您可以在不同的視窗並排開啟分頁。

    注意:頁面顯示「選擇帳戶」對話方塊時,請點選「使用其他帳戶」
  3. 如有必要,請將下方的 Username 貼到「登入」對話方塊。

    {{{user_0.username | "Username"}}}

    您也可以在「Lab setup and access」面板找到「Username」。

  4. 點選「下一步」

  5. 複製下方的 Password,並貼到「歡迎使用」對話方塊。

    {{{user_0.password | "Password"}}}

    您也可以在「Lab setup and access」面板找到「Password」。

  6. 點選「下一步」

    重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。 注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
  7. 繼續點按後續頁面:

    • 接受條款及細則。
    • 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
    • 請勿申請免費試用。

Google Cloud 控制台稍後會在這個分頁開啟。

注意:如要使用 Google Cloud 產品和服務,請按一下「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。「導覽選單」圖示和搜尋欄位

啟動 Cloud Shell

Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。

  1. 點按 Google Cloud 控制台頂端的「啟用 Cloud Shell」圖示 「啟動 Cloud Shell」圖示

  2. 系統顯示視窗時,請按照下列步驟操作:

    • 繼續操作 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 鍵自動完成功能。

  1. (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
  1. 點按「授權」

輸出內容:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (選用) 您可以使用下列指令來列出專案 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 的系統架構圖

看過目前的一般流程後,小茹認為可以設計一套系統,協助 Pet Theory 完成以下工作:

  1. 接收 HTTP POST 要求,並向醫療檢驗公司確認已收到結果。
  2. 用電子郵件將檢測結果寄給顧客。
  3. 透過簡訊和電子郵件將檢測結果傳送給顧客。

小茹的設計會將上述各項活動都分開處理,需要的項目如下:

  • 負責處理醫療檢測結果相關要求與回應的服務
  • 透過電子郵件將檢測結果傳送給顧客的服務
  • 傳送簡訊給顧客的服務
  • 用於服務間通訊的 Pub/Sub
  • 用於建立應用程式架構的無伺服器基礎架構

小茹打算採用單一用途函式,開發較容易編寫且錯誤較少的程式碼。

小茹

軟體顧問小茹

阿克,你好:

莉莉想要我建構一個原型來協助處理病歷。

你可以先幫我設定名為 new-lab-report 的 Pub/Sub 主題嗎?

小茹

阿克

IT 管理員阿克

小茹,你好:

這個專案聽起來很不錯。我今天早上就能處理好,在 Google Cloud 上設定這些項目很快。

阿克

建立 Pub/Sub 主題

請幫阿克建立名為 new-lab-report 的 Pub/Sub 主題。

架構圖上特別標出 Cloud Pub/Sub

服務發布 Pub/Sub 訊息時,須為該訊息標示主題。接下來要建立的服務會接收檢驗報告,然後為每份報告發布訊息。

首先,您需要建立可在本工作中使用的主題。

  1. 執行下列指令,建立 Pub/Sub 主題:
gcloud pubsub topics create new-lab-report

任何訂閱「new-lab-report」主題的服務,都能接收檢驗報告服務發布的訊息。上圖顯示有兩個服務會接收這類訊息,即電子郵件服務和簡訊服務。

  1. 接著啟用 Cloud Run,讓這項服務在雲端執行程式碼:
gcloud services enable run.googleapis.com

點選「Check my progress」,確認目標已達成。

建立 Pub/Sub 主題

別忘了告訴小茹,Pub/Sub 主題已經準備好了!

阿克

IT 管理員阿克

小茹,你好:

主題設定好了。

如果方便的話,我想瞭解這個原型的建構方式。我可以參與這項工作嗎?

阿克

小茹

軟體顧問小茹

阿克,你好:

太好了!感謝你這麼快就處理好。我會安排時間,到時候我們就開始打造這個原型。

小茹

工作 2:建構檢驗報告服務

請協助小茹設定新的檢驗報告服務。

架構圖上特別標出檢驗報告服務

這個服務主要用來製作原型,因此只有兩項功能:

  1. 接收含有報告資料的檢驗報告 HTTPS POST 要求。
  2. 在 Pub/Sub 上發布訊息。

新增檢驗報告服務的程式碼

  1. 返回 Cloud Shell,複製本實驗室所需的存放區:
git clone https://github.com/rosera/pet-theory.git
  1. 前往 lab-service 目錄:
cd pet-theory/lab05/lab-service
  1. 安裝下列套件,之後接收傳入的 HTTPS 要求和發布訊息至 Pub/Sub 時會用到:
npm install express npm install body-parser npm install @google-cloud/pubsub

這些指令會更新 package.json 檔案,指出這項服務需要的依附元件。

接下來要編輯 package.json 檔案,讓 Cloud Run 知道如何啟動程式碼。

  1. 開啟 package.json 檔案。

  2. 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",

否則,部署時會發生錯誤。
  1. 建立名為 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 訊息並發布
  1. 接著建立 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

  1. 建立名為 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
  1. 在 Cloud Shell 執行以下指令,將這個檔案設為可執行:
chmod u+x deploy.sh
  1. 可以部署檢驗報告服務了!請執行部署指令碼:
./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。

  1. 首先,將報告服務網址存入環境變數,方便後續操作。
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)")
  1. 確認已擷取 LAB_REPORT_SERVICE_URL:
echo $LAB_REPORT_SERVICE_URL
  1. 建立名為 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 發布至檢驗報告服務網址。每個指令都會分別在背景中執行。

  1. post-reports.sh 指令碼設為可執行:
chmod u+x post-reports.sh
  1. 接著使用上述指令碼,將三個檢驗報告 ID 發布至檢驗報告服務端點,以便測試服務:
./post-reports.sh

這個指令碼已將三份檢驗報告發布至檢驗報告服務。請查看記錄,確認結果!

  1. 在 Cloud 控制台,依序點選「導覽選單」圖示 「導覽選單」圖示 >「Cloud Run」。

  2. 現在您應該會在「服務」清單中,看到新部署的 lab-report-service。請點選該服務。

  3. 下一頁會顯示 lab-report-service 的詳細資料。請點選「記錄」分頁標籤。

「記錄」頁面會顯示剛才透過指令碼發布的三份測試報告結果。如果一切正常,傳回的 HTTP 狀態碼就會是 204,表示沒問題 (無內容),如下所示。如果沒看到任何項目,請試著使用右側的捲軸上下捲動畫面,讓系統重新載入記錄。

下個工作是編寫簡訊服務和電子郵件服務。檢驗報告服務在「new-lab-report」主題上發布 Pub/Sub 訊息時,就會觸發這些服務。

工作 3:電子郵件服務

請協助小茹設定新的電子郵件服務。

架構圖上特別標出電子郵件服務

新增電子郵件服務的程式碼

  1. 前往電子郵件服務目錄:
cd ~/pet-theory/lab05/email-service
  1. 安裝以下套件,讓程式碼能處理收到的 HTTPS 要求:
npm install express npm install body-parser

以上指令會更新 package.json 檔案 (其中提供應用程式及其依附元件的說明)。Cloud Run 必須知道如何執行程式碼,因此請加入 start 指令,指定執行方式。

  1. 開啟 package.json 檔案。

  2. 在「scripts」部分加入 "start": "node index.js", 這行程式碼 (如下所示),然後儲存檔案:

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, 注意:加入程式碼時,請務必完整複製以下內容,包括結尾的逗號:

"start": "node index.js",

否則,部署時會發生錯誤。
  1. 建立名為 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() 函式中加入程式碼,實際傳送電子郵件。

  1. 接著建立 Dockerfile 檔案,並加入以下程式碼:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

這個檔案定義要如何將 Cloud Run 服務封裝至容器。

部署電子郵件服務

  1. 建立名為 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
  1. deploy.sh 設為可執行:
chmod u+x deploy.sh
  1. 部署電子郵件服務:
./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 訊息時,就應觸發電子郵件服務。為完成這項工作,請設定服務帳戶,自動處理這項服務的相關要求。

架構圖上特別標出從 Cloud Pub/Sub 到電子郵件服務的流程

  1. 建立新的服務帳戶,用於觸發回應 Pub/Sub 訊息的服務:
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"

點選「Check my progress」,確認目標已達成。

建立服務帳戶
  1. 為新服務帳戶授予叫用電子郵件服務的權限:
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」訊息發布時叫用簡訊服務。

  1. 將專案編號存入環境變數,以便存取:
PROJECT_NUMBER=$(gcloud projects list --filter="qwiklabs-gcp" --format='value(PROJECT_NUMBER)')

接下來,請為專案授予建立 Pub/Sub 驗證權杖的權限。

  1. 執行以下程式碼:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com --role=roles/iam.serviceAccountTokenCreator
  1. 將電子郵件服務的網址存入另一個環境變數中:
EMAIL_SERVICE_URL=$(gcloud run services describe email-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. 確認已擷取 EMAIL_SERVICE_URL:
echo $EMAIL_SERVICE_URL
  1. 為電子郵件服務建立 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 訂閱項目

一起測試檢驗報告服務和電子郵件服務

  1. 使用先前建立的指令碼,再次發布檢驗報告:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. 接著開啟記錄 (依序點選「導覽選單」圖示 >「Cloud Run」)。您會在帳戶中看到 email-servicelab-report-service 這兩項 Cloud Run 服務。

  2. 依序點選「email-service」和「記錄」
    您會看到 Pub/Sub 觸發這項服務後的結果。如果沒有看到該出現的訊息,可能需要使用捲軸上下捲動畫面,藉此重新整理記錄。

太棒了!現在只要電子郵件服務處理 Cloud Pub/Sub 主題佇列中的訊息,就能將資訊寫入記錄!最後一項工作是編寫簡訊服務。

工作 4:簡訊服務

請協助小茹設定新的簡訊服務。

架構圖上特別標出簡訊服務

新增簡訊服務的程式碼

  1. 建立簡訊服務目錄:
cd ~/pet-theory/lab05/sms-service
  1. 安裝接收傳入 HTTPS 要求所需的套件:
npm install express npm install body-parser
  1. 開啟 package.json 檔案。

  2. 在「scripts」部分加入 "start": "node index.js", 這行程式碼 (如下所示),然後儲存檔案:

... "scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, ... 注意:加入程式碼時,請務必完整複製以下內容,包括結尾的逗號:

"start": "node index.js",

否則,部署時會發生錯誤。
  1. 建立名為 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'); }
  1. 接著建立 Dockerfile 檔案,並加入以下程式碼:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

這個檔案定義要如何將 Cloud Run 服務封裝至容器。程式碼建立完畢後,接下來就要部署服務。

部署簡訊服務

  1. 建立名為 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
  1. deploy.sh 設為可執行:
chmod u+x deploy.sh
  1. 部署簡訊服務:
./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 與簡訊服務之間也需要設定連結,才能接收訊息。

架構圖上特別標出從 Cloud Pub/Sub 到簡訊服務的流程

  1. 設定權限,讓 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」訊息發布時叫用簡訊服務。

  1. 第一步是將簡訊服務的網址存入環境變數:
SMS_SERVICE_URL=$(gcloud run services describe sms-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. 確認已擷取 SMS_SERVICE_URL:

    echo $SMS_SERVICE_URL
  2. 接著建立 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
  1. 再次執行測試指令碼,將三份檢驗報告發布至檢驗報告服務:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. 接著開啟記錄 (依序點選「導覽選單」圖示 >「Cloud Run」)。您會在帳戶中看到 email-service、lab-report-service 和 sms-service 這三項 Cloud Run 服務。

  2. 依序點選「sms-service」和「記錄」。您會看到 Pub/Sub 觸發這項服務後的結果。

原型系統已建立並測試成功。不過,阿克擔心在初步驗證過程中,還沒有測試系統韌性。

工作 5:測試系統韌性

如果其中一個服務中斷,會有什麼影響?阿克之前遇過這種情況,這類問題很常見。

請協助小茹瞭解如何確保系統能因應這種情況。她想要部署有問題的電子郵件服務版本,測試服務故障時會有什麼結果。

  1. 返回 email-service 目錄:
cd ~/pet-theory/lab05/email-service

請在電子郵件服務應用程式中加入一些無效文字來引發錯誤。

  1. 編輯 index.js,並在 sendEmail() 函式中加入 throw 這行內容,如下所示。系統會擲回例外狀況,模擬電子郵件伺服器停止運作。
... function sendEmail() { throw 'Email server is down'; console.log('Sending email'); } ...

加入這段程式碼後,只要叫用服務,就會造成服務當機。

  1. 部署這個有問題的電子郵件服務版本:
./deploy.sh
  1. 電子郵件服務部署作業順利完成後,請再次將資料發布至檢驗報告服務,接著仔細觀察 email-service 的記錄狀態。
~/pet-theory/lab05/lab-service/post-reports.sh
  1. 開啟電子郵件服務記錄,查看有問題版本的記錄:依序點選「導覽選單」圖示 >「Cloud Run」

  2. 在帳戶中看到三項 Cloud Run 服務後,請點選「email-service」

系統正在叫用電子郵件服務,但該服務會不斷當機。如果您稍微往回捲動記錄畫面,會發現根本原因是「Email server is down」(即伺服器停止運作)。您也可以看到服務傳回狀態碼 500,以及 Pub/Sub 持續重新呼叫服務。

如果查看簡訊服務的記錄,您會發現該服務運作正常。

接下來,請修正電子郵件服務的錯誤,讓應用程式恢復正常!

  1. 開啟 index.js 檔案,並移除先前輸入的那行 throw 程式碼,然後儲存檔案。

index.js sendEmail 函式內容現在應大致如下:

function sendEmail() { console.log('Sending email'); }
  1. 部署修正後的電子郵件服務版本:
./deploy.sh
  1. 部署完成後,請點選右上角的「重新整理」圖示。

您會發現報告 12、34 和 56 的電子郵件終於成功送出,電子郵件服務傳回狀態碼 204,而 Pub/Sub 也停止叫用該服務。沒有任何資料遺失,因為 Pub/Sub 會持續重試,直到成功為止。這就是穩健系統的基礎!

重點摘要

  1. 如果服務是透過 Pub/Sub 以非同步方式相互通訊,而非直接呼叫彼此,系統就會較有韌性。
  2. 由於使用 Pub/Sub,檢驗報告服務的觸發機制不會受到其他服務影響。舉例來說,如果顧客也想透過其他訊息服務接收檢驗結果,可以直接新增該服務,不必更新檢驗報告服務。
  3. Cloud Pub/Sub 會負責重試,服務不必處理這項工作,只需要傳回成功或失敗的狀態碼即可。
  4. 有了 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 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。

Before you begin

  1. Labs create a Google Cloud project and resources for a fixed time
  2. Labs have a time limit and no pause feature. If you end the lab, you'll have to restart from the beginning.
  3. On the top left of your screen, click Start lab to begin

Use private browsing

  1. Copy the provided Username and Password for the lab
  2. Click Open console in private mode

Sign in to the Console

  1. Sign in using your lab credentials. Using other credentials might cause errors or incur charges.
  2. Accept the terms, and skip the recovery resource page
  3. Don't click End lab unless you've finished the lab or want to restart it, as it will clear your work and remove the project

This content is not currently available

We will notify you via email when it becomes available

Great!

We will contact you via email if it becomes available

One lab at a time

Confirm to end all existing labs and start this one

Use private browsing to run the lab

Using an Incognito or private browser window is the best way to run this lab. This prevents any conflicts between your personal account and the Student account, which may cause extra charges incurred to your personal account.