GSP1122

總覽
管理應用程式的建立、部署和持續更新作業,是雲端營運的核心。最主要的問題圍繞在下列目標上:執行資源最佳化,以達到服務水準協議要求、部署程式碼變更、流暢完成 VM 更新,以及妥善設置網路/負載平衡設定。AWS 會運用 CodeDeploy 管道達成目的。CodeDeploy 是一種部署作業群組,位於可自動調度資源、並設有 IAM/防火牆設定的 EC2 執行個體。服務角色對於應用程式的執行與通訊相當重要,而完整的基礎架構設定則必須涵蓋 NAT 閘道、負載平衡器、健康狀態檢查和複製策略。更新 VM 可能須透過觸發條件和 Lambda 函式,重新整理執行個體。
Google Cloud 也能提供同樣的靈活彈性。開機指令碼可擷取程式碼更新,有助於系統完成滾動式更新,且完全不必停機。雖然也可選擇 GKE 和 App Engine 等解決方案,但透過 Compute Engine,您可用更精細的方式控管 VM 和負載平衡器。本實驗室將說明如何透過 Compute Engine 部署「Fancy Store」電子商務應用程式及調度資源,展現這項網頁應用程式管理方法的強大之處。
目標
在本實驗室中,您將瞭解如何執行下列工作:
完成本實驗室的各項操作後,您將擁有位於代管執行個體群組中的執行個體,可為您的網站提供自動修復、負載平衡、自動調度資源及滾動式更新功能。
設定和需求
瞭解以下事項後,再點選「Start Lab」按鈕
請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。
您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。
為了順利完成這個實驗室,請先確認:
- 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
- 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。
如何開始研究室及登入 Google Cloud 控制台
-
點選「Start Lab」按鈕。如果實驗室會產生費用,畫面上會出現選擇付款方式的對話方塊。左側的「Lab Details」窗格會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 剩餘時間
- 必須在這個研究室中使用的臨時憑證
- 完成這個實驗室所需的其他資訊 (如有)
-
點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」。
接著,實驗室會啟動相關資源,並開啟另一個分頁,顯示「登入」頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」。
-
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}}
您也可以在「Lab Details」窗格找到 Username。
-
點選「下一步」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}}
您也可以在「Lab Details」窗格找到 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 總覽指南。
設定預設可用區
gcloud config set compute/zone {{{ project_0.default_zone | "ZONE" }}}
詳情請參閱區域和可用區說明文件。
注意:如果在自己的機器上執行 gcloud
,所有工作階段都會保留這些設定,但如果在 Cloud Shell 中,每次啟動新工作階段或重新連線時,都必須進行這項設定。
工作 1:啟用 Compute Engine API 和 Gemini Code Assist
接著,請啟用 Compute Engine API。
- 執行下列指令,啟用 Compute Engine API:
gcloud services enable compute.googleapis.com
在 Cloud Shell IDE 啟用 Gemini Code Assist
您可以在 Cloud Shell 等整合式開發環境 (IDE) 中使用 Gemini Code Assist,取得程式碼相關指引或解決程式碼問題。Gemini Code Assist 必須先啟用,才能開始使用。
- 在 Cloud Shell 執行下列指令,啟用 Gemini for Google Cloud API:
gcloud services enable cloudaicompanion.googleapis.com
- 點按 Cloud Shell 工具列中的「開啟編輯器」。
注意:如要開啟 Cloud Shell 編輯器,請點選 Cloud Shell 工具列中的「開啟編輯器」。如要在 Cloud Shell 與程式碼編輯器之間切換,請視需要點選「開啟編輯器」或「開啟終端機」。
-
在左側窗格中,點按「設定」圖示,然後在「設定」檢視畫面中搜尋「Gemini Code Assist」。
-
找到「Geminicodeassist: Enable」,確認已勾選核取方塊,然後關閉「設定」。
-
點選畫面底部狀態列中的「Cloud Code - No Project」。
-
依指示授權外掛程式。如果系統未自動選取專案,請點按「選取 Google Cloud 專案」,然後選擇 。
-
確認狀態列的 Cloud Code 狀態訊息中已顯示 Google Cloud 專案 ()。
工作 2:建立 Cloud Storage bucket
在這項工作中,您將設定 Cloud Storage bucket,儲存建構的程式碼及開機指令碼。
- 在 Cloud Shell 執行下列指令,建立新的 Cloud Storage bucket:
gsutil mb gs://fancy-store-{{{project_0.project_id | BUCKET}}}
點選「Check my progress」,確認目標已達成。
建立 Cloud Storage bucket
工作 3:複製來源存放區
在這項工作中,您將使用 monolith-to-microservices
存放區的現有 Fancy Store 電子商務網站,做為網站基礎。
請複製原始碼,以便專心將應用程式部署至 Compute Engine。在本實驗室的後續章節,您將稍微修改一下程式碼,看看在 Compute Engine 更新內容有多簡單。
- 執行下列指令複製原始碼,並前往
monolith-to-microservices
目錄:
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
- 執行程式碼的初始版本,讓應用程式可在本機執行:
./setup.sh
這項指令碼可能需要幾分鐘才能執行完畢。
- 完成後,請執行下列指令,確認 Cloud Shell 正在執行相容的 nodeJS 版本:
nvm install --lts
- 接著執行下列指令,切換至
microservices
目錄,然後啟動網路伺服器:
cd microservices
npm start
輸出內容應該會類似以下示例:
輸出內容:
Products microservice listening on port 8082!
Frontend microservice listening on port 8080!
Orders microservice listening on port 8081!
- 點選「網頁預覽」圖示,接著選取「透過以下通訊埠預覽:8080」。

