1

GCP 平台架構

🌩️ 雲端運算基本概念

雲端運算是透過網際網路提供運算資源的服務模式,使用者不需購買實體硬體,而是以「租用」方式使用資料中心的資源。

雲端運算的三種服務模式

1. IaaS(Infrastructure as a Service)基礎架構即服務

  • 提供虛擬機、儲存、網路等基礎資源
  • 使用者管理作業系統與應用程式
  • 範例:GCP Compute Engine、Cloud Storage

2. PaaS(Platform as a Service)平台即服務

  • 提供應用程式執行環境
  • 使用者只需部署程式碼,不需管理底層基礎架構
  • 範例:GCP App Engine、Cloud Run

3. SaaS(Software as a Service)軟體即服務

  • 提供完整的應用程式
  • 使用者透過瀏覽器直接使用
  • 範例:Gmail、Google Workspace

🗺️ GCP 服務分類地圖

GCP 提供超過 100 項服務,可分為以下核心類別:

  • 運算服務:Compute Engine(虛擬機)、GKE(Kubernetes 叢集)、Cloud Run(容器服務)
  • 儲存服務:Cloud Storage(物件儲存)、Persistent Disk(永久磁碟)
  • 網路服務:VPC(虛擬私有雲)、Load Balancing(負載平衡)
  • 資料庫服務:Cloud SQL(關聯式資料庫)、Firestore(NoSQL 文件資料庫)
  • 管理工具:IAM(身分與存取管理)、Cloud Monitoring(監控服務)

🏗️ 專案與資源層級結構

GCP 使用階層式結構組織資源,確保權限管理與計費的清晰性:

組織(Organization)
└── 資料夾(Folder)- 可選,用於分組
    └── 專案(Project)
        └── 資源(Resources)
            ├── Compute Engine 執行個體
            ├── Cloud Storage 貯體
            └── 其他服務資源

專案(Project)的三個重要屬性

  1. 專案 ID:全球唯一識別碼,建立後無法更改
    • 格式:小寫字母、數字、連字號
    • 範例:my-first-gcp-project-123
  2. 專案名稱:可讀的顯示名稱,可隨時更改
    • 範例:「開發環境」、「生產環境」
  3. 專案編號:系統自動產生的數字 ID
    • 範例:123456789012
💡 最佳實踐 建議依照環境(開發/測試/生產)或團隊建立不同專案,避免資源混用與權限混亂。

🌍 區域與可用區

GCP 的實體基礎設施分布於全球多個地理位置,理解這些概念有助於設計高可用性架構。

Region(區域)

  • 指特定的地理位置,例如 asia-east1(台灣彰化)
  • 每個 Region 包含多個 Zone
  • 跨 Region 部署可實現災難復原

Zone(可用區)

  • Region 內的獨立資料中心,例如 asia-east1-a
  • 同一 Region 內的 Zone 間網路延遲極低
  • 跨 Zone 部署可防止單點故障
🎯 選擇建議 台灣用戶建議選擇 asia-east1(台灣)或 asia-northeast1(日本東京),延遲最低。
🎯
測驗 1
檢驗你的理解
以下哪個服務屬於 PaaS(Platform as a Service)?
  • A. Compute Engine
  • B. Cloud Run
  • C. Cloud Storage
  • D. Gmail
2

專案與權限管理

🎓 IAM(Identity and Access Management)核心概念

IAM 是 GCP 的權限管理系統,透過「誰(Who)」、「能做什麼(Can do what)」、「在哪裡(On which resource)」的模型控制存取權限。

IAM 的三個核心元素

1. 成員(Member)

  • Google 帳戶:user:alice@example.com
  • 服務帳戶:serviceAccount:my-app@project.iam.gserviceaccount.com
  • Google 群組:group:admins@example.com
  • 所有使用者:allUsers

2. 角色(Role)

  • 基本角色(Basic Roles):Owner、Editor、Viewer(不建議使用)
  • 預先定義角色(Predefined Roles):例如:roles/compute.instanceAdmin
  • 自訂角色(Custom Roles):依需求組合特定權限(企業級功能)

3. 資源(Resource)

  • 專案、虛擬機、Storage Bucket 等 GCP 資源
  • 權限可在不同層級設定(組織 → 資料夾 → 專案 → 資源)
