🗺️ GCP 服務地圖
運算與容器・Serverless・ACE/PCA/PCD

Cloud Run 與 Cloud Run functions:從容器到上線

程式包成容器之後,還有三件事要決定:同時要開幾個執行個體、帳單怎麼算,以及新版本怎麼上線才不會讓所有使用者一起踩雷。這一頁用計算器和流量模擬把這三件事一次走完。

成本與並行計算器 修訂版本流量分配模擬 控制台 × gcloud × Terraform 同步操作

💡 先搞懂問題

虛構公司「晴空食品」有一支訂餐 API,原本跑在兩台 Compute Engine 虛擬機器上。這兩台機器一天 24 小時開著,可是真正忙的只有午餐和晚餐那幾個小時,半夜幾乎沒有人點餐,錢卻照付;遇到週年慶,流量一下子翻好幾倍,工程師得半夜手動加機器。上線新版本也很緊張:新程式直接蓋過舊程式,出錯時所有顧客一起遇到,要回到舊版還得重新部署一次。

於是團隊把 API 包成容器,搬到 Cloud Run。Cloud Run 是全受管的無伺服器容器平台:你交出一個容器映像(或原始碼,由平台幫你建置),它就給你一個 HTTPS 網址,依請求量自動增減執行個體(instance),沒有請求時可以縮到零。新手搬過來之後最常卡在四個地方:以為「無伺服器」就沒有上限也幾乎不花錢;分不清並行數(concurrency,一個執行個體同時處理幾個請求)和執行個體數的關係;不知道每次部署都會產生一個新的修訂版本(revision),而且預設立刻接走全部流量;還有被一串相近的名字搞混,例如 Cloud Run、Cloud Run functions、App Engine、GKE。

名稱先交代清楚:Cloud Run functions 就是原本的 Cloud Functions,2024-08-21 起改名,現行版本(原第二代)本身就部署在 Cloud Run 上,第一代改稱 Cloud Run functions (1st gen)。考試大綱與舊教材可能還寫 Cloud Functions,指的是同一個產品。這一頁以 Cloud Run 服務(service)為主線,因為函式最後也會變成 Cloud Run 上的服務,並行、執行個體、修訂版本、流量分配這些觀念完全通用。

訂餐流量(示意) 0 時6 時12 時18 時24 午餐 晚餐 做法一:兩台虛擬機器整天開著 VM 1:24 小時計費 VM 2:24 小時計費,多半在空轉 做法二:Cloud Run 執行個體跟著流量走 縮到零 縮到零 每一格代表一個執行個體(數量為示意)
上排的虛擬機器不管有沒有人點餐都在計費;下排的 Cloud Run 只在有請求的時段開執行個體,午晚餐自動加開,半夜縮到零。代價是「從零開始」的第一個請求要等執行個體啟動,也就是冷啟動,後面會談怎麼取捨。

生活比喻:快餐店的外帶窗口

想像一家快餐店,只做外帶,店面有一排可以開關的窗口。沒有客人時,窗口全部拉下來,不用排人站班;第一位客人走近,店員才開一個窗口,開窗需要幾十秒準備,這位客人得稍等。一個窗口的店員可以同時招呼好幾位客人(一邊收錢一邊等餐),排隊的人超過一個窗口忙得過來的量,就再開下一個窗口;店長規定最多開幾個,免得人手和成本失控。午餐尖峰前,店長也可以先指定「至少開一個窗口」,讓第一位客人不必等開窗。

換新菜單時,這家店不會一夜之間全面改賣新餐點。新菜單先在一個掛著「試吃」牌的窗口給員工試,接著讓 10% 的客人拿到新菜單,觀察有沒有人抱怨,沒問題再加到一半、再全面上市;新菜出了狀況,店長一句話就把所有客人導回舊菜單,舊菜單的食譜還在,不用重新研發。