系統會開啟新視窗,顯示 Fancy Store 的前端。
注意:您可以透過「預覽」選項查看前端,但「產品」和「訂單」功能不會正常運作,因為這些服務尚未公開。
- 看完網站後請關閉視窗,接著在終端機視窗中按下 CTRL+C 鍵,停止網路伺服器程序。
工作 4:建立 Compute Engine 執行個體
現在我們要來部署一些 Compute Engine 執行個體了!
在後續步驟中,您將執行下列操作:
- 建立開機指令碼以設定執行個體。
- 複製原始碼並上傳至 Cloud Storage。
- 部署用於託管後端微服務的 Compute Engine 執行個體。
- 重新設定前端程式碼,以便利用後端微服務執行個體。
- 部署用於託管前端微服務的 Compute Engine 執行個體。
- 設定網路來允許通訊。
建立開機指令碼
開機指令碼會在每次啟動時,指示執行個體應採取何種行動,以便自動設定執行個體。
- 按一下 Cloud Shell 工具列的「開啟編輯器」,打開程式碼編輯器。

-
前往「monolith-to-microservices
」資料夾。
-
依序點選「File」>「New File」,建立檔案並命名為 startup-script.sh
。
接著,您將運用 Gemini Code Assist 的 AI 輔助智慧動作,編輯 bash 指令碼檔案。
- 將下列程式碼貼入檔案:
#!/bin/bash
# Install logging monitor. The monitor will automatically pick up logs sent to
# syslog.
curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
service google-fluentd restart &
# Install dependencies from apt
apt-get update
apt-get install -yq ca-certificates git build-essential supervisor psmisc
# Install nodejs
mkdir /opt/nodejs
curl https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.gz | tar xvzf - -C /opt/nodejs --strip-components=1
ln -s /opt/nodejs/bin/node /usr/bin/node
ln -s /opt/nodejs/bin/npm /usr/bin/npm
# Get the application source code from the Google Cloud Storage bucket.
mkdir /fancy-store
gsutil -m cp -r gs://fancy-store-[PROJECT_ID]/monolith-to-microservices/microservices/* /fancy-store/
# Install app dependencies.
cd /fancy-store/
npm install
# Create a nodeapp user. The application will run as this user.
useradd -m -d /home/nodeapp nodeapp
chown -R nodeapp:nodeapp /opt/app
# Configure supervisor to run the node app.
cat >/etc/supervisor/conf.d/node-app.conf << EOF
[program:nodeapp]
directory=/fancy-store
command=npm start
autostart=true
autorestart=true
user=nodeapp
environment=HOME="/home/nodeapp",USER="nodeapp",NODE_ENV="production"
stdout_logfile=syslog
stderr_logfile=syslog
EOF
supervisorctl reread
supervisorctl update
-
依序點選「File」>「Save」來儲存檔案。
-
在 Cloud Shell 程式碼編輯器中,確認「行尾序列」已設為「LF」而非「CRLF」,這可以檢查程式碼編輯器右下方來確認。

