在 Cloud Run 函式中使用修訂版本來進行流量拆分、漸進式推出和回溯

1. 簡介

總覽

Cloud Run 函式可讓您指定應接收流量的修訂版本,以及修訂版本接收的流量百分比。您可以使用修訂版本復原至先前的版本、漸進式推出修訂版本,並在多個修訂版本之間拆分流量。

本程式碼研究室將說明如何使用修訂版本來管理 Cloud Run 函式的流量。如要進一步瞭解修訂版本,請參閱 Cloud Run 說明文件

課程內容

  • 如何在 Cloud Run 函式的兩個或多個修訂版本之間拆分流量
  • 如何逐步推出新修訂版本
  • 如何復原為先前的修訂版本

2. 設定和需求

必要條件

  • 您已登入 Cloud 控制台。
  • 您先前已部署 Cloud Run 函式。舉例來說,您可以按照部署 Cloud Run 函式的說明開始操作。

啟用 Cloud Shell

  1. 在 Cloud 控制台中,按一下「啟用 Cloud Shell」 圖示 d1264ca30785e435.png

cb81e7c8e34bc8d.png

如果這是您首次啟動 Cloud Shell,系統會顯示中介畫面,說明 Cloud Shell 的功能。如果您看到中介畫面,請按一下「繼續」

d95252b003979716.png

佈建並連線至 Cloud Shell 的作業只需幾分鐘的時間。

7833d5e1c5d18f54.png

這個虛擬機器會載入所有必要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,可大幅提升網路效能和驗證功能。您可以在瀏覽器中完成本程式碼研究室的大部分工作,甚至是全部工作。

連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。

  1. 在 Cloud Shell 中執行下列指令,確認您已通過驗證:
gcloud auth list

指令輸出

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案:
gcloud config list project

指令輸出

[core]
project = <PROJECT_ID>

如未設定,請輸入下列指令設定專案:

gcloud config set project <PROJECT_ID>

指令輸出

Updated property [core/project].

3. 流量拆分

本範例說明如何建立函式,讀取顏色環境變數,並以該背景顏色回傳修訂版本名稱。

雖然本程式碼研究室使用 node.js,但您可以使用任何執行階段。

設定環境變數

您可以設定在本程式碼研究室中使用的環境變數。

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen

建立函式

首先,請建立原始碼目錄,然後切換至該目錄。

mkdir revisions-gcf-codelab && cd $_

接著,請使用以下內容建立 package.json 檔案:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

接下來,請建立含有下列內容的 index.js 來源檔案:

const functions = require('@google-cloud/functions-framework');

const BG_COLOR = process.env.BG_COLOR;
const K_REVISION = process.env.K_REVISION;

functions.http('helloWorld', (req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end('<html><body style="background-color:' + BG_COLOR + ';"' + '><div><p>' + 'Hello from ' + K_REVISION + ' using color ' + BG_COLOR + '</p></div></body>' + '</html>');
});

如要將 Cloud Run 函式直接部署至 Cloud Run,請執行下列指令:

gcloud beta run deploy traffic-splitting-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --set-env-vars BG_COLOR=$BG_COLOR

如果您想部署 Cloud Functions 第 2 代,請使用下列指令:

gcloud functions deploy traffic-splitting-gcf \
  --gen2 \
  --runtime=nodejs20 \
  --region=$REGION \
  --source=. \
  --entry-point=helloWorld \
  --trigger-http \
  --no-allow-unauthenticated \
  --set-env-vars BG_COLOR=$BG_COLOR

如要測試函式,您可以使用 curl 查詢現有的端點,在 HTML 中查看 darkseagreen 顏色,也可以使用瀏覽器直接查詢端點,查看背景顏色。

SERVICE_URL=$(gcloud run services describe traffic-splitting-gcf --platform managed --region $REGION --format 'value(status.url)')

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

現在部署第二個修訂版本,並使用棕色背景顏色。

如要將 Cloud Run 函式直接部署至 Cloud Run,請執行下列指令:

# update the env var
BG_COLOR=tan

gcloud beta run deploy traffic-splitting-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