回到 Google Cloud:整家店就是一個 Cloud Run 服務(service),對外有固定網址。每個窗口是一個執行個體,「一個窗口同時招呼幾位客人」就是並行數(每個執行個體的並行要求上限,最多 1,000),「最多開幾個窗口」是最大執行個體數,「至少開一個窗口」是最小執行個體數,開窗要等的那幾十秒就是冷啟動(cold start)。每一份菜單是一個修訂版本,每次部署都會產生新的修訂版本,舊的會保留;「試吃窗口」是掛在修訂版本上的標籤(tag),會得到一個只連到該修訂版本的專屬網址;「10% 的客人拿新菜單」就是流量分配(traffic splitting),「導回舊菜單」就是把 100% 流量指回舊修訂版本。
快餐店外帶窗口(比喻) Cloud Run 的正式名稱 整家店與店門口的招牌 一個窗口 一個窗口同時招呼幾人 最多開幾個、至少開幾個 開窗要等幾十秒 每份菜單、試吃窗口 10% 客人試新菜、導回舊菜 服務(service)與服務網址 執行個體(instance) 並行數(concurrency) 最大/最小執行個體數 冷啟動(cold start) 修訂版本(revision)與標籤 流量分配與回復
左欄是比喻,右欄是正式名稱。實驗室一處理上半部(窗口數、並行、成本、冷啟動),實驗室二處理下半部(修訂版本、標籤、流量分配與回復)。

這個比喻有三個地方和實際不同。第一,真實窗口的店員記得剛剛跟誰說過話,Cloud Run 的執行個體卻是無狀態的:平台隨時可能關掉閒置的執行個體,連用最小執行個體保溫的也一樣,所以購物車、登入狀態這類資料要放在 Firestore、Memorystore 或 Cloud SQL 等外部服務。第二,比喻裡「10% 的客人」聽起來像是挑固定的一群人,實際上流量分配預設是依每個請求隨機分到各修訂版本,同一位使用者連續兩次請求可能落到不同版本;需要黏著同一版本時,要另外考慮工作階段相依性(session affinity),而且它只是盡力而為。第三,拉下窗口就完全不花錢,在 Cloud Run 卻要看計費方式:依請求計費時閒置的執行個體不收費(但用最小執行個體保溫的,閒置時仍以較低費率計費),依執行個體計費則是執行個體存在多久就收多久。

同一時間有 12 個請求在處理(示意) 並行數 = 1 12 個執行個體,每個只處理 1 個請求;每個都要冷啟動、都要計費 並行數 = 4 3 個執行個體,每個同時處理 4 個請求 需要的執行個體數 ≈ 每秒請求數 × 處理秒數 ÷ 並行數 例:每秒 24 個請求 × 0.5 秒 = 平均 12 個請求同時在處理;並行數 4 → 約 3 個 並行數是上限不是目標:CPU 已經很忙時,平台可能少送一點請求、提早加開執行個體
「每秒請求數 × 處理秒數」算的是平均有幾個請求同時在處理(排隊理論裡的 Little 定律),再除以每個執行個體能同時處理幾個,就是大約要幾個執行個體。並行數設成 1 時執行個體數會暴增,適合每個請求就吃滿 CPU 或記憶體、或程式不能同時處理多個請求的情況。

🎮 互動實驗室一:成本與並行計算器

先選一個情境,或自己調整左邊的輸入:每月請求數、平均處理時間、尖峰倍數、每個執行個體的並行數、CPU 與記憶體、最小與最大執行個體數。右邊即時算出平均與尖峰需要幾個執行個體,並用示意單價比較「依請求計費」與「依執行個體計費」每月大約多少點。示意單價只保留官方價目表的幾個相對關係(依執行個體計費的每秒單價較低、沒有請求費;最小執行個體閒置時 CPU 以較低費率計費、記憶體照常),不是實際價格,實際費用請以 Cloud Run 定價頁與 Google Cloud Pricing Calculator 為準。每個情境下方有一題「先猜再看」。

