理解 Google Cloud 上的無伺服器 (Serverless)
在現代雲端開發中,「無伺服器」(Serverless) 是一個核心概念。它並不代表沒有伺服器,而是代表開發者不需要管理伺服器。對於 Associate Cloud Engineer (ACE) 來說,理解 Cloud Run 和 App Engine 的區別以及各自的適用場景,是通過考試的關鍵。
GCP 的 Serverless 產品提供了極高的彈性,可以實現「自動縮放到零」(Scale to Zero),這意味著如果沒有流量,你就不需要付費(除了儲存空間)。
白話文解釋
1. 廚房外送服務 (瑞士刀類比)
- App Engine Standard: 像是在一家預設好所有廚具的連鎖廚房(如麥當勞)。你只能用他們提供的鍋鏟和烤箱(特定的語言執行環境),但出餐速度極快且標準化。
- Cloud Run: 像是一個移動餐車。你可以自己帶任何廚具(容器),只要你的餐車符合標準尺寸(Knative 標準),就可以在任何地方開業。
2. 租屋選擇 (房屋仲介類比)
- Compute Engine (VM): 租一間空屋。你自己買家具、裝冷氣、付水電(手動管理一切)。
- App Engine Flexible: 租一間裝潢好一部分的公寓。你可以換家具(自定義環境),但還是要遵守大樓的一些規定。
- Cloud Run: 住飯店。你帶著行李(容器)進去,住幾天付幾天錢,不用管打掃和維護。
3. 公車與計程車 (交通號誌類比)
- App Engine: 公車系統。路線固定(框架限制),但班次密集且穩定。
- Cloud Run: 計程車。隨叫隨到(按需縮放),你可以去任何地方,只要你坐得進去(打包成容器)。
Cloud Run: 基於容器的無伺服器平台
Cloud Run 是 Google Cloud 最受歡迎的 Serverless 產品,它基於 Knative 開源標準。
Cloud Run 的核心優勢是「執行任何語言」。只要你能將你的應用程式打包成一個 Docker 容器,並讓它在特定連接埠(預設 8080)監聽 HTTP 請求,它就能在 Cloud Run 上執行。 Source ↗
主要特性
- 縮放到零 (Scale to Zero): 當沒有請求時,執行個體數會降到 0,停止計費。
- 並行處理 (Concurrency): 單個執行個體可以同時處理多個請求(與 Cloud Functions 不同,預設並行數可達 1000)。
- 自動 HTTPS: 自動為你提供網址與 SSL 憑證。
ACE 考題只要提到 Cloud Run 或 App Engine 需要存取 private IP 資源(例如沒有 public IP 的 Cloud SQL 執行個體、或內部子網路中的 VM),答案一律是 Serverless VPC Access Connector — 走 public internet 出口行不通,光是設定 service account 也無法打通網路。搭配 Ingress: Internal 設定可以讓服務只能從 VPC 內部或 Load Balancer 進入。
Source ↗
App Engine: 經典的 PaaS
App Engine 是 GCP 最早的產品之一,它是典型的平台即服務 (PaaS)。
標準環境與彈性環境 (Standard vs Flexible Environments)
這是考試中極高頻率的考點。
| 特性 | 標準環境 (Standard Environment) | 彈性環境 (Flexible Environment) |
|---|---|---|
| 啟動速度 | 秒級(極快) | 分鐘級(因為要建立 VM) |
| 擴展性 | 可縮放到零 | 至少保留 1 個執行個體 |
| 執行環境 | 限制特定語言版本 (Java, Go, Python, Node.js) | 任何語言(使用 Docker 容器) |
| 底層架構 | Google 管理的沙箱 (Sandbox) | Compute Engine VM |
| 定價 | 按執行個體執行時間 | 按 VM 資源 (CPU/RAM/磁碟) |
如果你的應用需要快速擴展且使用主流語言,優先選擇標準環境 (Standard);如果你需要安裝特殊的 OS 套件或使用不常見的語言,選擇彈性環境 (Flexible)。 Source ↗
流量管理與拆分 (Traffic Management and Splitting)
Serverless 平台的另一個大優勢是輕鬆進行 A/B 測試 或 藍綠部署 (Blue-Green Deployment)。
Cloud Run 修訂版本 (Revisions)
每次部署都會建立一個不可變的「修訂版本」(Revision)。
- 你可以將 100% 流量導向最新版。
- 也可以將 50% 導向新版,50% 留在舊版進行測試。
App Engine 版本 (Versions)
類似 Cloud Run,App Engine 也可以同時執行多個版本,並在控制台或 CLI 中進行流量分配。
# 在 App Engine 中切換流量
gcloud app services set-traffic [SERVICE] --splits v2=0.5,v1=0.5
gcloud run deploy 上的 --allow-unauthenticated 旗標並不是「預設關閉安全性」這麼單純 — 它實際上是把 roles/run.invoker 角色授予 allUsers,這才是讓公開網址可以被任何人呼叫的原因。如果服務已經公開,光是之後部署時拿掉這個旗標還不夠,你必須額外從 Cloud Run invoker 角色中撤銷 allUsers 的 IAM binding。另外要記得:App Engine Flexible 無法 scale to zero,至少會保留一個執行個體在跑,因此「縮放到零」的答案只能指向 Standard 環境或 Cloud Run。
Source ↗
無伺服器環境中的縮放
Cloud Run 縮放
- 最大執行個體數 (Max Instances): 防止成本失控。
- 最小執行個體數 (Min Instances): 減少「冷啟動」(Cold Start) 延遲。
App Engine 縮放類型
- 自動縮放 (Automatic Scaling): 根據請求延遲、CPU 負載。
- 基本縮放 (Basic Scaling): 執行個體在收到請求時建立,空閒時關閉(僅限標準環境)。
- 手動縮放 (Manual Scaling): 固定執行個體數量。
冷啟動 (Cold Start) 是指當一個新的執行個體被建立以處理第一個請求時所產生的延遲。標準環境的冷啟動通常比彈性環境或 Cloud Run 短得多。 Source ↗
透過 gcloud 部署至 Cloud Run
# 從原始碼直接部署(Google 會自動幫你打包容器)
gcloud run deploy my-service --source .
# 從現有的容器映像檔部署
gcloud run deploy my-service --image gcr.io/my-project/my-app:v1
部署 App Engine 用 gcloud app deploy;部署容器到 Cloud Run 用 gcloud run deploy。Cloud Run 每次部署會建立不可變的 Revision,App Engine 對應的概念是 Version;兩者都能透過 traffic splitting 進行 canary 或 A/B 測試(例如 gcloud app services set-traffic [SERVICE] --splits v2=0.5,v1=0.5)。
Source ↗
在 Cloud Run 與 App Engine 之間做出選擇
考試陷阱:如果題目提到「現有的 Docker 容器」,Cloud Run 通常是首選。如果提到「完全無需管理伺服器且使用 Python/Java 等標準環境」,App Engine 標準環境是不錯的選擇。
- Cloud Run 優勢:更現代、標準化(Knative)、支援任何語言。
- App Engine 優勢:更成熟的整合生態(例如內建的 Cron 工作和任務佇列 Task Queues)。
無伺服器服務的最佳實務
- 保持容器輕量化:減少冷啟動時間。
- 無狀態 (Stateless):Serverless 執行個體隨時可能被銷毀,數據必須儲存在 Cloud Storage 或資料庫中。
- 安全管理金鑰:使用 Secret Manager 而非環境變數來儲存敏感資訊。
- 監控與日誌:使用 Cloud Logging 查看請求日誌,協助排除故障。
ACE 的常見無伺服器情境
- 情境:你有一段只需執行幾秒鐘的腳本,且每天只執行幾次。
- 解決方案:Cloud Functions(比 Cloud Run 更輕量,適用於事件驅動)。
- 情境:你的應用程式需要讀取本地文件系統中的大量臨時數據,且啟動需要 5 分鐘。
- 解決方案:App Engine 彈性環境 (Flexible) 或 Compute Engine(因為標準環境和 Cloud Run 的臨時文件空間有限且不支援長時間啟動)。
常見問題 (FAQ)
問:Cloud Run 可以連結 VPC 內的資料庫嗎? 答:可以。使用 無伺服器 VPC 存取連接器 (Serverless VPC Access Connector)。
問:Cloud Run 支援 Websockets 嗎? 答:支援。這是它相對於許多 Serverless 平台的一個優勢。
問:什麼是 app.yaml?
答:這是 App Engine 的設定文件,定義了執行環境、執行個體類型、處理器 (Handlers) 等資訊。
問:我可以在 App Engine 標準環境中使用 C++ 嗎? 答:不行,標準環境只支援特定的語言版本。你需要改用彈性環境或 Cloud Run。
問:Cloud Run 的最大請求處理時間是多少? 答:目前最多可設定為 60 分鐘(超時設定),但預設通常是 5 分鐘。
ACE 總結清單
- 記住 App Engine 標準環境 (Standard) vs 彈性環境 (Flexible) 的對照表。
- 明白 Cloud Run 是基於容器 (Docker) 的。
- 知道如何進行流量切換 (Traffic Splitting)。
- 理解「縮放到零」的成本優勢。
- 了解無伺服器 VPC 存取 (Serverless VPC Access) 的用途。