1. 簡介
大家好,感謝各位今天到場!準備好學習 Google Compute Engine 嗎?
在本程式碼研究室中,我們將透過 Guestbook 應用程式範例,探討 Compute Engine 的運作方式。
您將建立 Compute Engine 執行個體、部署 nginx,最後在前端放置網路負載平衡器。您可以透過圖形化主控台或指令列建立 Compute Engine 執行個體。本實驗室將逐步說明如何使用指令列。

Google Compute Engine 提供在 Google 資料中心運作的虛擬機器,並連線至全球光纖網路。透過工具和工作流程,可從單一執行個體擴充至全球負載平衡雲端運算架構。
這些 VM 開機速度快,不僅具備永久磁碟儲存空間,還能提供穩定的效能。機器有多種設定可供選用,除了預先定義的規格之外,您也可以選擇根據自身特定需求建立自訂機器類型。
最後,Compute Engine 虛擬機器也是其他幾項 Google Cloud 產品 (Kubernetes Engine、Cloud Dataproc、Cloud Dataflow 等) 所用的技術。
2. 設定和需求
自修實驗室環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



- 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串,您隨時可以更新。
- 專案 ID 在所有 Google Cloud 專案中不得重複,且設定後即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要在意該字串為何。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為
PROJECT_ID),因此如果您不喜歡該字串,可以產生另一個隨機字串,或是嘗試使用自己的字串,看看是否可用。專案建立後,系統就會「凍結」該值。 - 還有第三個值,也就是部分 API 使用的「專案編號」。如要進一步瞭解這三種值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要停用資源,避免在本教學課程結束後繼續產生帳單費用,請按照程式碼研究室結尾的「清除」操作說明操作。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
Google Cloud Shell
雖然可以透過筆電遠端操作 Google Cloud 和 Compute Engine,但在本程式碼研究室中,我們將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。
這部以 Debian 為基礎的虛擬機器,搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。也就是說,您只需要瀏覽器 (Chromebook 也可以) 就能完成本程式碼研究室。
- 如要從 Cloud 控制台啟用 Cloud Shell,只要按一下「啟用 Cloud Shell」
即可 (佈建並連線至環境的作業需要一些時間才能完成)。


連至 Cloud Shell 後,您應該會看到驗證已完成,專案也已設為獲派的專案 ID PROJECT_ID。
gcloud auth list
指令輸出
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
指令輸出
[core] project = <PROJECT_ID>
如果專案未設定,請發出下列指令:
gcloud config set project <PROJECT_ID>
在尋找「PROJECT_ID」嗎?請檢查您在設定步驟中使用的 ID,或在 Cloud 控制台資訊主頁中尋找:

Cloud Shell 也會預設設定部分環境變數,這些變數在您執行後續指令時可能很有用。
echo $GOOGLE_CLOUD_PROJECT
指令輸出
<PROJECT_ID>
- 最後,設定預設可用區和專案。
gcloud config set compute/zone us-central1-f
你可以選擇各種不同區域。詳情請參閱「地區和區域」。
3. 建立 Compute Engine 執行個體
如先前所述,我們將在本程式碼研究室中使用 gcloud 命令列。您也可以使用控制台 (網址為 console.cloud.google.com) 執行所有操作。
首先,請使用預設設定建立執行個體:
$ gcloud compute instances create myinstance Created [...]. NAME: myinstance ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING
記下 EXTERNAL_IP,這在後續步驟中很重要。
系統會使用多項預設值建立執行個體:
- 您選擇的區域。所有執行個體都位於區域中。您可以在建立執行個體時使用
--zone標記選取可用區,也可以設定預設可用區 (如初始設定中所做),並省略--zone標記。 - 最新版 Debian GNU/Linux 9 (stretch) 映像檔。如果您使用自己的自訂映像檔,請改為在此提供映像檔名稱。例如:
--image my-own-image。 n1-standard-1是機器類型,您可以選取其他機器類型,例如n1-highmem-4或n1-highcpu-6。如果沒有任何預先定義的機器類型符合需求,請使用自訂機器類型。- 名稱與執行個體相同的根永久磁碟;該磁碟會自動連接至執行個體。
執行 gcloud compute instances create --help 即可查看所有可用選項。
4. 啟用通訊埠 80 的防火牆
根據預設,Google Cloud Platform 只允許少數幾個連接埠存取權。我們即將安裝 Nginx,因此請先在防火牆設定中啟用通訊埠 80。
$ gcloud compute firewall-rules create allow-80 --allow tcp:80 Created [...]. NAME: allow-80 NETWORK: default DIRECTION: INGRESS PRIORITY: 1000 ALLOW: tcp:80 DENY: DISABLED: False
這會建立名為 allow-80 的防火牆規則,其中允許建立連入連線的 IP 位址區塊預設清單 (--source-ranges) 會設為 0.0.0.0/0 (任何位置)。
執行 gcloud compute firewall-rules create --help 即可查看所有預設值和可用選項,包括根據標記套用防火牆規則。
5. 透過 SSH 連入執行個體
如要透過指令列 (仍在 Cloud Shell 中) 以 SSH 登入執行個體,請執行下列操作:
$ gcloud compute ssh myinstance Waiting for SSH key to propagate. Warning: Permanently added 'compute.12345' (ECDSA) to the list of known hosts. ... yourusername@myinstance:~#
就是這麼簡單!(在正式版中,請務必輸入通關密語:)
您也可以直接從控制台 ( console.cloud.google.com) 透過 SSH 連線至執行個體,方法是依序前往「Compute Engine」 >「VM 執行個體」,然後點選「SSH」。