- 如果設為 CRLF,請點選「CRLF」,然後在下拉式選單中選取「LF」來變更設定。
-
在檔案編輯器中開啟 bash 指令碼 startup-script.sh
檔案後,編輯器右上角會出現
圖示,表示 Gemini Code Assist 可供使用。
-
點選工具列上的「Gemini Code Assist: Smart Actions」
圖示。
-
請將下列提示詞貼到工具列開啟的 Gemini Code Assist 內嵌文字欄位,要求 Gemini Code Assist 協助更新 startup-script.sh
檔案。
在 startup-script.sh 檔案中,將 [PROJECT_ID] 預留位置換成 {{{project_0.project_id | PROJECT_ID}}}。
-
按下 Enter 鍵,提示 Gemini Code Assist 據此修改程式碼。
-
在「Gemini Diff」檢視畫面出現提示時,點選「接受」。
此時 startup-script.sh
中的程式碼應類似下列內容:
gs://fancy-store-{{{project_0.project_id | BUCKET}}}/monolith-to-microservices/microservices/* /fancy-store/
接著,您將運用 Gemini Code Assist 的 AI 智慧動作,生成 Bash 指令碼的用途說明,以及該指令碼在自動化部署 Node.js 微服務時的功用。
-
在檔案總管中開啟 data.csv
檔案。如前所述,編輯器右上角出現
圖示時,就代表 Gemini Code Assist 可供使用。
-
點選「Gemini Code Assist: Smart Actions」
圖示,然後選取「Explain this」。
-
Gemini Code Assist 會開啟對話窗格,並預先填入提示詞 Explain this
。在 Code Assist 對話的內嵌文字方塊中,將預先填入的提示詞改成下列內容,然後點選「Send」:
您是 Cymbal AI 的資深應用程式開發人員,請詳細說明 startup-script.sh bash 指令碼的用途和功能。這份說明是為新進團隊成員準備,應涵蓋下列要點:
* 概要說明指令碼在自動化部署工作流程中的主要功能。
* 主要步驟的詳細說明,包括安裝應用程式依附元件 (npm),以及從遠端儲存位置擷取原始碼。
* Supervisor 在管理應用程式程序中的角色,包括確保程序自動啟動,以及在失敗時重新啟動。
* 說明指令碼如何設定正式環境,包括建立使用者 (useradd) 和資安最佳做法。
如有建議改善的地方,請勿直接修改檔案內容。
startup-script.sh
檔案中 Bash 指令碼的詳細說明會顯示在 Gemini Code Assist 對話視窗。
開機指令碼會執行下列工作:
- 安裝 Logging 代理程式。代理程式會自動收集 Syslog 記錄。
- 安裝 Node.js 與 Supervisor。Supervisor 會將應用程式以 Daemon 形式執行。
- 從 Cloud Storage bucket 複製應用程式的原始碼,並安裝依附元件。
- 設定 Supervisor 以執行應用程式。如果應用程式非正常結束,或遭系統管理員或處理程序終止,Supervisor 會重新啟動應用程式。Supervisor 也會傳送應用程式的 stdout 和 stderr 至 syslog,再由 Logging 代理程式收集這些資料。
- 回到 Cloud Shell 終端機,然後執行下列指令,將
startup-script.sh
檔案複製到 bucket:
gsutil cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-{{{project_0.project_id | BUCKET}}}
該檔案目前可透過下列網址取得:https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh
。
[BUCKET_NAME] 代表 Cloud Storage bucket 的名稱。這項資訊預設為只有獲得授權的使用者和服務帳戶能查看,因此無法透過網路瀏覽器存取。Compute Engine 執行個體會自動透過服務帳戶存取這個名稱。
將程式碼複製到 Cloud Storage bucket
執行個體啟動後,會從 Cloud Storage bucket 提取程式碼,因此您可以在程式碼的 .env
檔案中儲存一些設定變數。
注意:您也可以編寫程式碼,從其他位置提取環境變數,但為了方便示範,本實驗室使用簡單的方法來處理設定。在正式環境中,環境變數可能會儲存在程式碼以外的地方。
- 執行下列指令,將複製的程式碼複製到 bucket:
cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-{{{project_0.project_id | BUCKET}}}/
注意:系統會刪除 node_modules
依附元件目錄,確保盡可能快速有效地執行複製的程式碼。當執行個體啟動,系統會在執行個體上重新建立這些程式碼。
點選「Check my progress」,確認目標已達成。
將開機指令碼和程式碼複製到 Cloud Storage bucket
部署後端執行個體
首先要部署的是後端執行個體,用於儲存「Orders」和「Products」微服務。
注意:在正式環境中,建議您每個微服務使用不同的執行個體和執行個體群組,讓微服務可以獨立調度資源。此處兩個後端微服務 (Orders 和 Products) 安排在相同執行個體和執行個體群組,純粹為了示範目的。
- 執行下列指令,建立設為使用開機指令碼的
e2-medium
執行個體。系統會將其標為 backend
執行個體,因此您之後可以為這個執行體體套用特定防火牆規則:
gcloud compute instances create backend \
--machine-type=e2-medium \
--tags=backend \
--metadata=startup-script-url=https://storage.googleapis.com/fancy-store-{{{project_0.project_id | BUCKET}}}/startup-script.sh
注意:如果系統要求您指定可用區,請確保本實驗室的「設定和需求」部分已設置預設可用區。
設定與後端的連線
部署應用程式前端之前,您需要先更新設定,指向您剛才部署的後端。
- 使用下列指令擷取後端的外部 IP 位址,請查看後端執行個體的
EXTERNAL_IP
分頁部分:
gcloud compute instances list
輸出內容範例:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
backend {{{ project_0.default_zone | "ZONE" }}} e2-medium 10.128.0.2 34.68.223.88 RUNNING
-
複製後端的外部 IP。
-
在 Cloud Shell 的 EXPLORER 中,依序前往「monolith-to-microservices
」>「react-app
」。
-
在程式碼編輯器中,依序選取「View」>「Toggle Hidden Files」,以便查看 .env
檔案。
-
編輯 .env
檔案,指向後端的外部 IP。[BACKEND_ADDRESS] 代表後端執行個體的外部 IP 位址 (執行前述的 gcloud
指令後即可判斷)。
-
在 .env
檔案中,將 localhost
替換成您的 [BACKEND_ADDRESS]
:
REACT_APP_ORDERS_URL=http://[BACKEND_ADDRESS]:8081/api/orders
REACT_APP_PRODUCTS_URL=http://[BACKEND_ADDRESS]:8082/api/products
-
儲存檔案。
-
執行下列指令,重新建構 react-app
以更新前端程式碼:
cd ~/monolith-to-microservices/react-app
npm install && npm run-script build
- 接著執行下列指令,將應用程式程式碼複製到 Cloud Storage bucket:
cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-{{{project_0.project_id | BUCKET}}}/
部署前端執行個體
程式碼設定完畢後,請部署前端執行個體。
- 執行下列指令,透過與先前類似的指令來部署
frontend
執行個體。基於防火牆用途,此執行個體會標記為 frontend
:
gcloud compute instances create frontend \
--machine-type=e2-medium \
--tags=frontend \
--metadata=startup-script-url=https://storage.googleapis.com/fancy-store-{{{project_0.project_id | BUCKET}}}/startup-script.sh
注意:我們將部署指令和開機指令碼同時用在前端和後端執行個體,一來可以簡化作業,再者是因為程式碼已預設為啟動所有微服務。因此,在本例中所有微服務皆會在前端及後端執行。但在正式環境中,您只需要在每個元件上執行需要的微服務即可。
設定網路
在本節中,您將建立防火牆規則,允許前端存取通訊埠 8080,而允許後端存取 8081 至 8082 通訊埠。這些防火牆指令會使用為應用程式建立執行個體時所指派的標記:
- 執行下列指令來設定防火牆規則:
gcloud compute firewall-rules create fw-fe \
--allow tcp:8080 \
--target-tags=frontend
gcloud compute firewall-rules create fw-be \
--allow tcp:8081-8082 \
--target-tags=backend
現在網站應該可以完全正常運作。
- 為了前往
frontend
的外部 IP,您需要知道 IP 位址。請執行下列指令,然後找出 frontend
執行個體的 EXTERNAL_IP:
gcloud compute instances list
輸出內容範例:
NAME: backend
ZONE: {{{ project_0.default_zone | "ZONE" }}}
MACHINE_TYPE: e2-medium
PREEMPTIBLE:
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.27.178.79
STATUS: RUNNING
NAME: frontend
ZONE: {{{ project_0.default_zone | "ZONE" }}}
MACHINE_TYPE: e2-medium
PREEMPTIBLE:
INTERNAL_IP: 10.128.0.3
EXTERNAL_IP: 34.172.241.242
STATUS: RUNNING
執行個體會在幾分鐘內啟動及設定完成。
- 稍候 30 秒,然後執行下列指令,監控應用程式是否準備就緒。請記得將 FRONTEND_ADDRESS 改成前端執行個體的外部 IP。
watch -n 2 curl http://[FRONTEND_ADDRESS]:8080
看到類似下列的輸出內容時,就代表網站應該已就緒。