⚠️ 安全警告 避免使用 Owner 或 Editor 等基本角色,應使用最小權限原則(Principle of Least Privilege),僅授予完成工作所需的最小權限。

🔑 服務帳戶(Service Account)

服務帳戶是專為應用程式或虛擬機設計的特殊帳戶,讓應用程式能安全地存取 GCP 資源。

服務帳戶的兩種用途

  1. Compute Engine 預設身分:讓 VM 執行個體自動取得存取其他服務的權限
  2. 應用程式身分驗證:透過金鑰檔案讓外部應用程式存取 GCP

建立服務帳戶最佳實踐

  • 依照服務功能建立專用服務帳戶(不要共用)
  • 僅授予必要的最小權限
  • 啟用金鑰輪替機制(定期更新金鑰)
  • 避免下載 JSON 金鑰檔案(優先使用 Workload Identity 或 ADC)
💡 安全提示 在 Compute Engine 上運行的應用程式,優先使用「附加服務帳戶」而非下載金鑰檔案。

👥 團隊協作權限設定

以下是常見角色的使用場景:

角色 適用對象 權限範圍
roles/owner 專案管理員 完整控制(含計費與 IAM)
roles/compute.admin 運算資源管理員 管理 VM、磁碟、網路
roles/compute.viewer 稽核人員、觀察者 僅檢視資源(無法修改)
roles/iam.serviceAccountUser 應用程式部署者 使用服務帳戶執行資源
🎯
測驗 2
檢驗你的理解
GCP 專案 ID 的特性,以下何者正確?
  • A. 可以隨時更改
  • B. 全球唯一且無法更改
  • C. 可以包含大寫字母
  • D. 長度不限
🎯
測驗 3
檢驗你的理解
應用程式需要從 Compute Engine VM 上傳檔案到 Cloud Storage,最安全的做法是?
  • A. 下載服務帳戶的 JSON 金鑰檔案到 VM
  • B. 將服務帳戶附加到 VM,並授予 Storage 寫入權限
  • C. 使用環境變數儲存 API 金鑰
  • D. 授予 VM 的服務帳戶 Owner 角色
3

Compute Engine 基礎

💻 Compute Engine 簡介

Compute Engine 是 GCP 的 IaaS 運算服務,提供可自訂的虛擬機器(VM),讓你能完全控制作業系統、網路設定與應用程式環境。

核心功能

  • 預先定義與自訂機器類型:從微型到高效能皆可選擇
  • 多種作業系統支援:Ubuntu、Debian、CentOS、Windows Server 等
  • 永久磁碟(Persistent Disk):資料獨立於 VM 生命週期,可隨時掛載與分離
  • 自動擴展與負載平衡:彈性應對流量變化
✅ 適用場景 需要完整控制作業系統、安裝特定軟體、或需要 GPU 加速運算的應用程式,適合使用 Compute Engine。

🖥️ Machine Type(機器類型)選擇

GCP 提供多種預定義的機器類型,依據 CPU、記憶體特性分為不同系列:

N 系列:通用工作負載(最常用)

  • N2 / N2D:平衡的 CPU 與記憶體,適合 Web 服務、小型資料庫
  • E2:成本最佳化,適合開發環境、批次處理(CPU 效能較低)

C 系列:運算最佳化

  • 高 CPU 效能,適合運算密集型應用(如遊戲伺服器、影片轉檔)

M 系列:記憶體最佳化

  • 高記憶體配置,適合記憶體內資料庫(如 Redis)、大數據分析

命名規則範例

e2-micro:E2 系列,極小型(0.25-2 vCPU, 1 GB RAM)
n2-standard-2:N2 系列,標準型,2 個 vCPU
n2-highmem-4:N2 系列,高記憶體型,4 個 vCPU
💡 選擇建議 初學測試可使用 e2-micro(免費方案配額),生產環境建議 e2-mediumn2-standard-2 起跳。

💾 磁碟類型與特性

Compute Engine 提供多種儲存選項,依效能與成本分為:

1. 標準永久磁碟(Standard Persistent Disk, pd-standard)

  • 💰 成本最低:$0.040 / GB / 月
  • 📊 適用場景:大型循序讀寫、批次處理、備份資料
  • 💿 IOPS:適中(約 0.75 IOPS / GB)