一、輸入

一個月以 30 天計
一個請求從進來到回應完成的時間
尖峰時段的每秒請求數是平均的幾倍
1~1,000;控制台新服務預設 80
CPU(vCPU)
記憶體
預設 0;大於 0 可以避開大部分冷啟動
每個修訂版本預設 100
示意單價(點)依請求計費依執行個體計費
每 vCPU-小時10(處理請求時)7.5(整段存活期間)
每 GiB-小時1(處理請求時)0.75(整段存活期間)
每 1 萬次請求1不收
最小執行個體閒置時vCPU 1、GiB 1同上方費率

二、計算結果

平均同時處理中的請求 A = 每月請求數 ÷ 2,592,000 秒 × 平均處理秒數
需要的執行個體 ≈ A ÷ 並行數(無條件進位;尖峰再乘尖峰倍數)
依請求計費的忙碌時數 ≈ 720 小時 × max(min(A, 1), A ÷ 並行數)
平均每秒請求數—
平均同時處理中的請求 A—每秒請求數 × 處理秒數
平均需要的執行個體—
尖峰需要的執行個體—
尖峰時的執行個體最小執行個體(保溫)
依請求計費
—
依執行個體計費
—
處理請求的時間請求費最小執行個體閒置執行個體整段存活期間

    先猜再看

    畫面說明:載入中。

    數字查證:2026 年 10 月,依 Cloud Run 官方文件(並行數上限 1,000、控制台新服務預設 80、每個修訂版本預設最多 100 個執行個體、請求逾時預設 5 分鐘最長 60 分鐘、CPU 與記憶體對應表、計費設定)與 Cloud Run 定價頁的計費規則。忙碌時數的公式是簡化估算:假設請求平均分散、能重疊的都重疊;真實流量有隨機起伏,實際執行個體數通常會比這個估計多一些。

    🎮 互動實驗室二:修訂版本與流量分配模擬器

    晴空食品的訂餐 API 目前只有一個修訂版本 v1,接走全部流量。你要把 v2 安全地推上線:先部署但不接流量、用標籤網址自己測、分 10% 給真實使用者觀察,沒問題再加碼,有問題就一鍵切回。每個按鈕都對應一行真正的 gcloud 指令,會記在指令紀錄裡。按「送出 100 個請求」看看流量怎麼分,紅色方塊是出錯的請求。勾選「v2 藏了一個 bug」可以練習回復;也可以故意先按「部署並立刻接流量」,看看沒有 --no-traffic 會發生什麼事。

    準備好了目前只有 v1,服務的流量設定是「最新的修訂版本拿 100%」。
    服務網址(所有使用者)https://menu-api-123456789012.asia-east1.run.app
    還沒送出請求。
    畫面說明:載入中。

    行為查證:2026 年 10 月,依 Cloud Run「Rollbacks, gradual rollouts, and traffic migration」文件與 gcloud run deploy、gcloud run services update-traffic 指令參考。修訂版本名稱的隨機後綴、服務網址裡的專案編號與錯誤率都是示意。

    🛠️ 操作教學:部署 Cloud Run 服務、掛標籤再分流量

    不用登入 Google Cloud,也能先把流程走一遍。左邊是簡化的主控台,照步驟選專案、填映像與服務名稱、設定驗證與計費、調整執行個體與資源,建立後再部署第二個修訂版本並分配流量;右邊同步顯示等效的 gcloud CLI 與 Terraform,黃色底的那幾行就是目前這一步對應的寫法。你可以故意填錯看看驗證訊息,也可以改服務名稱、區域或並行數,看指令怎麼跟著變。

    示意畫面:簡化重繪,只保留和本主題有關的欄位;實際畫面以 Google Cloud 控制台為準。
    雲端主控台選取專案搜尋資源、文件、產品
    同一件事的三種做法:控制台、gcloud CLI、Terraform 最後都呼叫同一組 Cloud Run Admin API(run.googleapis.com),由 IAM 檢查權限後建立服務與修訂版本,所以結果相同。控制台適合第一次摸索、想看每個選項說明的時候;gcloud 適合寫成腳本、放進 Cloud Build 或其他 CI/CD 管線,部署新版與調整流量這類「動作」最常用它;Terraform 是宣告式的基礎架構即程式碼,描述「最後應該長什麼樣子」,適合正式環境的版本控管與審查。Terraform 管的是服務的設定與流量分配,日常的映像更新常交給 CI/CD 管線,兩者分工要先講好,免得互相覆蓋。terraform destroy 會刪除這份設定建立的所有資源(Cloud Run 服務在 provider 裡預設開啟 deletion_protection,範例為了練習把它設成 false)。想讓 Google 代管 Terraform 的執行環境與 state,可以用 Infrastructure Manager;舊的 Cloud Deployment Manager 已經在 2026 年 3 月底結束支援,新設計不要再用。

    自己動手時要注意

    權限:部署者在服務上至少要有 Cloud Run 開發人員(roles/run.developer)角色,另外要能使用服務的執行身分,也就是在那個服務帳戶上有服務帳戶使用者(roles/iam.serviceAccountUser);映像放在 Artifact Registry 時還需要 Artifact Registry 讀取者(roles/artifactregistry.reader)。管理整個專案的 Cloud Run 可以用 Cloud Run 管理員(roles/run.admin),練習用的個人專案通常已經是擁有者。呼叫「需要驗證」的服務,呼叫者要有 Cloud Run 叫用者(roles/run.invoker)。正式環境建議替服務建立專用的服務帳戶,只給它需要的權限,不要沿用預設的運算服務帳戶。

    API 與費用:先啟用 Cloud Run Admin API;用 --source 從原始碼部署時,還會用到 Cloud Build 與 Artifact Registry。依請求計費、最小執行個體為 0 的練習服務,沒有請求時不收運算費,Cloud Run 每月也有免費額度(依請求計費每月 200 萬次請求、18 萬 vCPU-秒、36 萬 GiB-秒,以帳單帳戶計算,查證日期 2026-10-08);但最小執行個體大於 0、依執行個體計費、以及 Artifact Registry 儲存的映像與 Cloud Build 建置時間都可能產生費用。新帳戶的 Free Trial 是 90 天、300 美元抵用金。

    練習完怎麼刪:刪掉服務會一併刪除它的所有修訂版本;如果整個專案只拿來練習,刪除專案最乾淨,專案會先進入停用狀態、一段時間後才永久刪除。

    # 刪除練習用的 Cloud Run 服務(所有修訂版本一起刪除)
    gcloud run services delete menu-api --region asia-east1
    
    # 用 Terraform 建立的就用 Terraform 刪
    terraform destroy
    
    # 整個專案只拿來練習時,刪除專案最乾淨(PROJECT_ID 換成你的專案 ID)
    gcloud projects delete PROJECT_ID

    範例裡的專案 ID、專案編號、群組信箱都是佔位或示意。不要把服務帳戶金鑰、密碼或 API 金鑰寫進映像、環境變數、指令或範本:服務要存取其他 Google Cloud 資源時,直接用服務帳戶身分(不需要金鑰);機密放在 Secret Manager,再掛成環境變數或檔案;從 GitHub Actions 等外部 CI/CD 部署時,用 Workload Identity Federation 換取短期憑證,不要下載服務帳戶金鑰;自己在電腦上操作則用 gcloud auth login 的使用者憑證。

    ☁️ 對照 AWS 與 Azure 的做法:AWS 上最接近的組合是 Lambda 加 API Gateway:Lambda 依請求與 GB-秒計費,一個執行環境一次只處理一個請求,新版用版本與別名(alias)的加權路由做漸進上線,跟 Cloud Run 修訂版本加流量分配很像;如果要跑整個容器,AWS 會改用 Fargate 或 App Runner。Azure 對應的是 Container Apps 的修訂版本流量分割,以及 App Service 的部署位置:部署位置是兩個常駐環境互相「交換」,Cloud Run 則是在同一個服務裡把流量百分比分給不同修訂版本,而且舊修訂版本不必另外佔一組常駐資源。
    AWS 互動教學:Lambda 與 API Gateway ↗ Azure 互動教學:App Service 與部署位置 ↗

    📘 原理補完

    服務、修訂版本、執行個體:三層要分清楚

    Cloud Run 的服務是長期存在的東西:它有名稱、區域、對外網址,以及「流量要送到哪裡」的設定。服務名稱在同一個專案與區域內不能重複、最多 49 個字元、以英文字母開頭、不能以連字號結尾,而且建立後不能改名。每次部署或修改設定(映像、環境變數、資源、並行數……),Cloud Run 都會產生一個新的修訂版本,它是當下映像加設定的不可變快照,名稱像 menu-api-00002-b2m。舊的修訂版本不會被刪掉,這就是能夠「一鍵切回」的原因。真正在跑程式的是執行個體,每個執行個體屬於某一個修訂版本,由平台依流量增減。

    服務網址有兩種格式:可以事先預測的決定性網址 https://服務名稱-專案編號.區域.run.app,以及每個服務都有、帶隨機識別碼的網址。替修訂版本掛上標籤之後,會多出 https://標籤---服務網址 這種只連到該修訂版本的網址,不受流量百分比影響。

    服務 menu-api(區域 asia-east1) 服務網址:依流量設定分配 | 標籤網址:直達指定修訂版本 修訂版本 00001 映像 v1+設定 90% 修訂版本 00002 映像 v2+設定 10% 修訂版本 00003 映像 v3・標籤 green 0% 4 個執行個體(示意) 1 個執行個體(示意) 只在標籤網址有請求時啟動 修訂版本是不可變的快照;執行個體依各自分到的流量增減
    由上到下是服務、修訂版本、執行個體。流量百分比設在服務上,決定請求怎麼分到各修訂版本;每個修訂版本再依自己分到的流量決定要幾個執行個體。拿 0% 的修訂版本仍然存在,可以透過標籤網址被呼叫。

    執行個體怎麼增減:並行數、最小與最大執行個體

    Cloud Run 的自動調整看兩件事:每個執行個體目前同時處理多少請求(相對於並行上限),以及 CPU 使用率。並行上限是天花板不是目標,CPU 已經很忙時,平台可能少送一點請求給它、提早加開新的執行個體。並行上限可設 1~1,000,控制台建立新服務時預設 80;用 gcloud 或 Terraform 建立時,預設值和 vCPU 數有關,所以正式環境最好明確寫出來。CPU 低於 1 vCPU 時,並行數必須是 1。

    最大執行個體數是安全閥:它限制尖峰時最多開幾個,保護後端資料庫的連線數,也替帳單設上限;每個修訂版本預設最多 100 個,到頂之後多出來的請求會排隊,等不到就失敗。最小執行個體數預設 0,設成大於 0 時平台會保留暖好的執行個體,降低冷啟動延遲,代價是閒置時也計費。官方建議在服務層級設定最小與最大執行個體數(gcloud 用 --min、--max,Terraform 用服務的 scaling 區塊);修訂版本層級的 --min-instances、--max-instances 只有原本就設定過修訂版本層級調整的服務才能用,兩種層級同時設定時,較小的最大值生效。要注意平台隨時可能關掉閒置的執行個體,連最小執行個體也一樣,所以程式不能依賴「某個執行個體一直活著」。

    最小執行個體 = 0 處理請求 閒置一段時間→縮到零 (不計費) 冷啟動中… 處理請求 新請求到達 使用者多等:下載映像、啟動容器、程式初始化 最小執行個體 = 1 處理請求 保溫閒置(仍計費) 新請求直接處理,不用等 新請求到達 依請求計費時,最小執行個體閒置期間 CPU 以較低費率、記憶體以一般費率計費
    冷啟動的長短取決於映像大小與程式初始化時間,最小執行個體只是讓「從零開始」的情況少發生。另外兩個常用的緩解方式:把映像做小、把初始化工作延後到真正需要時;以及啟用啟動時 CPU 加速(startup CPU boost),新服務預設已開啟。

    兩種計費方式

    Cloud Run 服務有兩種計費設定。依請求計費(預設,舊稱「只在處理請求時分配 CPU」):執行個體只在啟動、關閉,以及至少有一個請求在處理的期間計費,另外每次請求有請求費;沒有請求時 CPU 幾乎被收回,所以回應送出之後還想在背景繼續做事,可能做不完。依執行個體計費(舊稱「一律分配 CPU」):執行個體從啟動到結束都計費、至少 1 分鐘,沒有請求費,CPU 每秒單價也比較低,而且整段期間都有 CPU 可以做背景工作;記憶體至少要 512 MiB。gcloud 用 --cpu-throttling/--no-cpu-throttling 切換,Terraform 用 cpu_idle。計費時間都以 100 毫秒為單位無條件進位。

    同一個執行個體的一段時間(示意) 啟動結束 橘色=有請求在處理 依請求計費 +每次請求費 依執行個體計費 整段存活期間都計費(單價較低、無請求費、最少 1 分鐘)
    請求稀疏、閒置時間長,上面那條比較短;執行個體一直在忙、幾乎沒有空檔,下面那條的單價優勢就顯現出來。實驗室一的「北辰醫院夜間 Webhook」和「晴空食品訂餐 API」就是這兩種極端。

    下表整理服務最常用的預設值與上限(查證時間 2026 年 10 月,依 Cloud Run 官方文件;配額相關的上限可能因專案與區域而不同):

    項目預設範圍或上限gcloud/Terraform
    請求逾時5 分鐘最長 60 分鐘--timeout/template.timeout
    並行上限控制台 801~1,000;CPU 低於 1 時必須是 1--concurrency/max_instance_request_concurrency
    最小執行個體0大於 0 時閒置也計費--min/scaling.min_instance_count
    最大執行個體每個修訂版本 100依配額--max/scaling.max_instance_count
    CPU1 vCPU0.08~8;1 以上為 1、2、4、6、8--cpu/resources.limits.cpu
    記憶體512 MiB最大 32 GiB;1 vCPU 最多 4 GiB、2 vCPU 最多 8 GiB、4 vCPU 最多 16 GiB--memory/resources.limits.memory
    Cloud Run jobs 任務逾時10 分鐘最長 168 小時;GPU 任務最長 1 小時gcloud run jobs

    修訂版本、標籤與流量分配

    新服務第一次部署時,流量設定是「最新的修訂版本拿 100%」,之後每次一般部署,新修訂版本都會直接接走全部流量。要漸進上線,部署時加 --no-traffic(控制台是不勾「立即提供這個修訂版本」),再用 --tag 掛標籤取得專屬網址自己先測;確認後用 gcloud run services update-traffic 分配百分比:--to-revisions 以修訂版本名稱指定、--to-tags 以標籤指定、--to-latest 把 100% 給最新版。三者一次只能用一個;指定的百分比最多 100,沒指定到的部分依原比例分給其他正在接流量的修訂版本。

    有一個容易忽略的副作用:只要流量被固定分配給指定的修訂版本(不論是分流還是切回舊版),之後的部署都會沿用這個分配,新修訂版本拿 0%,直到你再次用 --to-latest 回到「最新版拿 100%」。這是保護機制,但也常讓人以為「部署成功了怎麼沒生效」。流量分配預設依每個請求隨機決定;需要讓同一位使用者盡量停在同一個版本,可以啟用工作階段相依性,它用 cookie 盡力而為,而且優先於流量比例。

    部署 v2--no-traffic --tag 標籤網址測試流量仍 0% 金絲雀 10%--to-tags green=10 觀察指標錯誤率、延遲 正常:50% → 100%--to-latest 全面上線 異常:一鍵切回--to-revisions v1 的修訂版本=100 切回不需要重新建置:v1 的修訂版本一直保留在服務裡 切回後流量固定在 v1,之後的部署不會自動接流量,修好再走一次這個流程
    這就是實驗室二的任務清單。正式環境常把這個流程交給 Cloud Deploy 的金絲雀部署自動化,或在 Cloud Build 管線裡依序執行;觀察指標則來自 Cloud Monitoring 與 Cloud Logging。

    Cloud Run 家族與相鄰服務怎麼選

    Cloud Run 底下有三種資源:服務(services)回應 HTTP 請求;工作(jobs)跑到完成就結束,沒有網址,可以手動、排程或由工作流程觸發,適合批次處理;工作者集區(worker pools)是常駐的背景工作者,例如從訊息佇列拉資料處理。Cloud Run functions 讓你只寫函式,平台負責打包成容器並部署成 Cloud Run 服務;觸發方式是 HTTP,或透過 Eventarc 接收事件(Cloud Storage 物件變更、Pub/Sub 訊息、經 Cloud 稽核記錄取得的各種 API 呼叫等)。現行版本的 HTTP 函式最長 60 分鐘、事件函式最長 9 分鐘,每個執行個體最多同時處理 1,000 個請求、最多 16 GiB 記憶體與 4 vCPU;第一代都是 9 分鐘、一次只處理 1 個請求,目前沒有公布淘汰日期,官方提供升級到 Cloud Run 的工具(2026-08-10 GA)。

    選項你交出什麼怎麼觸發能不能縮到零適合
    Cloud Run 服務容器映像或原始碼HTTP 請求(也可接 Eventarc、Pub/Sub 推送)可以(最小執行個體 0)API、網站、無狀態微服務、AI 推論
    Cloud Run jobs容器映像手動、排程、工作流程跑完就結束批次、資料處理、資料庫遷移腳本
    Cloud Run worker pools容器映像常駐,自己拉工作依設定佇列消費者、長時間背景處理
    Cloud Run functions函式程式碼HTTP 或 Eventarc 事件可以檔案上傳後處理、訊息觸發的小段程式
    App Engine程式碼(標準)或容器(彈性)HTTP標準環境可以;彈性環境至少 1 個既有 App Engine 應用;新使用者官方建議 Cloud Run
    GKEKubernetes 資源定義依你部署的工作負載Pod 可以;叢集本身有管理費大量微服務、有狀態工作負載、需要 Kubernetes API
    只是一小段由事件或 HTTP 觸發的程式? 跑到完成就結束、沒有網址的批次工作? 需要 Kubernetes API、節點或複雜網路政策? Cloud Run 服務:無狀態 HTTP 服務 再決定並行數、最小/最大執行個體與計費方式 Cloud Run functions Cloud Run jobs GKE 是 是 是 否 否 否
    由上往下問,第一個回答「是」的就是起點。App Engine 沒有出現在流程裡,因為它是既有應用的選項:本身沒有被淘汰,但官方文件建議新使用者以 Cloud Run 取代;它的第一代執行環境(Python 2.7 等)2026-01-31 已進入淘汰、2027-01-31 停用。

    從原始碼到上線:周邊服務各管什麼

    Cloud Run 只負責「跑」。映像放在 Artifact Registry(舊的 Container Registry 已在 2025-03-18 關閉,gcr.io 路徑要對應到 Artifact Registry 的 gcr.io 儲存庫才能繼續用);建置交給 Cloud Build,gcloud run deploy --source 背後就是它;要多環境、要核准的持續交付可以用 Cloud Deploy;事件觸發交給 Eventarc。服務本身執行時用的身分是一個服務帳戶,它要存取 Cloud SQL、Cloud Storage 或 Secret Manager,就在那些資源上授權給這個服務帳戶,不需要任何金鑰檔。

    原始碼--source . Cloud Build建置映像 Artifact Registry存放映像 Cloud Run服務/新修訂版本Cloud Run functions執行身分:服務帳戶 事件來源Cloud Storage 上傳、Pub/Sub 訊息 EventarcCloudEvents Cloud SQL、Secret Manager以 IAM 授權,不用金鑰
    上面一條是部署管線,下面一條是事件觸發,右下是服務執行時存取其他資源的方式。考試常把這幾個服務放在同一題的選項裡,分清楚各自管哪一段就不容易選錯。

    判斷步驟

    1. 先看工作負載的形狀:事件觸發的小段程式選 Cloud Run functions;跑完就結束的批次選 Cloud Run jobs;需要 Kubernetes 的選 GKE;其餘無狀態 HTTP 服務選 Cloud Run 服務。
    2. 估算並行:平均同時處理中的請求 ≈ 每秒請求數 × 處理秒數,除以並行數就是大概要幾個執行個體;尖峰再乘上倍數,確認沒有超過最大執行個體數,也沒有壓垮下游資料庫。
    3. 延遲要求高、不能接受冷啟動,就設服務層級的最小執行個體;能接受偶爾慢一點,就保留 0,閒置不付費。
    4. 選計費方式:流量稀疏、閒置多選依請求計費;流量穩定、執行個體幾乎一直在忙,或回應後還要做背景工作,選依執行個體計費。
    5. 決定誰能呼叫:內部服務用「需要驗證」並只給必要的人 roles/run.invoker;對外的網站或公開 API 才允許公開存取,必要時前面再加負載平衡器與 Cloud Armor。
    6. 上線新版:--no-traffic 加 --tag 先測,再用 update-traffic 從小比例開始加,出問題就把 100% 指回舊修訂版本。

    容易考錯的地方

    把並行數和執行個體數混為一談:題目給每秒請求數與處理時間時,要先算同時處理中的請求,再除以並行數。並行數設成 1 常是干擾選項,它會讓執行個體數暴增,只在程式不能同時處理多個請求時才需要。

    冷啟動找錯旋鈕:「第一個請求很慢」對應最小執行個體,不是最大執行個體、不是逾時,也不是改用更大的 CPU(更大的 CPU 只能縮短啟動時間,不能消除從零開始)。

    以為部署就是上線:一般部署在「最新版拿 100%」的設定下會立刻接走全部流量;要先測試必須加 --no-traffic。反過來,流量被固定分配後,新部署拿 0%,不是部署失敗。

    回復用重新部署:Cloud Run 保留舊修訂版本,最快的回復是 update-traffic 把 100% 指回去。重新建置舊版或刪除服務重建,都是比較慢又有風險的干擾選項。

    Cloud Functions 和 Cloud Run functions 當成兩個產品:是同一個產品改名。看到「上傳檔案後自動處理」「收到 Pub/Sub 訊息就執行一小段程式」,答案通常是 Cloud Run functions(大綱可能寫 Cloud Functions)搭配 Eventarc;需要自訂執行環境或多個端點才改用 Cloud Run 服務。

    App Engine 與 Cloud Run 的定位:App Engine 沒有被淘汰,但新專案官方建議用 Cloud Run;App Engine 彈性環境不能縮到零,標準環境可以。

    相關考試:CDL 會考 Cloud Run 與 Cloud Run functions 的商業價值;ACE 大綱點名在 Cloud Run 管理修訂版本與流量分割,以及事件觸發的無伺服器運算;PCD 有一整節是部署到 Cloud Run,並點名流量分割做漸進發布與回復;PCA 會在架構情境中比較 Cloud Run、GKE 與 Compute Engine。

    ✅ 自我檢測

    6 題原創題,選完立即顯示對錯與解析,全部作答後會出現總分。目前得分:0 / 6