在 Google Cloud 部署網站的方式有很多種,且特色、功能及控管程度不盡相同。Compute Engine 可讓您深入掌控用於執行網站的基礎架構,但與 Google Kubernetes Engines (GKE)、App Engine 和其他解決方案相比,需要完成多點營運管理作業。透過 Compute Engine,即可精細控管基礎架構的各個環節,包括虛擬機器及負載平衡器等。
Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
在這項工作中,您會複製原始碼,以便專注於部署至 Compute Engine 的各個環節。在本實驗室後續部分,您將稍微修改程式碼,體驗在 Compute Engine 更新內容有多簡單。
-
點選「儲存」或按下 CTRL+S 鍵來儲存 startup-script.sh 檔案,但先不要關閉檔案。
-
查看 Cloud Shell 程式碼編輯器的右下方,確認「行尾序列」已設為「LF」而非「CRLF」。

- 如果設為 CRLF,請點選「CRLF」,然後在下拉式選單中選取「LF」。
- 如果已設為「LF」,則不必做任何更動。
回到 Cloud Shell 終端機,然後執行下列指令,將 startup-script.sh 檔案複製到 bucket:
gcloud storage cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-{{{project_0.project_id | Project ID}}}
該檔案目前可從下列網址存取:https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh。
[BUCKET_NAME] 代表 Cloud Storage bucket 的名稱。根據預設,只有取得授權的使用者和服務帳戶才可查看,且無法透過網路瀏覽器存取。Compute Engine 執行個體會自動透過服務帳戶存取該檔案。
開機指令碼會執行下列工作:
- 安裝 Logging 代理程式,自動收集 syslog 的記錄。
- 安裝 Node.js 和 Supervisor;Supervisor 會以 Daemon 形式執行應用程式。
- 從 Cloud Storage bucket 複製應用程式的原始碼,並安裝依附元件。
- 設定 Supervisor 執行應用程式。如果應用程式非正常結束,或由管理員/程序終止,Supervisor 會重新啟動應用程式。Supervisor 也會傳送應用程式的 stdout 和 stderr 至 syslog,再由 Logging 代理程式收集這些資料。
將程式碼複製到 Cloud Storage bucket
執行個體啟動後,會從 Cloud Storage bucket 提取程式碼,因此您可以在程式碼的 .env 檔案中儲存一些設定變數。
注意:您也能編寫程式碼,從其他位置提取環境變數。為了方便示範,本實驗室採取簡單方式處理設定。在正式環境中,環境變數比較可能儲存於程式碼以外的地方。
- 執行下列指令,將複製的程式碼複製到 bucket:
cd ~
rm -rf monolith-to-microservices/*/node_modules
gcloud storage cp -r monolith-to-microservices gs://fancy-store-{{{project_0.project_id | Project ID}}}/
注意:系統會刪除 node_modules 依附元件目錄,確保複製過程盡可能快速且有效率。當執行個體啟動,系統會在執行個體上重新建立這些目錄。
點選「Check my progress」,確認目標已達成。
將開機指令碼和程式碼複製到 Cloud Storage bucket
部署後端執行個體
首先要部署後端執行個體,其中包含「Orders」和「Products」微服務。
注意:在正式環境中,建議將每項微服務部署到不同的執行個體和執行個體群組,讓微服務可以獨立調度資源。基於示範目的,兩個後端微服務 (Orders 和 Products) 皆位於相同的執行個體和執行個體群組。
- 執行下列指令,建立已設為使用開機指令碼的
e2-standard-2 執行個體。系統會加上 backend 執行個體的標記,方便您稍後套用特定的防火牆規則:
gcloud compute instances create backend \
--zone={{{project_0.default_zone | zone}}} \
--machine-type=e2-standard-2 \
--tags=backend \
--image-family={{{project_0.startup_script.debian_image_id_short | Debian image name}}} \
--image-project=debian-cloud \
--metadata=startup-script-url=https://storage.googleapis.com/fancy-store-{{{project_0.project_id | Project ID}}}/startup-script.sh
設定後端連線
部署應用程式前端前,您需要先更新設定,指向剛才部署的後端。
- 使用下列指令擷取後端的外部 IP 位址,並在
EXTERNAL_IP 欄位查看該後端執行個體的資訊:
gcloud compute instances list
輸出內容範例:
NAME: backend
ZONE: {{{project_0.default_zone | zone}}}
MACHINE_TYPE: e2-standard-2
PREEMPTIBLE:
INTERNAL_IP: 10.142.0.2
EXTERNAL_IP: 35.237.245.193
STATUS: RUNNING
-
複製後端的外部 IP。
-
在 Cloud Shell Explorer 中,依序前往 monolith-to-microservices > react-app。
-
在程式碼編輯器中,依序選取「View」>「Toggle Hidden Files」,以便查看 .env 檔案。
在下個步驟中,您要編輯 .env 檔案,指向後端的外部 IP。[BACKEND_ADDRESS] 代表剛才執行 gcloud 指令取得的後端執行個體外部 IP 位址。
- 在
.env 檔案中,將 localhost 換成您的 [BACKEND_ADDRESS]:
REACT_APP_ORDERS_URL=http://[BACKEND_ADDRESS]:8081/api/orders
REACT_APP_PRODUCTS_URL=http://[BACKEND_ADDRESS]:8082/api/products
-
儲存檔案。
-
在 Cloud Shell 執行下列指令,重新建構 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
gcloud storage cp -r monolith-to-microservices gs://fancy-store-{{{project_0.project_id | Project ID}}}/
部署前端執行個體
程式碼設定完畢後,即可部署前端執行個體。
- 執行下列指令,透過與先前類似的指令來部署
frontend 執行個體。為套用防火牆規則,系統會為這個執行個體加上 frontend 標記:
gcloud compute instances create frontend \
--zone={{{project_0.default_zone | zone}}} \
--machine-type=e2-standard-2 \
--tags=frontend \
--image-family={{{project_0.startup_script.debian_image_id_short | Debian image name}}} \
--image-project=debian-cloud \
--metadata=startup-script-url=https://storage.googleapis.com/fancy-store-{{{project_0.project_id | Project ID}}}/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: us-central1-f
MACHINE_TYPE: e2-standard-2
PREEMPTIBLE:
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.27.178.79
STATUS: RUNNING
NAME: frontend
ZONE: us-central1-f
MACHINE_TYPE: e2-standard-2
PREEMPTIBLE:
INTERNAL_IP: 10.128.0.3
EXTERNAL_IP: 34.172.241.242
STATUS: RUNNING
執行個體會在幾分鐘內啟動及設定完成。
-
等待 3 分鐘,接著開啟新的瀏覽器分頁,並前往 http://[FRONTEND_ADDRESS]:8080 來存取網站。[FRONTEND_ADDRESS] 是先前找出的前端 EXTERNAL_IP。
-
試著前往「Products」和「Orders」頁面,現在網頁應該會正常運作。

點選「Check my progress」,確認目標已達成。
部署執行個體及設定網路
工作 5:建立代管執行個體群組
為了允許應用程式調度資源,需建立代管執行個體群組,並使用 frontend 和 backend 執行個體做為執行個體範本。
代管執行個體群組 (MIG) 包含相同的執行個體,可做為單一可用區中的單一實體來管理。這類群組會主動讓執行個體保持可用狀態 (即處於「RUNNING」狀態),以維持應用程式的高可用性。您將為前端和後端執行個體使用代管執行個體群組,提供自動修復、負載平衡、自動調度資源和滾動式更新等功能。
根據來源執行個體建立執行個體範本
建立代管執行個體群組前,必須先建立執行個體範本,用來做為群組的基礎。建立新 VM 執行個體時,執行個體範本可定義要使用的機型、網路、開機磁碟映像檔或容器映像檔,以及其他執行個體屬性。您可以利用執行個體範本建立代管執行個體群組中的執行個體,甚至建立個別執行個體。
請使用先前建立的現有執行個體來建立執行個體範本。
- 首先,執行下列指令停止兩個執行個體:
gcloud compute instances stop frontend --zone={{{project_0.default_zone | zone}}}
gcloud compute instances stop backend --zone={{{project_0.default_zone | zone}}}
- 接著,使用下列指令,根據各個來源執行個體建立執行個體範本:
gcloud compute instance-templates create fancy-fe \
--source-instance-zone={{{project_0.default_zone | zone}}} \
--source-instance=frontend
gcloud compute instance-templates create fancy-be \
--source-instance-zone={{{project_0.default_zone | zone}}} \
--source-instance=backend
- 執行下列指令,確認執行個體範本已建立完畢:
gcloud compute instance-templates list
輸出內容範例:
NAME: fancy-be
MACHINE_TYPE: e2-standard-2
PREEMPTIBLE:
CREATION_TIMESTAMP: 2023-07-25T14:52:21.933-07:00
NAME: fancy-fe
MACHINE_TYPE: e2-standard-2
PREEMPTIBLE:
CREATION_TIMESTAMP: 2023-07-25T14:52:15.442-07:00
- 建立執行個體範本後,執行下列指令刪除
backend VM,節省資源空間:
gcloud compute instances delete backend --zone={{{project_0.default_zone | zone}}}
- 在系統提示時輸入 y。
一般來說,您也能刪除 frontend VM,但稍後在實驗室更新執行個體範本時,仍須使用該 VM。
建立代管執行個體群組
- 接著執行下列指令,建立兩個代管執行個體群組,分別用於前端和後端:
gcloud compute instance-groups managed create fancy-fe-mig \
--zone={{{project_0.default_zone | zone}}} \
--base-instance-name fancy-fe \
--size 2 \
--template fancy-fe
gcloud compute instance-groups managed create fancy-be-mig \
--zone={{{project_0.default_zone | zone}}} \
--base-instance-name fancy-be \
--size 2 \
--template fancy-be
這些代管執行個體群組會使用執行個體範本,且每個群組初始皆設為包含兩個執行個體。執行個體名稱會依據指定的 base-instance-name 自動產生,再附加隨機字元。
- 執行下列指令,確保應用程式的
frontend 微服務在通訊埠 8080 上執行,backend 微服務則分別使用通訊埠 8081 (orders) 和 8082 (products):
gcloud compute instance-groups set-named-ports fancy-fe-mig \
--zone={{{project_0.default_zone | zone}}} \
--named-ports frontend:8080
gcloud compute instance-groups set-named-ports fancy-be-mig \
--zone={{{project_0.default_zone | zone}}} \
--named-ports orders:8081,products:8082
這些是非標準通訊埠,因此請指定已命名通訊埠來識別。已命名通訊埠是鍵/值組合的中繼資料,表示服務名稱和執行的通訊埠。已命名通訊埠可指派給執行個體群組,代表群組中的所有執行個體皆可提供該服務。HTTP 負載平衡服務會使用這項資訊,我們將在後續章節設定。
設定自動修復功能
為了提高應用程式本身的可用性並驗證回應能力,請為代管執行個體群組設定自動修復政策。
自動修復政策會利用以應用程式為基礎的健康狀態檢查機制,確認應用程式的回應符合預期。根據預設,系統只會確認執行個體是否為「RUNNING」狀態。相較之下,檢查應用程式是否有回應的做法比較精確。
注意:負載平衡和自動修復會採用不同的健康狀態檢查。負載平衡的健康狀態檢查應更加嚴格,因為這些檢查將決定執行個體能否接收使用者流量。若能快速掌握無回應的執行個體,就能在必要時重新導向流量。執行自動修復的健康狀態檢查時,Compute Engine 會主動替換故障的執行個體,因此這類檢查應比負載平衡的健康狀態檢查更為保守。
- 執行下列指令建立健康狀態檢查,在
frontend 和 backend 連續 3 次傳回「unhealthy」時,自動修復該執行個體:
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 \
--zone={{{project_0.default_zone | zone}}} \
--health-check fancy-fe-hc \
--initial-delay 300
gcloud compute instance-groups managed update fancy-be-mig \
--zone={{{project_0.default_zone | zone}}} \
--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 憑證。
注意:基於示範目的,為避免 SSL 憑證過於複雜,請使用 HTTP (而非 HTTPS)。在正式環境中,則應盡可能使用 HTTPS 加密。
- 執行下列指令建立健康狀態檢查,判定哪個執行個體可為各服務提供流量:
gcloud compute health-checks create http fancy-fe-frontend-hc \
--request-path=/ \
--port=8080
gcloud compute health-checks create http fancy-be-orders-hc \
--request-path=/api/orders \
--port=8081
gcloud compute health-checks create http fancy-be-products-hc \
--request-path=/api/products \
--port=8082
注意:這些健康檢查適用於負載平衡器,只會處理負載平衡器的流量導向作業,不會讓代管執行個體群組重新建立執行個體。
- 執行下列指令建立後端服務,做為經過負載平衡處理的流量目標。後端服務會使用您建立的健康狀態檢查和已命名通訊埠:
gcloud compute backend-services create fancy-fe-frontend \
--health-checks=fancy-fe-frontend-hc \
--port-name=frontend \
--global
gcloud compute backend-services create fancy-be-orders \
--health-checks=fancy-be-orders-hc \
--port-name=orders \
--global
gcloud compute backend-services create fancy-be-products \
--health-checks=fancy-be-products-hc \
--port-name=products \
--global
- 執行下列指令,新增負載平衡器的後端服務:
gcloud compute backend-services add-backend fancy-fe-frontend \
--instance-group-zone={{{project_0.default_zone | zone}}} \
--instance-group fancy-fe-mig \
--global
gcloud compute backend-services add-backend fancy-be-orders \
--instance-group-zone={{{project_0.default_zone | zone}}} \
--instance-group fancy-be-mig \
--global
gcloud compute backend-services add-backend fancy-be-products \
--instance-group-zone={{{project_0.default_zone | zone}}} \
--instance-group fancy-be-mig \
--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 執行個體的臨時位址。
- 在 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 編輯器,再次編輯
.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
gcloud storage cp -r monolith-to-microservices gs://fancy-store-{{{project_0.project_id | Project ID}}}/
更新前端執行個體
有了新程式碼和設定後,您要使用代管執行個體群組中的前端執行個體提取新程式碼。
- 執行個體會在啟動時提取程式碼,因此請執行滾動重啟指令:
gcloud compute instance-groups managed rolling-action replace fancy-fe-mig \
--zone={{{project_0.default_zone | zone}}} \
--max-unavailable 100%
注意:在這個滾動式替換範例,您特別透過 --max-unavailable 參數指定立即更換所有機器。如果沒有這項參數,指令會保留一個執行個體,同時重新啟動其他執行個體來確保可用性。為了方便測試,請指定立即替換所有執行個體,加快處理程序。
點選「Check my progress」,確認目標已達成。
更新前端執行個體
測試網站
- 執行
rolling-action replace 指令後等待 3 分鐘,讓系統有時間處理執行個體,接著檢查代管執行個體群組的狀態。執行下列指令,確認服務顯示「HEALTHY」:
watch -n 2 gcloud compute backend-services get-health fancy-fe-frontend --global
- 等待兩項服務皆顯示為「HEALTHY」。
輸出內容範例:
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
healthStatus:
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/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/us-central1-a/instances/fancy-fe-cgrt
ipAddress: 10.128.0.11
port: 8080
kind: compute#backendServiceGroupHealth
注意:若其中一個執行個體發生問題,且狀態顯示「UNHEALTHY」,系統應會自動修復,請等待執行個體修復完畢。
稍候片刻,如果都沒有執行個體顯示「HEALTHY」,這表示前端執行個體設定有誤,無法在通訊埠 8080 上存取執行個體。請直接存取通訊埠 8080 上的執行個體來測試。
- 待兩個執行個體在清單中皆顯示為「HEALTHY」後,按下 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 \
--zone={{{project_0.default_zone | zone}}} \
--max-num-replicas 2 \
--target-load-balancing-utilization 0.60
gcloud compute instance-groups managed set-autoscaling \
fancy-be-mig \
--zone={{{project_0.default_zone | zone}}} \
--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:更新網站
更新執行個體範本
現有的執行個體範本無法編輯。不過,由於您的執行個體處於無狀態,且已透過開機指令碼完成所有設定,若您想要變更範本設定,只需變更執行個體範本即可。在這項工作中,您要稍做調整,改用較大的機型,然後將這項變更推送出去。
請按照下列步驟操作,完成下列動作:
- 執行下列指令,修改前端執行個體的機型:
gcloud compute instances set-machine-type frontend \
--zone={{{project_0.default_zone | zone}}} \
--machine-type e2-small
- 執行下列指令,建立新的執行個體範本:
gcloud compute instance-templates create fancy-fe-new \
--region=$REGION \
--source-instance=frontend \
--source-instance-zone={{{project_0.default_zone | zone}}}
- 使用下列指令,將更新後的執行個體範本推出至代管執行個體群組:
gcloud compute instance-groups managed rolling-action start-update fancy-fe-mig \
--zone={{{project_0.default_zone | zone}}} \
--version template=fancy-fe-new
- 等待 3 分鐘,接著執行下列指令,監控更新內容的狀態。
watch -n 2 gcloud compute instance-groups managed list-instances fancy-fe-mig \
--zone={{{project_0.default_zone | zone}}}
這項程序需要幾分鐘才能完成。
請先確認至少有一個執行個體符合下列情況,再繼續操作:
- 狀態:「RUNNING」
- 動作:設為「None」
- INSTANCE_TEMPLATE:新範本名稱 fancy-fe-new
-
複製其中一個列出的機器名稱,下個指令會用到。
-
按下 CTRL+C 鍵,退出 watch 程序。
-
執行下列指令,查看虛擬機器是否使用新的機型 (e2-small),指令中的 [VM_NAME] 是新建立的執行個體:
gcloud compute instances describe [VM_NAME] --zone={{{project_0.default_zone | zone}}} | grep machineType
預期的輸出內容範例如下:
machineType: https://www.googleapis.com/compute/v1/projects/project-name/zones/us-central1-f/machineTypes/e2-small
變更網站內容
情境:您的行銷團隊要求調整網站首頁內容,加入更多公司簡介與銷售產品等資訊。
在本節中,您要在首頁加入一些文字,滿足行銷團隊的要求!看來有位開發人員做了變更,檔案名稱為 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 (
<Box sx={{ flexGrow: 1 }}>
<Paper
elevation={3}
sx={{
width: "800px",
margin: "0 auto",
padding: (theme) => theme.spacing(3, 2),
}}
>
<Typography variant="h5">Welcome to the Fancy Store!</Typography>
<br />
<Typography variant="body1">
Take a look at our wide variety of products.
</Typography>
</Paper>
</Box>
);
}
您已更新 React 元件,但需要建構 React 應用程式來產生靜態檔案。
- 執行下列指令建構 React 應用程式,並複製到單體公開目錄:
cd ~/monolith-to-microservices/react-app
npm install && npm run-script build
- 接著執行下列指令,將程式碼重新推送至 bucket:
cd ~
rm -rf monolith-to-microservices/*/node_modules
gcloud storage cp -r monolith-to-microservices gs://fancy-store-{{{project_0.project_id | Project ID}}}/
透過滾動式取代作業推送變更
- 執行下列指令,強制替換所有執行個體,以便提取更新內容:
gcloud compute instance-groups managed rolling-action replace fancy-fe-mig \
--zone={{{project_0.default_zone | zone}}} \
--max-unavailable=100%
注意:在這個滾動式替換範例,您特別透過 --max-unavailable 參數,明確指定所有機器可立即替換。如果沒有這項參數,指令會保留一個執行個體,並替換其他所有執行個體。為了方便測試,您要指定所有執行個體皆可立即替換,以加快處理程序。在正式環境中,預留緩衝時間可讓網站在更新時繼續提供服務。
點選「Check my progress」,確認目標已達成。
更新網站
- 執行
rolling-action replace 指令後等待 3 分鐘,讓系統有時間處理執行個體,接著檢查代管執行個體群組的狀態。執行下列指令,確認服務顯示「HEALTHY」:
watch -n 2 gcloud compute backend-services get-health fancy-fe-frontend --global
- 稍候片刻,等待系統顯示兩項服務,且狀態為「HEALTHY」。
輸出內容範例:
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
healthStatus:
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/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/us-central1-a/instances/fancy-fe-cgrt
ipAddress: 10.128.0.11
port: 8080
kind: compute#backendServiceGroupHealth
-
若項目顯示在清單中,且狀態為「HEALTHY」,請按下 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 --zone={{{project_0.default_zone | zone}}}
- 複製執行個體名稱,接著執行下列指令,透過 SSH 連線至執行個體,INSTANCE_NAME 代表清單中的執行個體之一:
gcloud compute ssh [INSTANCE_NAME] --zone={{{project_0.default_zone | zone}}}
-
輸入「y」來確認操作,然後按兩次 Enter 鍵避免使用密碼。
-
在執行個體執行下列指令,使用 supervisorctl 停止應用程式:
sudo supervisorctl stop nodeapp; sudo killall node
- 執行下列指令,退出執行個體:
exit
- 監控修復作業:
watch -n 2 gcloud compute operations list \
--filter='operationType~compute.instances.repair.*'
這個程序需要幾分鐘才能完成。
以下示範輸出內容。
輸出內容:
NAME: repair-1755080598062-63c3c8b99843b-eed8dabc-f1833ea3
TYPE: compute.instances.repair.recreateInstance
TARGET: us-east4-c/instances/fancy-fe-tn40
HTTP_STATUS: 200
STATUS: DONE
TIMESTAMP: 2025-08-13T03:23:18.062-07:00
代管執行個體群組已重新建立並修復執行個體。
- 您也能透過控制台監控執行個體,方法是依序點選「導覽選單」>「Compute Engine」>「VM 執行個體」。
恭喜!
您已成功在 Compute Engine 部署、調度資源及更新網站。現在您已具備相關經驗,知道如何使用 Compute Engine、代管執行個體群組、負載平衡器和健康狀態檢查!
後續步驟/瞭解詳情
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2026 年 6 月 19 日
實驗室上次測試日期:2026 年 6 月 19 日
Copyright 2026 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。