2. 平衡永久磁碟(Balanced Persistent Disk, pd-balanced)

  • 💰 價格:$0.100 / GB / 月
  • 📊 適用場景:一般用途工作負載(推薦選項)
  • ⚡ IOPS:良好(6 IOPS / GB)

3. SSD 永久磁碟(SSD Persistent Disk, pd-ssd)

  • 💰 價格:$0.170 / GB / 月
  • 📊 適用場景:資料庫、高 I/O 應用
  • 🚀 IOPS:最高(30 IOPS / GB)

4. 本機 SSD(Local SSD)

  • 💾 特性:物理連接到 VM 主機,極高效能
  • ⚠️ 重要:VM 刪除或停止時資料會消失(非永久性)
  • 📊 適用場景:暫存快取、批次運算中繼資料
⚠️ 重點提醒 除非有特殊性能需求,否則建議使用 pd-balanced,兼顧性能與成本。資料庫類應用可考慮 pd-ssd

🌐 網路與防火牆

VPC(Virtual Private Cloud)網路

每個 GCP 專案預設有一個 VPC 網路,提供:

  • 私有 IP 位址空間(10.x.x.x, 172.x.x.x, 192.168.x.x)
  • 子網路(Subnet):依 Region 劃分
  • 內部 DNS 解析

外部 IP 位址

  • 臨時(Ephemeral)IP:VM 停止後會釋放,重新啟動時更換
  • 靜態(Static)IP:保留的固定 IP,持續計費(即使未使用)

防火牆規則

GCP 預設拒絕所有外部流量,需明確建立規則:

  • 預設規則:允許內部 VPC 流量、ICMP、SSH(port 22)
  • 自訂規則範例:開放 HTTP (80)、HTTPS (443)、自訂 port
# 建立防火牆規則(允許 HTTP 流量)
gcloud compute firewall-rules create allow-http \
  --allow tcp:80 \
  --source-ranges 0.0.0.0/0 \
  --target-tags http-server
🔒 安全建議 使用網路標記(tags)管理防火牆規則,而非 IP 位址,更容易維護與擴展。避免開放 0.0.0.0/0 的 SSH 存取,限制特定來源 IP。
🎯
測驗 4
檢驗你的理解
一個小型 Web 應用程式需要部署到 GCP,預算有限且流量不大,應選擇哪種 Machine Type?
  • A. e2-medium
  • B. c2-standard-4
  • C. m2-ultramem-208
  • D. n2d-highmem-8
4

虛擬機實作操作

🚀 建立第一台虛擬機

透過 Google Cloud Console 建立 VM 的完整步驟:

  1. 前往 Compute Engine → VM instances
    • 如果是首次使用,會提示啟用 Compute Engine API(約需 1-2 分鐘)
  2. 點選「CREATE INSTANCE
  3. 配置基本設定:
    • Name:例如 web-server-01
    • Region/Zone:選擇 asia-east1-a(台灣)
    • Machine type:選擇 e2-medium(2 vCPU, 4 GB RAM)
  4. 配置開機磁碟:
    • 點選「Boot disk」→「CHANGE」
    • 作業系統:選擇 Ubuntu 22.04 LTS(推薦)或 Debian
    • Boot disk type:選擇 Balanced persistent disk
    • Size:預設 10 GB(可依需求調整)
  5. 設定防火牆:
    • 勾選「Allow HTTP traffic
    • 勾選「Allow HTTPS traffic」(如需 SSL)
  6. (選用)進階設定:
    • Management → Startup script:可填入初始化腳本
    • Networking → Network tags:例如 web-server(用於防火牆規則)
  7. 點選「CREATE」,等待 VM 啟動(約 30-60 秒)
✅ 成功指標 VM 狀態顯示綠色勾號,External IP 欄位顯示公開 IP 位址,即表示建立成功。

🔌 連線到虛擬機

GCP 提供多種 SSH 連線方式:

方法 1:瀏覽器 SSH(最簡單)

  • 在 VM instances 頁面,點選 VM 右側的「SSH」按鈕
  • 瀏覽器會開啟新視窗直接連線(無需金鑰設定)

方法 2:gcloud CLI

# 透過 gcloud 連線
gcloud compute ssh web-server-01 \
  --zone=asia-east1-a