如果您想部署 Cloud Functions 第 2 代,請使用下列指令:

# update the env var
BG_COLOR=tan

gcloud functions deploy traffic-splitting-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR

現在,當您 curl 端點時,就會看到棕色背景顏色。

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

以 50/50 的比例分配流量

如要將流量區分為深海綠色和棕色修訂版本,您必須找出基礎 Cloud Run 服務的修訂版本 ID。您可以執行下列指令查看修訂版本 ID:

gcloud run revisions list --service traffic-splitting-gcf \
  --region $REGION --format 'value(REVISION)'

您應該會看到類似下方的結果

traffic-splitting-gcf-00003-qoq
traffic-splitting-gcf-00002-zag

您可以執行下列指令,將流量以 50/50 的比例拆分給兩個修訂版本:

gcloud run services update-traffic traffic-splitting-gcf \
  --region $REGION \
  --to-revisions <REVISION1>=50,<REVISION2>=50

測試流量拆分

您可以透過造訪公開網址 (使用 curl 或直接在瀏覽器中) 來測試函式。

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" $SERVICE_URL

您應該會一半時間看到深海綠色修訂版本,另一半時間則看到棕色修訂版本。您也會在輸出內容中看到修訂版本名稱,例如

<html><body style="background-color:tan;"><div><p>Hello traffic-splitting-gcf-00006-qoq</p></div></body></html>

4. 逐步推出

在本節中,您將瞭解如何逐步將變更內容推送至新的 Cloud Functions 修訂版本。如要進一步瞭解漸進式推出功能,請參閱說明文件

您將使用與上一節相同的程式碼,但會將其部署為新的 Cloud 函式。

首先,將背景顏色設為 beige,然後部署名為 gradual-rollouts-gcf 的函式。

如要將 Cloud Run 函式直接部署至 Cloud Run,請執行下列指令:

# update the env var
BG_COLOR=beige

gcloud beta run deploy gradual-rollouts-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

如果您想部署 Cloud Functions 第 2 代,請使用下列指令:

# update the env var
BG_COLOR=beige

# deploy the function
gcloud functions deploy gradual-rollouts-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR

假設我們想逐步推出背景顏色為薰衣草色的新修訂版本。

首先,讓我們將目前的修訂版本 (beige) 設為接收 100% 流量。這麼做可確保日後的 Cloud Functions 部署作業不會收到任何流量。根據預設,Cloud Functions 會將 100% 流量指派給含有 latest 標記的修訂版本。手動指定目前的修訂版本 beige 應接收所有流量,這樣標有 latest 標記的修訂版本就不會再接收 100% 流量。請參閱說明文件

# get the revision name

BEIGE_REVISION=$(gcloud run revisions list --service gradual-rollouts-gcf \
  --region $REGION --format 'value(REVISION)')

# now set 100% traffic to that revision

gcloud run services update-traffic gradual-rollouts-gcf --to-revisions=$BEIGE_REVISION=100 --region $REGION

您會看到類似 Traffic: 100% gradual-rollouts-gcf2-00001-yox 的輸出內容

您現在可以部署不會接收任何流量的新修訂版本。您可以更新此修訂版本的 BG_COLOR 環境變數,而無須進行任何程式碼變更。

如要將 Cloud Run 函式直接部署至 Cloud Run,請執行下列指令:

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud beta run deploy gradual-rollouts-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

如果您想部署 Cloud Functions 第 2 代,請使用下列指令:

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud functions deploy gradual-rollouts-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR \
  --tag $BG_COLOR

請更新 SERVICE_URL 環境變數,以便使用 gradual-rollouts-gcf 函式

SERVICE_URL=$(gcloud run services describe gradual-rollouts-gcf --platform managed --region $REGION --format 'value(status.url)')

而現在,當您使用 curl 服務時

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

即使最近部署的修訂版本是薰衣草色,您仍會看到米色。

<html><body style="background-color:beige;"><div><p>Hello from gradual-rollouts-gcf-24jan16-staging-2-00001-kop using color beige</p></div></body></html>

