GSP041

總覽
要建構安全穩固、易於管理的內部應用程式,為業務營運提供強大後盾,內部應用程式負載平衡器是關鍵。本實驗室將說明如何在私有雲網路內分配網路流量,同時避免虛擬機器 (VM) 直接暴露於公開網際網路中,確保服務安全且高效運作。
您將建構一套精簡但很常見的架構模式:
- 「網路層」(對外公開的網站),需要向其他內部服務尋求協助。
- 「內部服務層」(質數計算機),分布於多部機器上,負責執行特定工作。
這種架構可確保即使內部服務的某個部分忙碌或停止運作,負載平衡器也會將要求自動導向健康狀態良好的機器,保持整個系統順暢運作。
學習內容
- 瞭解內部負載平衡器的組成元件。
- 建立一組後端機器 (質數計算機)。
- 設定內部負載平衡器,將內部流量導向後端機器。
- 從其他內部機器測試內部負載平衡器。
- 設定對外公開的網路伺服器,透過內部負載平衡器取得內部「質數計算機」服務的計算結果。
先備知識
- 熟悉 Google Cloud Compute Engine 的基本概念:瞭解什麼是虛擬機器 (VM) 執行個體。
- 瞭解網路基本概念:知道什麼是 IP 位址。
- 具備基本的 Unix/Linux 指令列操作知識:瞭解如何在終端機輸入指令。
- 對虛擬私有雲有初步的瞭解:知道 Google Cloud 資源位於私人網路中。
設定和需求
瞭解以下事項後,再點選「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/region {{{project_0.default_region | Region}}}
gcloud config set compute/zone {{{project_0.default_zone | Zone}}}
- 建立區域的變數:
export REGION={{{project_0.default_region | Region}}}
- 建立可用區的變數:
export ZONE={{{project_0.default_zone | Zone}}}
詳情請參閱區域和可用區說明文件。
注意:如果在自己的機器上執行 gcloud
,各個工作階段都會保留這些設定,但如果在 Cloud Shell 中,每次啟動新工作階段或重新連線時,都必須進行這項設定。
工作 1:建立虛擬環境
虛擬環境有助於確保專案軟體井然有序,且執行程式碼時一律使用所需工具的特定版本。
Python 虛擬環境可用來獨立安裝套件,將其與系統區隔開來。
- 安裝
virtualenv
環境:
sudo apt-get install -y virtualenv
- 建構虛擬環境:
python3 -m venv venv
- 啟用虛擬環境:
source venv/bin/activate
工作 2:建立後端代管執行個體群組
透過「代管執行個體群組」,Google Cloud 可自動為服務建立及維護多個相同的副本。如果其中一個副本故障,Google Cloud 就會加以替換,藉此提升服務的可靠性。
建立開機指令碼
這個指令碼就像一組指示,群組中的每個新 VM 啟動時都會按照這些指示運作。我們的指令碼會包含以 Python 編寫的小型網路伺服器,功能是判斷某個數字是否為質數,是的話會傳回 True,不是則傳回 False。
- 首先,在主目錄中建立
backend.sh
指令碼:
touch ~/backend.sh
- 點選 Cloud Shell 頂端的「開啟編輯器」圖示。如果出現提示訊息,請點選「在新視窗中開啟」。

注意:如果沒有看到「程式碼編輯器」圖示,請點選「導覽選單」圖示,關閉左側面板。
啟動程式碼編輯器後,Cloud Shell 會移至新視窗,並開啟程式碼編輯器。幾秒後,工作區就會出現在畫面上。
-
在左側窗格中選取 backend.sh
檔案。
-
接著,在右側的編輯器中加入下列指令碼:
sudo chmod -R 777 /usr/local/sbin/
sudo cat << EOF > /usr/local/sbin/serveprimes.py
import http.server
def is_prime(a): return a!=1 and all(a % i for i in range(2,int(a**0.5)+1))
class myHandler(http.server.BaseHTTPRequestHandler):
def do_GET(s):
s.send_response(200)
s.send_header("Content-type", "text/plain")
s.end_headers()
s.wfile.write(bytes(str(is_prime(int(s.path[1:]))).encode('utf-8')))
http.server.HTTPServer(("",80),myHandler).serve_forever()
EOF
nohup python3 /usr/local/sbin/serveprimes.py >/dev/null 2>&1 &
- 依序點選「File」>「Save」。
建立執行個體範本
- 在 Cloud Shell 的工具列中點選「開啟終端機」,然後輸入下列指令,建立執行個體範本
primecalc
:
gcloud compute instance-templates create primecalc \
--metadata-from-file startup-script=backend.sh \
--no-address --tags backend --machine-type=e2-medium
以上是後端 VM 的「設定藍圖」。請注意,其中包含 --no-address
,代表這些後端 VM 出於安全性,將無法存取公開網際網路。
開啟防火牆
您必須建立防火牆規則,允許通訊埠 80 的流量 (標準 HTTP 流量) 進入後端 VM。這項設定非常重要,完成後,內部應用程式負載平衡器和健康狀態檢查功能才能與後端 VM 通訊。
- 設定防火牆,開放通訊埠
80
的流量進入:
gcloud compute firewall-rules create http --network default --allow=tcp:80 \
--source-ranges {{{project_0.startup_script.selected_cidr | IP}}} --target-tags backend
請點選下方的「Check my progress」,確認您順利完成本實驗室的相關操作。
建立執行個體範本,並開啟防火牆允許通訊埠 80 的流量
建立執行個體群組
- 接著,建立代管執行個體群組
backend
,執行個體數量先指定為 3 個:
gcloud compute instance-groups managed create backend \
--size 3 \
--template primecalc \
--zone $ZONE
- 指令執行完畢後,請回到控制台分頁,接著前往「Compute Engine」>「VM 執行個體」。現在應該會看到執行個體群組建立了三個後端 VM。