-
按下 CTRL+C 鍵來取消 watch
指令。
-
開啟新的無痕模式瀏覽器分頁,然後前往 http://[FRONTEND_ADDRESS]:8080
來存取網站,其中的 [FRONTEND_ADDRESS] 是前述步驟中輸出的前端 EXTERNAL_IP。
-
試著前往「Products」和「Orders」頁面,現在網頁應該會正常運作。

點選「Check my progress」,確認目標已達成。
部署執行個體及設定網路
工作 5:建立代管執行個體群組
為允許應用程式調度資源,需建立代管執行個體群組,其使用 frontend
和 backend
執行個體做為執行個體範本。
代管執行個體群組 (MIG) 包含相同的執行個體,可做為單一可用區中的單一實體來管理。這類群組會主動讓執行個體保持可用狀態 (即處於「執行中」狀態),以維持應用程式的高可用性。在本實驗室中,您將為前端和後端執行個體使用代管執行個體群組,以便提供自動修復、負載平衡、自動調度資源和滾動式更新功能。
根據來源執行個體建立執行個體範本
建立代管執行個體群組前,必須先建立執行個體範本,用來做為群組的基礎。建立新 VM 執行個體時,執行個體範本可定義要使用的機型、開機磁碟映像檔或容器映像檔、網路,以及其他執行個體屬性。您可以利用執行個體範本,建立代管執行個體群組中的執行個體,甚或建立個別執行個體。
如要建立執行個體範本,請使用您先前建立的現有執行個體。
- 首先,執行下列指令停止兩個執行個體:
gcloud compute instances stop frontend
gcloud compute instances stop backend
- 接著,使用下列指令,根據各個來源執行個體建立執行個體範本:
gcloud compute instance-templates create fancy-fe \
--source-instance=frontend
gcloud compute instance-templates create fancy-be \
--source-instance=backend
- 執行下列指令,確認執行個體範本已建立完畢:
gcloud compute instance-templates list
輸出內容範例:
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP
fancy-be e2-medium 2020-02-03T10:34:12.966-08:00
fancy-fe e2-medium 2020-02-03T10:34:01.082-08:00
- 建立執行個體範本後,執行下列指令來刪除
backend
VM,以節省資源空間:
gcloud compute instances delete backend
- 在系統提示時輸入 y。
一般來說,您也可以刪除 frontend
VM,但在本實驗室稍後步驟中,您需要它來更新執行個體範本。
建立代管執行個體群組
- 接著執行下列指令,建立兩個代管執行個體群組,分別用於前端和後端:
gcloud compute instance-groups managed create fancy-fe-mig \
--base-instance-name fancy-fe \
--size 2 \
--template fancy-fe
gcloud compute instance-groups managed create fancy-be-mig \
--base-instance-name fancy-be \
--size 2 \
--template fancy-be
這些代管執行個體群組會使用執行個體範本,並設定為每個群組有兩個要啟動的執行個體。這些執行個體的名稱會依據指定的 base-instance-name
自動產生,再附加隨機字元。
- 執行下列指令,確保應用程式的
frontend
微服務在通訊埠 8080 上執行,backend
微服務則在通訊埠 8081 上執行,通訊埠 8081 用於 orders
,通訊埠 8082 則用於 products:
gcloud compute instance-groups set-named-ports fancy-fe-mig \
--named-ports frontend:8080
gcloud compute instance-groups set-named-ports fancy-be-mig \
--named-ports orders:8081,products:8082
這些是非標準通訊埠,因此請指定已命名通訊埠來加以識別。已命名通訊埠為鍵/值組合中繼資料,代表服務名稱和執行所處通訊埠。您可以將已命名通訊埠指派給執行個體群組,表示群組中的所有執行個體皆可提供該服務。HTTP 負載平衡服務會使用這項資訊,我們將在後續章節設定。
設定自動修復功能
您可以為代管執行個體群組設定自動修復政策,提高應用程式自身的可用性並驗證回應能力。
自動修復政策會利用以應用程式為基礎的健康狀態檢查機制,確認應用程式的回應符合預期。只確認執行個體是否處於「執行中」狀態(預設行為) 意義不大,檢查其是否有回應,才是比較精確的做法。
注意:負載平衡和自動修復會使用不同的健康狀態檢查。用於負載平衡的健康狀態檢查可以也應該較嚴格,因為這些檢查可判定執行個體能否接收使用者流量。畢竟,您需要快速掌握無回應的執行個體,以便在必要時重新導向流量。
相對於用在負載平衡的健康狀態檢查,基於自動修復需求而執行健康狀態檢查時,Compute Engine 會主動替換作業失敗的執行個體,因此執行這類檢查時應該更為保守。
- 執行下列指令建立健康狀態檢查,在
frontend
和 backend
執行個體連續三次傳回「健康狀態不良」時,修復執行個體:
gcloud compute health-checks create http fancy-fe-hc \
--port 8080 \
--check-interval 30s \
--healthy-threshold 1 \
--timeout 10s \
--unhealthy-threshold 3
gcloud compute health-checks create http fancy-be-hc \
--port 8081 \
--request-path=/api/orders \
--check-interval 30s \
--healthy-threshold 1 \
--timeout 10s \
--unhealthy-threshold 3
- 執行下列指令建立防火牆規則,允許健康狀態檢查探測器連線至通訊埠 8080 至 8081 上的微服務:
gcloud compute firewall-rules create allow-health-check \
--allow tcp:8080-8081 \
--source-ranges 130.211.0.0/22,35.191.0.0/16 \
--network default
- 執行下列指令,將健康狀態檢查套用至各自的服務:
gcloud compute instance-groups managed update fancy-fe-mig \
--health-check fancy-fe-hc \
--initial-delay 300
gcloud compute instance-groups managed update fancy-be-mig \
--health-check fancy-be-hc \
--initial-delay 300
注意:自動修復功能可能過 15 分鐘後才會開始監控群組中的執行個體。
- 請先繼續完成實驗室的活動,給自動修復功能一些時間監控群組中的執行個體。您將在本實驗室結尾模擬失敗狀況,測試自動修復功能。
點選「Check my progress」,確認目標已達成。
建立代管執行個體群組
工作 6:建立負載平衡器
為補強代管執行個體群組的不足之處,您可以使用 HTTP(S) 負載平衡器將流量提供給前端和後端微服務,並使用對應功能,將流量傳送給符合路徑規則的合適後端服務,這會對所有服務公開單一負載平衡 IP。
如要進一步瞭解 Google Cloud 的負載平衡選項,請參閱「負載平衡總覽」。
建立 HTTP(S) 負載平衡器
Google Cloud 提供多種類型的負載平衡器。在本實驗室中,您將使用 HTTP(S) 負載平衡器來處理流量。HTTP 負載平衡器的結構如下:
- 轉送規則將傳入要求導向至目標 HTTP Proxy。
- 目標 HTTP Proxy 會根據網址對應檢查每個要求,以決定適合要求的後端服務。
- 後端服務會根據已連接後端的服務規模、可用區和執行個體健康狀態,將每個要求導向合適的後端。系統會使用 HTTP 健康狀態檢查,驗證每個後端執行個體的健康狀態。如果將後端服務設定為使用 HTTPS 或 HTTP/2 健康狀態檢查,則要求會在前往後端執行個體的途中加密。
- 負載平衡器和執行個體之間的工作階段可以使用 HTTP、HTTPS 或 HTTP/2 通訊協定。如果您使用 HTTPS 或 HTTP/2,後端服務中的每個執行個體都必須具備 SSL 憑證。
注意:此處純為學習示範,推薦使用 HTTP 而非 HTTPS,可避免處理複雜的 SSL 憑證。在正式環境使用時,則建議盡可能使用 HTTPS,以收加密之效。
- 建立健康狀態檢查,判定哪個執行個體可為各服務提供流量:
gcloud compute http-health-checks create fancy-fe-frontend-hc \
--request-path / \
--port 8080
gcloud compute http-health-checks create fancy-be-orders-hc \
--request-path /api/orders \
--port 8081
gcloud compute http-health-checks create fancy-be-products-hc \
--request-path /api/products \
--port 8082
注意:這些健康狀態檢查僅適用於負載平衡器,只會處理負載平衡器的直接流量,不會導致代管執行個體群組重新建立執行個體。
- 建立後端服務,做為負載平衡流量的目標。後端服務會使用健康檢查與您建立的已命名通訊埠:
gcloud compute backend-services create fancy-fe-frontend \
--http-health-checks fancy-fe-frontend-hc \
--port-name frontend \
--global
gcloud compute backend-services create fancy-be-orders \
--http-health-checks fancy-be-orders-hc \
--port-name orders \
--global
gcloud compute backend-services create fancy-be-products \
--http-health-checks fancy-be-products-hc \
--port-name products \
--global
- 新增負載平衡器的後端服務:
gcloud compute backend-services add-backend fancy-fe-frontend \
--instance-group fancy-fe-mig \
--instance-group-zone {{{ project_0.default_zone | "ZONE" }}} \
--global
gcloud compute backend-services add-backend fancy-be-orders \
--instance-group fancy-be-mig \
--instance-group-zone {{{ project_0.default_zone | "ZONE" }}} \
--global
gcloud compute backend-services add-backend fancy-be-products \
--instance-group fancy-be-mig \
--instance-group-zone {{{ project_0.default_zone | "ZONE" }}} \
--global
- 建立網址對應。網址對應定義了應將哪些網址導向至哪些後端服務:
gcloud compute url-maps create fancy-map \
--default-service fancy-fe-frontend
- 建立路徑比對器,允許
/api/orders
和 /api/products
路徑轉送個別服務:
gcloud compute url-maps add-path-matcher fancy-map \
--default-service fancy-fe-frontend \
--path-matcher-name orders \
--path-rules "/api/orders=fancy-be-orders,/api/products=fancy-be-products"
- 執行下列指令,建立要與網址對應繫結的 Proxy:
gcloud compute target-http-proxies create fancy-proxy \
--url-map fancy-map
- 建立全域轉送規則,將公開 IP 位址及通訊埠與 Proxy 繫結在一起:
gcloud compute forwarding-rules create fancy-http-rule \
--global \
--target-http-proxy fancy-proxy \
--ports 80
點選「Check my progress」,確認目標已達成。
建立 HTTP(S) 負載平衡器
更新設定
現在您有新的靜態 IP 位址,請更新 frontend
的程式碼,指向這個新位址,不要使用先前指向 backend
執行個體的臨時 IP 位址。
- 在 Cloud Shell 中,切換到儲存
.env
檔案的 react-app
資料夾,該檔案內含相關設定:
cd ~/monolith-to-microservices/react-app/
- 找出負載平衡器的 IP 位址:
gcloud compute forwarding-rules list --global
輸出內容範例:
NAME: fancy-http-rule
REGION:
IP_ADDRESS: 34.111.203.235
IP_PROTOCOL: TCP
TARGET: fancy-proxy
- 返回 Cloud Shell Editor,再次編輯
.env
檔案,指向負載平衡器的公開 IP。[LB_IP] 代表之前決定的後端執行個體外部 IP 位址。
REACT_APP_ORDERS_URL=http://[LB_IP]/api/orders
REACT_APP_PRODUCTS_URL=http://[LB_IP]/api/products
注意:系統會在新位址中移除通訊埠,因為負載平衡器已完成設定,可以為您處理這個轉送要求。
-
儲存檔案。
-
重新建構 react-app
,更新前端程式碼:
cd ~/monolith-to-microservices/react-app
npm install && npm run-script build
- 將應用程式程式碼複製到 bucket:
cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-{{{project_0.project_id | BUCKET}}}/
更新前端執行個體
現在有了新程式碼及設定,您要使用代管執行個體群組中的前端執行個體提取新程式碼。
- 執行個體會在啟動時提取程式碼,因此您可以發出滾動式重新啟動指令:
gcloud compute instance-groups managed rolling-action replace fancy-fe-mig \
--max-unavailable 100%
注意:在這個滾動式替換作業的範例中,須透過 --max-unavailable
參數,明確指出所有機器皆可立即替換。如果沒有這項參數,指令會保留一個執行個體,同時重新啟動其他執行個體以確保可用性。為方便測試,請指定所有執行個體皆可立即取代,以加快處理程序。
點選「Check my progress」,確認目標已達成。
更新前端執行個體
測試網站
- 執行
rolling-action replace
指令後,請稍候 30 秒左右,讓系統有時間處理執行個體,然後等執行個體出現在清單中後,再檢查代管執行個體群組的狀態:
watch -n 2 gcloud compute instance-groups list-instances fancy-fe-mig
-
待執行個體出現在清單後,按下 CTRL+C 鍵,結束 watch
指令。
-
執行下列指令,確認服務顯示的狀態為「健康狀態良好」:
watch -n 2 gcloud compute backend-services get-health fancy-fe-frontend --global
- 等待 2 項服務的狀態顯示為「健康狀態良好」。
輸出內容範例:
---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/{{{ project_0.default_zone | "ZONE" }}}/instanceGroups/fancy-fe-mig
status:
healthStatus:
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/{{{ project_0.default_zone | "ZONE" }}}/instances/fancy-fe-x151
ipAddress: 10.128.0.7
port: 8080
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/{{{ project_0.default_zone | "ZONE" }}}/instances/fancy-fe-cgrt
ipAddress: 10.128.0.11
port: 8080
kind: compute#backendServiceGroupHealth
注意:如果其中一個執行個體發生問題,且狀態顯示為「健康狀態不良」,系統應會自動修復,請等待執行個體修復完畢。
稍候片刻,如果沒有執行個體顯示「健康狀態良好」狀態,表示前端執行個體的設定有誤,因此無法在通訊埠 8080 上存取執行個體。請直接前往通訊埠 8080 上的執行個體測試看看。
- 待兩個執行個體在清單中皆顯示為「健康狀態良好」後,按下 CTRL+C 鍵,結束
watch
指令。
注意:應用程式將可透過 http://[LB_IP] 存取,[LB_IP] 是系統為負載平衡器指定的 IP_ADDRESS,您可使用下列指令找出該位址:
gcloud compute forwarding-rules list --global
您會在本實驗室後續步驟查看這個應用程式。
工作 7:擴充 Compute Engine 執行個體群組
目前您已建立兩個代管執行個體群組,且每個群組皆含有兩個執行個體。這項配置可以正常運作,但不會隨著負載狀況變動。接下來,您要根據使用率建立自動調度資源政策,讓每個代管執行個體群組自動調整資源配置。
根據使用率自動調整
gcloud compute instance-groups managed set-autoscaling \
fancy-fe-mig \
--max-num-replicas 2 \
--target-load-balancing-utilization 0.60
gcloud compute instance-groups managed set-autoscaling \
fancy-be-mig \
--max-num-replicas 2 \
--target-load-balancing-utilization 0.60
這些指令會在代管執行個體群組建立自動配置器。這項工具會在使用率高於 60% 時,自動新增執行個體;當負載平衡器的使用率低於 60%,則移除執行個體。
啟用內容傳遞網路
內容傳遞網路服務也有助於資源調度,啟用後即可為前端提供快取。
gcloud compute backend-services update fancy-fe-frontend \
--enable-cdn --global
當使用者向 HTTP(S) 負載平衡器要求內容,系統會將要求傳送到 Google Front End (GFE)。GFE 首先會在 Cloud CDN 快取中尋找使用者要求的回應。如果 GFE 找到快取的回應,就會將其傳送給使用者。這種情況稱為「快取命中」。
假如 GFE 找不到要求的快取回應,會向後端直接提出要求。如果此要求的回應可快取,GFE 會將回應儲存在 Cloud CDN 快取中,以便將快取用於後續要求。
點選「Check my progress」,確認目標已達成。
調度 Compute Engine 的資源
工作 8:更新網站
更新執行個體範本
現有的執行個體範本無法編輯,不過,由於您的執行個體為無狀態,且已透過開機指令碼完成所有設定,若您想要變更範本設定,只需要變更執行個體範本即可。接下來要稍做調整,改用較大的機型,然後將這項變更推送出去。
-
更新 frontend
執行個體,做為執行個體範本的基礎。更新時,請將檔案儲存在更新版執行個體範本映像檔,接著更新執行個體範本、推出新的範本,然後確認代管執行個體群組的執行個體中確實有該檔案。
-
現在請修改執行個體範本的機型,從 e2-medium 改為配備 4 個 vCPU 和 3840MiB RAM 的自訂機型。
-
執行下列指令,修改前端執行個體的機型:
gcloud compute instances set-machine-type frontend --machine-type custom-4-3840
- 建立新的執行個體範本:
gcloud compute instance-templates create fancy-fe-new \
--source-instance=frontend \
--source-instance-zone={{{ project_0.default_zone | "ZONE" }}}
- 將更新後的執行個體範本推出至代管執行個體群組:
gcloud compute instance-groups managed rolling-action start-update fancy-fe-mig \
--version template=fancy-fe-new
- 等待 30 秒,接著執行下列指令,監控更新內容的狀態。
watch -n 2 gcloud compute instance-groups managed list-instances fancy-fe-mig
請稍候片刻。
如果至少有 1 個執行個體有下列情況:
- 狀態:執行中
- 動作:設為無
- INSTANCE_TEMPLATE:新的範本名稱 (fancy-fe-new)
-
複製其中一個列出的機器名稱,下一個指令會用到。
-
按下 CTRL+C 鍵,退出 watch
程序。
-
執行下列指令,查看虛擬機器是否改用新機型 (custom-4-3840),指令中的 [VM_NAME] 是新建立的執行個體:
gcloud compute instances describe [VM_NAME] | grep machineType
預期的輸出內容範例如下:
machineType: https://www.googleapis.com/compute/v1/projects/project-name/zones/{{{ project_0.default_zone | "ZONE" }}}/machineTypes/custom-4-3840
變更網站內容
情境:您的行銷團隊想請您變更網站首頁,希望其中包含更多公司簡介與銷售產品等資訊。
任務:在首頁加入一些文字,滿足行銷團隊要求!看來有某位開發人員已做了變更,檔案名稱為 index.js.new
。您可以直接將這個檔案複製到 index.js
,網站應該就會反映新內容。按照下方說明操作,進行適當變更。
- 執行下列指令,將更新後的檔案複製為正確檔名:
cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
- 顯示檔案內容來確認變更:
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js
顯示的程式碼應如下所示:
/*
Copyright 2019 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from "react";
import { Box, Paper, Typography } from "@mui/material";
export default function Home() {
return (
theme.spacing(3, 2),
}}
>
Fancy Fashion & Style Online
Tired of mainstream fashion ideas, popular trends and societal norms?
This line of lifestyle products will help you catch up with the Fancy
trend and express your personal style. Start shopping Fancy items now!
);
}
您已更新 React 元件,但還得建構 React 應用程式,才能產生靜態檔案。
- 執行下列指令即可建構 React 應用程式,並將其複製到單體公開目錄:
cd ~/monolith-to-microservices/react-app
npm install && npm run-script build
- 接著,重新將此程式碼推送至 bucket:
cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-{{{project_0.project_id | BUCKET}}}/
透過滾動式取代作業推送變更
- 接下來,強制更換所有執行個體,以便提取更新內容:
gcloud compute instance-groups managed rolling-action replace fancy-fe-mig \
--max-unavailable=100%
注意:在這個滾動式替換作業的範例中,您需運用 --max-unavailable
參數,明確指出所有機器皆可立即替換。如果沒有這項參數,指令會保留一個執行個體,並替換其他執行個體。為方便測試,請指定所有執行個體皆可立即替換,以加快處理程序。不過在正式環境中,預留緩衝時間則可讓網站在更新時,繼續提供服務。點選「Check my progress」,確認目標已達成。
更新網站
- 執行
rolling-action replace
指令後,請稍候 30 秒左右,讓系統有時間處理執行個體,然後等執行個體出現在清單中後,再檢查代管執行個體群組的狀態:
watch -n 2 gcloud compute instance-groups list-instances fancy-fe-mig
-
待執行個體出現在清單後,按下 CTRL+C 鍵,結束 watch
指令。
-
執行下列指令,確認服務顯示的狀態為「健康狀態良好」:
watch -n 2 gcloud compute backend-services get-health fancy-fe-frontend --global
- 稍候片刻,等待系統顯示兩項服務,且服務狀態為「健康狀態良好」。
輸出內容範例:
---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/{{{ project_0.default_zone | "ZONE" }}}/instanceGroups/fancy-fe-mig
status:
healthStatus:
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/{{{ project_0.default_zone | "ZONE" }}}/instances/fancy-fe-x151
ipAddress: 10.128.0.7
port: 8080
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/{{{ project_0.default_zone | "ZONE" }}}/instances/fancy-fe-cgrt
ipAddress: 10.128.0.11
port: 8080
kind: compute#backendServiceGroupHealth
-
待執行個體出現在清單後,按下 CTRL+C 鍵,結束 watch
指令。
-
透過 http://[LB_IP]
瀏覽網站,[LB_IP] 是系統為負載平衡器指定的 IP_ADDRESS,您可使用下列指令找出該位址:
gcloud compute forwarding-rules list --global
現在您應該可以看到網站變更後的內容。
模擬失敗情形
為了確認健康狀態檢查是否正常運作,請登入執行個體並停止服務。
- 請執行下列指令,找出執行個體名稱:
gcloud compute instance-groups list-instances fancy-fe-mig
- 複製執行個體名稱,接著執行下列指令,透過安全殼層連線至執行個體,INSTANCE_NAME 代表清單中的一個執行個體:
gcloud compute ssh [INSTANCE_NAME]
-
輸入「y」來確認操作,然後按兩次 Enter 鍵避免使用密碼。
-
在執行個體中,使用 supervisorctl
停止應用程式:
sudo supervisorctl stop nodeapp; sudo killall node
- 結束執行個體:
exit
- 監控修復作業:
watch -n 2 gcloud compute operations list \
--filter='operationType~compute.instances.repair.*'
此程序需要幾分鐘才能完成。
以下示範輸出內容。
輸出內容範例:
NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP
repair-1568314034627-5925f90ee238d-fe645bf0-7becce15 compute.instances.repair.recreateInstance {{{ project_0.default_zone | "ZONE" }}}/instances/fancy-fe-1vqq 200 DONE 2019-09-12T11:47:14.627-07:00
代管執行個體群組已重新建立並修復執行個體。
- 您也可以透過控制台監控,只要依序前往「導覽選單」>「Compute Engine」>「VM 執行個體」即可。
大功告成!
恭喜!在這個實驗室中,您已順利透過 Compute Engine 部署、更新網站,以及調度資源,累積了 Compute Engine、代管執行個體群組、負載平衡器和健康狀態檢查的實作經驗。說明 Google Cloud 和 AWS 如何協助部署 VM 型應用程式,並採行連結網際網路的負載平衡器,可以說是本實驗室的精華所在。Google Cloud 的做法是利用開機指令碼來整合程式碼部署作業和 VM 設定、透過自動調度資源簡化 VM 管理程序、提供全域外部 HTTP(S) 負載平衡功能,以及在開機指令碼和 MIG 工作流程中提供流暢的映像檔與應用程式更新體驗。
後續步驟/瞭解詳情
- 如要進一步瞭解代管執行個體群組中的自動修復和健康狀態檢查功能,請參閱這篇文章
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2025 年 9 月 3 日
實驗室上次測試日期:2025 年 9 月 3 日
Copyright 2025 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。