6. 安裝 Nginx
登入新建立的執行個體 myinstance,然後安裝 nginx:
$ sudo su - # apt update # apt install -y nginx # service nginx start # exit
使用 myinstance 中的 curl 測試伺服器是否正在執行:
$ curl -s localhost | grep nginx <title>Welcome to nginx!</title> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and <a href="http://nginx.org/">nginx.org</a>.<br/> <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p>
透過網頁介面列出執行個體,找出執行個體的外部 IP:

請務必退出 SSH,然後從 Cloud Shell 執行下列指令:
$ gcloud compute instances list NAME: myinstance ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING
然後前往 http://EXTERNAL_IP/,其中 EXTERNAL_IP 是 myinstance 的公開 IP,您應該會看到 nginx 頁面:

7. 開機指令碼
您可以使用開機指令碼在啟動時初始化執行個體,不必每次都設定執行個體。
建立名為 startup.sh 的檔案,並加入下列內容 (您可以使用慣用的文字編輯器,例如 vim、nano 或 emacs):
#! /bin/bash apt-get update apt-get install -y nginx service nginx start sed -i -- 's/nginx/Google Cloud Platform - '"$HOSTNAME"'/' /var/www/html/index.nginx-debian.html
如要使用這個開機指令碼建立新的 VM 執行個體,只要輸入:
$ gcloud compute instances create nginx \
--metadata-from-file startup-script=startup.sh
Created [...].
NAME: nginx
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING
前往 http://EXTERNAL_IP/,您應該會看到更新後的首頁。如果頁面沒有立即顯示,請稍候幾秒再試一次,主機可能仍在啟動 nginx。
8. 建立伺服器叢集
如要建立伺服器叢集,請先建立執行個體範本。建立執行個體範本後,您就可以建立執行個體群組,管理要建立的執行個體數量。
首先,請使用開機指令碼建立執行個體範本:
$ gcloud compute instance-templates create nginx-template \
--metadata-from-file startup-script=startup.sh
Created [...].
NAME: nginx-template
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
CREATION_TIMESTAMP: 2022-03-18T15:10:37.621-07:00
接著,讓我們建立目標集區。目標集區可讓我們透過單一存取點存取群組中的所有執行個體,且是後續步驟中進行負載平衡的必要條件。
$ gcloud compute target-pools create nginx-pool Created [...]. NAME: nginx-pool REGION: us-central1 SESSION_AFFINITY: NONE BACKUP: HEALTH_CHECKS:
最後,使用範本建立執行個體群組:
$ gcloud compute instance-groups managed create nginx-group \
--base-instance-name nginx \
--size 2 \
--template nginx-template \
--target-pool nginx-pool
Created [...].
NAME: nginx-group
LOCATION: us-central1-f
SCOPE: zone
BASE_INSTANCE_NAME: nginx
SIZE: 0
TARGET_SIZE: 2
INSTANCE_TEMPLATE: nginx-template
AUTOSCALED: no
這會建立兩個額外的 VM 執行個體,名稱前置字串為 nginx-。
現在應該會看到所有建立的執行個體!
$ gcloud compute instances list NAME: myinstance ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING NAME: nginx ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING NAME: nginx-frpl ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING NAME: nginx-ztg4 ZONE: us-central1-f MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.X.X EXTERNAL_IP: X.X.X.X STATUS: RUNNING
9. 建立網路負載平衡器
Google Cloud Platform 提供多種負載平衡器,包括:
- 第 3 層網路負載平衡器
- 第 7 層 HTTP(S) 負載平衡器
讓我們建立以執行個體群組為目標的區域網路負載平衡器:
$ gcloud compute forwarding-rules create nginx-lb \
--ports 80 \
--target-pool nginx-pool
Created [...].
$ gcloud compute forwarding-rules list
NAME: nginx-lb
REGION: us-central1
IP_ADDRESS: X.X.X.X
IP_PROTOCOL: TCP
TARGET: us-central1/targetPools/nginx-pool
接著,您可以在瀏覽器中前往負載平衡器 http://IP_ADDRESS/,其中 IP_ADDRESS 是執行上一個指令後顯示的位址。
由於時間關係,我們今天不會建立 HTTP 負載平衡器。
10. 清除叢集
請務必關閉叢集,否則叢集會持續運作並累積費用。下列指令會刪除 Google Compute Engine 執行個體、執行個體群組、目標群組和負載平衡器。
$ gcloud compute forwarding-rules delete nginx-lb $ gcloud compute instance-groups managed delete nginx-group $ gcloud compute target-pools delete nginx-pool $ gcloud compute instance-templates delete nginx-template $ gcloud compute instances delete nginx $ gcloud compute instances delete myinstance $ gcloud compute firewall-rules delete allow-80
上述每個指令都會要求您確認是否要刪除資源。
11. 接下來要做什麼?
恭喜,您已完成本 Compute Engine 程式碼研究室!
更多 Compute Engine 功能
Google Compute Engine 提供豐富的功能,建議您深入瞭解下列主題:
- 先占 VM - https://cloud.google.com/compute/docs/instances/create-start-preemptible-instance
- 單一用戶群節點 - https://cloud.google.com/compute/docs/nodes/create-nodes
- GPU 和 TPU - https://cloud.google.com/compute/docs/gpus/add-gpus
- Windows 執行個體 - https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances
- 為資源加上標籤 - https://cloud.google.com/compute/docs/labeling-resources
- 將 VM 遷移至 Compute Engine - https://cloud.google.com/compute/docs/vm-migration/
Google Kubernetes Engine
Google Kubernetes Engine (GKE) 是 Google Cloud 託管的全代管 Kubernetes 產品。我們提供多個程式碼研究室,協助您開始使用 GKE。建議先從以下範例著手:
- Google Kubernetes Engine Codelab - https://codelabs.developers.google.com/codelabs/cloud-gke-workshop-v2
提供意見
- 請花點時間填寫這份簡短的問卷調查