後端現在已可處理流量。
請點選下方的「Check my progress」,確認您順利完成本實驗室的相關操作。
建立執行個體群組
工作 3:設定內部負載平衡器
接下來要為內部服務建立單一私人 VIP 入口。有了這個入口,其他內部應用程式就能穩定地連至「質數計算機」,不必知道哪個後端 VM 可用或在運作中。現在來設定內部負載平衡器,並連至剛才建立的執行個體群組。
內部負載平衡器包含三個主要部分:
- 轉送規則:這是實際的私人 IP 位址,負責接收其他內部服務傳送的要求,並將流量「轉送」至後端服務。
- 後端服務:定義負載平衡器如何將流量分配給 VM 執行個體,也包含健康檢查。
- 健康狀態檢查:這種持續性的檢查機制會監控後端 VM 的「健康狀態」。負載平衡器只會將流量傳送至通過健康狀態檢查的機器,確保服務隨時可以使用。
下圖顯示如何使用各可用區內後端群組中的多個執行個體,達到負載平衡。

建立健康狀態檢查
- 為確保負載平衡器只會將流量傳送至健康狀態良好的執行個體,必須執行健康檢查。您的後端服務是 HTTP 伺服器,因此請檢查存取特定網址路徑時 (在本例中為
/2
,用來確認 2 是否為質數),系統是否會傳回「200 OK」:
gcloud compute health-checks create http ilb-health --request-path /2
由於提供的是 HTTP 服務,因此請檢查存取特定網址路徑時 (在本例中為 /2
,用來確認 2 是否為質數),系統是否會填入「200」回應:
建立後端服務
- 接著,建立後端服務
prime-service
:
gcloud compute backend-services create prime-service \
--load-balancing-scheme internal --region=$REGION \
--protocol tcp --health-checks ilb-health
這項服務會將健康狀態檢查連至執行個體群組。
將執行個體群組新增至後端服務
- 將後端執行個體群組連至 prime-service 後端服務,讓負載平衡器知道應管理哪些機器:
gcloud compute backend-services add-backend prime-service \
--instance-group backend --instance-group-zone=$ZONE \
--region=$REGION
建立轉送規則
- 最後,建立轉送規則
prime-lb
,並指定靜態 IP 位址 :
gcloud compute forwarding-rules create prime-lb \
--load-balancing-scheme internal \
--ports 80 --network default \
--region=$REGION --address {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}} \
--backend-service prime-service
內部「質數計算」服務現已完成所有設定,可透過內部 IP 位址查詢。
請點選下方的「Check my progress」,確認您順利完成本實驗室的相關操作。
設定內部負載平衡器
工作 4:測試負載平衡器
這個步驟非常重要,可確認內部應用程式負載平衡器是否正確將流量導向後端服務。如果是的話,就表示其他內部應用程式現在可透過單一穩定的 IP 位址,穩定地連至服務,確保系統持續運作。
為了測試負載平衡器,您必須在內部應用程式負載平衡器所在的網路中,建立新的 VM 執行個體。該 VM 只能在私有雲網路內存取,無法直接從 Cloud Shell (位於這個特定網路外) 存取。
- 在 Cloud Shell 使用
gcloud
,建立簡單的測試執行個體:
gcloud compute instances create testinstance \
--machine-type=e2-standard-2 --zone $ZONE
- 然後透過 SSH 連至該執行個體:
gcloud compute ssh testinstance --zone $ZONE
如果出現提示訊息,請輸入 Y 並按兩次 Enter 鍵來繼續操作。
對負載平衡器執行查詢
- 在測試執行個體中,使用
curl
向內部應用程式負載平衡器的 IP 位址發送查詢要求,確認幾個數字是否為質數:
curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/2
curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/4
curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/5
系統會直接在指令列旁輸出結果,顯示 True 或 False,如下所示:
user@testinstance:~$ curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/2
Trueuser@testinstance:~$ curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/4
Falseuser@testinstance:~$ curl {{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/5
Trueuser@testinstance:~$ exit
您應該會看到系統判斷正確,指出 2 和 5 為質數,而 4 不是,這表示內部應用程式負載平衡器運作正常,在收到要求後,成功將要求轉送至其中一個後端「質數計算」VM。
服務提供正確的回應:2 和 5 是質數,但 4 不是。
- 離開測試執行個體:
exit
- 接著刪除該執行個體 (因為已不再需要):
gcloud compute instances delete testinstance --zone=$ZONE
- 輸入 Y 確認刪除。
工作 5:建立對外公開的網路伺服器
接下來,您可以透過這個工作,瞭解對外公開的應用程式 (如網站) 如何使用內部服務。您將建立對外公開的網路伺服器,使用內部「質數計算機」服務 (透過內部應用程式負載平衡器) 來顯示質數矩陣。
- 首先,在主目錄中為這個對外公開的「前端」建立開機指令碼:
touch ~/frontend.sh
- 程式碼編輯器應該仍處於開啟狀態。如果沒有,請在殼層中選取「程式碼編輯器」,啟動該編輯器:

幾秒後,工作區就會出現在畫面上。
- 接著,在右側的編輯器中加入下列指令碼:
sudo chmod -R 777 /usr/local/sbin/
sudo cat << EOF > /usr/local/sbin/getprimes.py
import urllib.request
from multiprocessing.dummy import Pool as ThreadPool
import http.server
PREFIX="http://{{{project_0.startup_script.selected_forwarding_rule_cidr | IP}}}/" #HTTP Load Balancer
def get_url(number):
return urllib.request.urlopen(PREFIX+str(number)).read().decode('utf-8')
class myHandler(http.server.BaseHTTPRequestHandler):
def do_GET(s):
s.send_response(200)
s.send_header("Content-type", "text/html")
s.end_headers()
i = int(s.path[1:]) if (len(s.path)>1) else 1
s.wfile.write("<html><body><table>".encode('utf-8'))
pool = ThreadPool(10)
results = pool.map(get_url,range(i,i+100))
for x in range(0,100):
if not (x % 10): s.wfile.write("<tr>".encode('utf-8'))
if results[x]=="True":
s.wfile.write("<td bgcolor='#00ff00'>".encode('utf-8'))
else:
s.wfile.write("<td bgcolor='#ff0000'>".encode('utf-8'))
s.wfile.write(str(x+i).encode('utf-8')+"</td> ".encode('utf-8'))
if not ((x+1) % 10): s.wfile.write("</tr>".encode('utf-8'))
s.wfile.write("</table></body></html>".encode('utf-8'))
http.server.HTTPServer(("",80),myHandler).serve_forever()
EOF
nohup python3 /usr/local/sbin/getprimes.py >/dev/null 2>&1 &
- 依序點選「File」>「Save」。
建立前端執行個體
- 在 Cloud Shell,建立執行個體
frontend
來執行這個網路伺服器:
gcloud compute instances create frontend --zone=$ZONE \
--metadata-from-file startup-script=frontend.sh \
--tags frontend --machine-type=e2-standard-2
開啟前端的防火牆
- 這是對外公開的伺服器,因此您必須開啟防火牆,允許來自網際網路上任何位置 (0.0.0.0/0) 的流量通過通訊埠 80:
gcloud compute firewall-rules create http2 --network default --allow=tcp:80 \
--source-ranges 0.0.0.0/0 --target-tags frontend
-
依序點選「導覽選單」圖示 >「Compute Engine」>「VM 執行個體」。如果沒有看到 frontend
執行個體,請重新整理瀏覽器。
-
在瀏覽器中開啟前端的外部 IP:

您應該會看到一個矩陣 (如下所示),其中顯示 100 以內的所有質數並以綠色標示:

- 試著在路徑中加入數字,例如 http://your-ip/10000,查看從該數字開始的所有質數。

注意:範例開機指令碼並未有效計算質數,也未套用錯誤偵測或修正演算法。如果在路徑中加入過大的數字,會導致服務逾時。
請點選下方的「Check my progress」,確認您順利完成本實驗室的相關操作。
建立對外公開的網路伺服器
恭喜!
您已成功使用 Google Cloud 的內部應用程式負載平衡器,建構可靠的內部服務,並實際驗證公開應用程式如何安全地運用這項服務。
後續步驟/瞭解詳情
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2025 年 7 月 18 日
實驗室上次測試日期:2025 年 7 月 18 日
Copyright 2025 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。