測試提供 0% 流量的修訂版本

假設您已驗證修訂版本已成功部署,且正在放送 0% 的流量。即使已通過健康狀態檢查,您仍應驗證此修訂版本是否使用薰衣草背景顏色。

如要測試薰衣草修訂版本,您可以將標記套用至該修訂版本。標記可讓您直接在特定網址中測試新修訂版本,而不提供流量。

首先,取得該修訂版本的圖片網址。

IMAGE_URL=$(gcloud run services describe gradual-rollouts-gcf --region $REGION --format 'value(IMAGE)')

接著,為該圖片加上相關顏色標記。

gcloud run deploy gradual-rollouts-gcf --image $IMAGE_URL --no-traffic --tag $BG_COLOR --region $REGION --no-allow-unauthenticated

您會看到類似下方的輸出內容:

The revision can be reached directly at https://lavender---gradual-rollouts-gcf-k6msmyp47q-lz.a.run.app

您現在可以直接使用 curl 這個修訂版本

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET <DIRECT_REVISION_URL>

並在結果中看到薰衣草色:

<html><body style="background-color:lavender;"><div><p>Hello from gradual-rollouts-gcf-24jan16-00003-xik using color lavender</p></div></body></html>

逐步增加流量

您現在可以開始將流量傳送至薰衣草修訂版本。以下範例說明如何將 1% 的流量傳送至 lavender。

gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=1

如要將 50% 的流量傳送至 lavender,您可以使用相同的指令,但改為指定 50%。

gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=50

您應該會看到一份清單,列出每個修訂版本的流量。

Traffic:
  50% gradual-rollouts-gcf-00001-hos
  50% gradual-rollouts-gcf-00004-mum
        lavender: https://lavender---gradual-rollouts-gcf-k6msmyp47q-uc.a.run.app

當您準備好全面推出薰衣草色時,可以將薰衣草色設為 100%,取代米色。

gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=100

而現在,當您造訪或 curl 漸進式推出 gcf 函式服務網址時,

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

你只會看到薰衣草。

<html><body style="background-color:lavender;"><div><p>Hello gradual-rollouts-gcf-00004-mum</p></div></body></html>

5. 復原

假設您收到早期的使用者體驗意見回饋,指出客戶偏好米色而非淡紫色,因此您需要回溯至米色。

您可以執行這項指令,將版本回溯至先前版本 (米色)。

gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-revisions $BEIGE_REVISION=100

而現在,當您 curl 或造訪函式網址端點時,

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

您會看到 beige 已傳回。

<html><body style="background-color:beige;"><div><p>Hello gradual-rollouts-gcf-00001-hos</p></div></body></html>

如要進一步瞭解復原作業,請參閱說明文件

6. 恭喜!

恭喜您完成程式碼研究室!

建議您參閱推出、回溯和流量遷移相關說明文件

涵蓋內容

  • 如何在 Cloud Run 函式的兩個或多個修訂版本之間拆分流量
  • 如何逐步推出新修訂版本
  • 如何復原為先前的修訂版本

7. 清理

為避免產生意外費用 (例如,如果這個 Cloud Run 函式不小心叫用次數超過 免費方案的 Cloud Function 叫用次數配額),您可以刪除 Cloud Run 函式,或是刪除在步驟 2 中建立的專案。

如要刪除已部署至 Cloud Run 的 Cloud Run 函式,請前往 Cloud 控制台中的 Cloud Run (網址:https://console.cloud.google.com/functions/),然後刪除您在本程式碼研究室中建立的函式。

如要刪除以第 2 代函式部署的 Cloud Run 函式,請前往 Cloud 控制台的 Cloud Functions 頁面 (https://console.cloud.google.com/functions/),然後刪除您在本程式碼研究室中建立的函式。

如果您選擇刪除整個專案,可以前往 https://console.cloud.google.com/cloud-resource-manager,選取您在步驟 2 中建立的專案,然後選擇「Delete」(刪除)。如果您刪除專案,就必須在 Cloud SDK 中變更專案。您可以執行 gcloud projects list 來查看所有可用專案的清單。