方法 3:本機 SSH 工具(進階)

# 產生 SSH 金鑰
ssh-keygen -t rsa -b 2048 -C "your-email@example.com"

# 將公鑰上傳到 VM(透過 Metadata)
# 然後使用標準 SSH 連線
ssh -i ~/.ssh/id_rsa username@EXTERNAL_IP
💡 初學建議 優先使用瀏覽器 SSH,無需處理金鑰管理,且自動設定必要的防火牆規則。

📦 部署 Web 服務範例

連線到 VM 後,安裝 Nginx 並部署簡單網頁:

步驟 1:更新系統與安裝 Nginx

# 更新套件清單
sudo apt update

# 安裝 Nginx
sudo apt install nginx -y

# 啟動 Nginx
sudo systemctl start nginx
sudo systemctl enable nginx

步驟 2:建立自訂網頁

# 編輯網頁內容
sudo nano /var/www/html/index.html

貼上以下 HTML 內容:

<!DOCTYPE html>
<html lang="zh-TW">
<head>
  <meta charset="UTF-8">
  <title>我的第一台 GCP VM</title>
  <style>
    body { font-family: sans-serif; text-align: center; padding: 50px; }
    h1 { color: #fb8500; }
  </style>
</head>
<body>
  <h1>🎉 成功部署!</h1>
  <p>這是運行在 Google Cloud Platform 的 Compute Engine</p>
</body>
</html>

步驟 3:驗證服務

  • 在 VM instances 頁面複製 External IP
  • 在瀏覽器開啟 http://EXTERNAL_IP
  • 應該會看到你的自訂網頁
🎊 恭喜! 你已成功在 GCP 上部署第一個 Web 服務。接下來可以嘗試加上 SSL、連接資料庫等進階功能。

🛑 管理虛擬機生命週期

停止 VM(Stop)

  • 保留磁碟與資料,但停止 CPU 計費
  • 磁碟仍會計費(每月約 $0.1/GB)
  • 臨時 IP 會被釋放
gcloud compute instances stop web-server-01 --zone=asia-east1-a

刪除 VM(Delete)

  • 完全移除 VM 與開機磁碟
  • 資料將永久遺失(除非磁碟設為「不隨 VM 刪除」)
gcloud compute instances delete web-server-01 --zone=asia-east1-a

重新啟動 VM(Reboot)

sudo reboot
⚠️ 成本提醒 即使停止 VM,磁碟仍會計費。若長期不使用,建議建立映像檔(Image)備份後刪除 VM。
🎯
測驗 5
檢驗你的理解
建立 VM 時勾選了「Allow HTTP traffic」,但瀏覽器無法存取 http://EXTERNAL_IP,最可能的原因是?
  • A. 需要先設定 VPN
  • B. VM 內部沒有安裝/啟動 Web 伺服器(如 Nginx)
  • C. 必須使用 HTTPS 才能存取
  • D. 需要建立額外的 outbound 規則
5

資源管理與成本控制

💰 成本結構與計費方式

Compute Engine 的成本主要包含以下項目:

1. 運算資源(vCPU + RAM)

  • 按秒計費,最少計費 1 分鐘
  • 價格隨機器類型不同:
    • e2-medium:約 $24.27/月(以 us-central1 為例,asia-east1 略高)
    • n2-standard-2:約 $48.54/月

2. 磁碟儲存

  • pd-standard:$0.040/GB/月(100 GB = $4/月)
  • pd-balanced:$0.100/GB/月(100 GB = $10/月)
  • pd-ssd:$0.170/GB/月(100 GB = $17/月)

3. 網路流量

  • 輸入流量(Ingress):免費
  • 輸出流量(Egress):到網際網路 $0.12/GB(超過 1GB 後計費)
  • 同 Zone 內部流量:免費(VM 間傳輸不計費)

4. 外部 IP 位址

  • 使用中的臨時 IP:免費
  • 閒置的靜態 IP:$0.010/小時(每月約 $7.20,未分配給運行中的 VM)
💡 計算範例 1 台 e2-medium + 50GB pd-balanced + 靜態 IP(使用中)= $24.27 (VM) + $5 (磁碟) = 約 $29.27/月

📉 成本優化策略

1. 使用持續使用折扣(Sustained Use Discounts)

  • 每月使用超過 25% 時間自動獲得折扣
  • 最高可達 30% 折扣(運行整月)
  • 無需任何設定,自動套用

2. 承諾使用折扣(Committed Use Discounts)

  • 承諾 1 年或 3 年使用,可獲得 37-55% 折扣
  • 適合長期穩定運行的生產環境

3. 可先佔 VM(Preemptible VM / Spot VM)

  • 價格僅約 20-30% 原價(大幅節省成本)
  • GCP 可隨時中斷(最長運行 24 小時)
  • 適合批次處理、容錯應用
# 建立可先佔 VM
gcloud compute instances create preemptible-worker \
  --zone=asia-east1-a \
  --machine-type=e2-medium \
  --preemptible

4. 右調整機器大小(Rightsizing)

  • 使用 Cloud Monitoring 監控資源使用率
  • 若 CPU 使用率長期低於 30%,考慮降級機器類型
  • GCP 會自動提供 Rightsizing 建議

5. 閒置資源管理

  • 刪除未使用的靜態 IP(避免閒置費用)
  • 移除未掛載的磁碟(Orphaned Disks)
  • 停止開發/測試環境的 VM(下班時間)
💰 節省案例 某公司將開發環境 VM 改為「工作日 9:00-18:00 自動啟停」,每月節省約 60% 成本。

🔔 預算警示設定

避免意外超支,建議設定預算警示:

  1. 前往 Billing → Budgets & alerts
  2. 點選「CREATE BUDGET」
  3. 設定預算金額(例如:$100/月)
  4. 設定警示門檻:
    • 50% 時發送 Email 警告
    • 90% 時發送緊急通知
    • 100% 時發送最終警告
  5. (進階)串接 Cloud Functions 自動停止資源
⚠️ 重要提醒 預算警示不會自動停止資源,僅發送通知。若要自動控制,需搭配 Cloud Functions 或 Pub/Sub 腳本。

📊 成本追蹤與報表

檢視帳單詳情

  • 前往 Billing → Cost table 查看每日成本明細
  • 可依專案、服務(Compute Engine、Storage)、SKU 篩選

匯出帳單資料

  • 設定「Billing export to BigQuery」
  • 可進行自訂分析、建立儀表板、預測成本趨勢

使用標籤(Labels)分類資源

# 為 VM 加上標籤
gcloud compute instances add-labels web-server-01 \
  --zone=asia-east1-a \
  --labels=env=production,team=backend

標籤會出現在帳單報表中,方便成本歸屬(例如:依團隊、環境分攤)。

🎯 最佳實踐 為所有資源加上 env(environment)、owner(負責人)、cost-center(成本中心)標籤,便於成本管理。
🎯
測驗 6
檢驗你的理解
以下哪種方式無法有效降低 Compute Engine 成本?
  • A. 使用 Preemptible VM(可先佔虛擬機)
  • B. 購買 Committed Use Discounts(承諾使用折扣)
  • C. 將磁碟從 pd-standard 升級到 pd-ssd
  • D. 根據使用率降級機器類型(Rightsizing)
6

整合實作練習

🎯 實作挑戰:建立完整的 Web 專案

將本單元所學整合起來,建立一個具備 IAM 權限管理、自動化部署的 Web 專案。

專案需求

  • 使用 Compute Engine 部署一台 Web 伺服器
  • 設定自訂防火牆規則(只允許 HTTP/HTTPS)
  • 使用服務帳戶授予必要權限
  • 透過 Startup Script 自動安裝 Nginx
  • 設定預算警示(例如:$50/月)

📝 實作步驟

步驟 1:建立服務帳戶

# 建立服務帳戶
gcloud iam service-accounts create web-server-sa \
  --display-name="Web Server Service Account"

# 授予 Logging 寫入權限(用於寫入日誌)
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="serviceAccount:web-server-sa@PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/logging.logWriter"

步驟 2:準備 Startup Script

建立檔案 startup-script.sh

#!/bin/bash

# 更新系統
apt update
apt install -y nginx

# 建立自訂網頁
cat <<EOF > /var/www/html/index.html
<!DOCTYPE html>
<html lang="zh-TW">
<head>
  <meta charset="UTF-8">
  <title>GCP 實作專案</title>
  <style>
    body { font-family: Arial, sans-serif; text-align: center; padding-top: 100px; }
    h1 { color: #fb8500; font-size: 3rem; }
    p { font-size: 1.2rem; color: #023047; }
  </style>
</head>
<body>
  <h1>🚀 GCP 專案已上線</h1>
  <p>主機名稱: \$(hostname)</p>
  <p>運行於 Google Cloud Platform Compute Engine</p>
</body>
</html>
EOF

# 啟動 Nginx
systemctl start nginx
systemctl enable nginx

# 寫入日誌(驗證服務帳戶權限)
echo "Web server initialized at \$(date)" | logger -t startup-script

步驟 3:建立 VM with Startup Script

gcloud compute instances create web-server-prod \
  --zone=asia-east1-a \
  --machine-type=e2-medium \
  --boot-disk-size=20GB \
  --boot-disk-type=pd-balanced \
  --image-family=ubuntu-2204-lts \
  --image-project=ubuntu-os-cloud \
  --service-account=web-server-sa@PROJECT_ID.iam.gserviceaccount.com \
  --scopes=https://www.googleapis.com/auth/logging.write \
  --tags=web-server \
  --metadata-from-file=startup-script=startup-script.sh

步驟 4:建立防火牆規則

# 允許 HTTP (port 80)
gcloud compute firewall-rules create allow-http-web \
  --allow tcp:80 \
  --source-ranges 0.0.0.0/0 \
  --target-tags web-server

# 允許 HTTPS (port 443)
gcloud compute firewall-rules create allow-https-web \
  --allow tcp:443 \
  --source-ranges 0.0.0.0/0 \
  --target-tags web-server

步驟 5:驗證部署

  • 取得 External IP:
    gcloud compute instances describe web-server-prod \
      --zone=asia-east1-a \
      --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
  • 在瀏覽器開啟 http://EXTERNAL_IP
  • 確認網頁顯示主機名稱與「GCP 專案已上線」訊息
  • 檢查日誌(驗證服務帳戶權限):
    gcloud logging read "resource.type=gce_instance AND logName=projects/PROJECT_ID/logs/startup-script" \
      --limit 5 \
      --format json
🎉 專案完成! 你已建立一個具備自動化部署、IAM 權限管理、日誌記錄的完整 Web 專案。

🚀 進階挑戰

完成基礎實作後,可嘗試以下進階功能:

挑戰 1:設定靜態 IP

# 保留靜態 IP
gcloud compute addresses create web-static-ip \
  --region=asia-east1

# 將靜態 IP 附加到 VM
gcloud compute instances delete-access-config web-server-prod \
  --zone=asia-east1-a \
  --access-config-name="external-nat"

gcloud compute instances add-access-config web-server-prod \
  --zone=asia-east1-a \
  --access-config-name="external-nat" \
  --address=WEB_STATIC_IP

挑戰 2:建立自訂映像檔(Image)

# 建立映像檔(用於快速複製 VM)
gcloud compute images create web-server-image \
  --source-disk=web-server-prod \
  --source-disk-zone=asia-east1-a \
  --family=web-servers

# 使用映像檔建立新 VM
gcloud compute instances create web-server-clone \
  --zone=asia-east1-b \
  --machine-type=e2-medium \
  --image=web-server-image

挑戰 3:設定 Instance Template + Managed Instance Group

  • 建立 Instance Template(VM 範本)
  • 建立 Managed Instance Group(自動擴展群組)
  • 設定 Load Balancer(負載平衡器)
  • 實現自動擴展與高可用性架構
💡 學習路徑 Instance Template 和 Managed Instance Group 會在 Unit 04 詳細介紹,現在可先嘗試基礎操作。
🎓

恭喜完成 Unit 01!

你已掌握 GCP 基礎架構與 Compute Engine 核心技能

6
章節完成
6
測驗通過
3
學習時數

你已學會:

  • ✅ 理解 GCP 平台架構與服務分類
  • ✅ 掌握 IAM 權限管理與服務帳戶
  • ✅ 建立並管理 Compute Engine 虛擬機
  • ✅ 設定網路與防火牆規則
  • ✅ 部署 Web 服務與自動化腳本
  • ✅ 實施成本優化與預算控制
繼續 Unit 02:資料儲存基礎 →