使用 Cloud Functions 2nd Gen 進行流量拆分、漸進式部署和回滾版本

更新於 發佈於 閱讀時間約 14 分鐘

Overview

Cloud Run 允許您指定哪些修訂版應該接收流量,並指定不同版本接收的流量比例。Revisions 也能使您能夠回滾到先前的版本、逐步增加新版本的流量比例,或在多個修訂版之間拆分流量。

前置作業

  1. 啟用 Cloud Shell

有兩種方法。可以從 console 的右上角打開終端機或是到 https://shell.cloud.google.com/ 會打開純文字的 shell 介面

  1. PROJECT 的設定和身分驗證
gcloud auth list
# 驗證身分
gcloud config list project
# 確認當下要使用的 PROJECT
gcloud config set project <Project ID>
# 更改要使用的 PROJECT
gcloud services enable cloudfunctions.googleapis.com
# 開啟 Cloud Function API

創建 Cloud Function (Traffic Splitting)

  1. 建立並進入工作資料夾
mkdir revisions-gcf-codelab && cd $_
REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen # 實作更換 BG_COLOR ,代表不同版本的 Revisions

REGION=us-east1
PROJECT_ID=solution-marcos-01
BG_COLOR=darkseagreen
  1. 新增檔案 package.json

cat <<EOF >> package.json
{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0"
}
}
EOF

  1. 新增檔案 index.js

cat <<EOF >> 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('helloHttp', (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>');
});
EOF

  1. 部屬 Cloud Function (traffic-splitting-gcf)
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
raw-image


  1. 使用 curl 指令測試剛部屬的 Cloud Function,看見的結果是返回 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
raw-image


  1. 現在部屬另外一個 revision 使用 tan作為 background color:
# update the env var
BG_COLOR=tan

# deploy the function
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
  1. 重新使用 curl 指令呼叫 Cloud Fuction 的 endpoint,會返回 tan
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
raw-image


進行 50-50 各半的流量拆分

  1. 使用指令取得 revision IDs:
gcloud run revisions list --service traffic-splitting-gcf \\
--region $REGION --format 'value(REVISION)'
raw-image


  1. 使用指令進行流量拆分,<> 內的 REVISION 要改為剛剛取得的 revision IDs:
gcloud run services update-traffic traffic-splitting-gcf \\
--region $REGION \\
--to-revisions <REVISION1>=50,<REVISION2>=50
raw-image


  1. 使用迴圈呼叫服務的端點 10 次,確認流量拆分成功:
for i in {1..10}; do
echo -e $i "times\\n"
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" $SERVICE_URL
echo -e "\\n"
sleep 1
done
raw-image


漸進式分配流量

  1. 部屬一個新的 Cloud Function (gradual-rollouts-gcf) ,將 BG_COLOR 先設為 beige
# 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


  1. 先將流量 100% 切回 BG_COLOR=beige 的 REVISION
# 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
raw-image


  1. 更新 BG_COLOR 為 lavender,新增一個 lavender 的 REVISION
# 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


  1. 即使 lavender REVISION 是最新的版本,但是呼叫端點可以看到流量都還是在 beige REVISION
# get Cloud Function (gradual-rollouts-gcf)'s enpoint
SERVICE_URL2=$(gcloud run services describe gradual-rollouts-gcf --platform managed --region $REGION --format 'value(status.url)')

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


  1. 取得 gradual-rollouts-gcf 的 image URL
IMAGE_URL=$(gcloud run services describe gradual-rollouts-gcf --region $REGION --format 'value(IMAGE)')
  1. 使用 BG_COLOR 為 lavender 作為 tag 標記新部屬版本的 gradual-rollouts-gcf
gcloud run deploy gradual-rollouts-gcf --image $IMAGE_URL --no-traffic --tag $BG_COLOR --region $REGION --no-allow-unauthenticated
  1. 現在可以開始對 lavender Revision,逐漸分配流量。使用指令分配 1% 流量到 tag=lavender 的版本
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=1
raw-image


  1. 使用指令分配 50% 流量到 tag=lavender 的版本
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=50
  1. 使用指令分配 100% 流量到 tag=lavender 的版本
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=100
raw-image


  1. 呼叫端點可以看到流量都是在 lavender REVISION
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL2
raw-image


回滾到之前的版本

  1. 使用指令回滾到之前的版本 beige revision
gcloud run services update-traffic gradual-rollouts-gcf --to-revisions $BEIGE_REVISION=100 --region $REGION
raw-image


  1. 呼叫端點可以看到返回 beige 的結果
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL2


如果你喜歡這篇文章歡迎幫我按愛心鼓勵一下喔!~閱讀愉快!~

參考資料

延伸閱讀

程式碼

留言
avatar-img
留言分享你的想法!
avatar-img
Marcos的方格子
19會員
44內容數
歡迎來到「Marcos的方格子」!目前在「Marcos談科技」撰寫在職涯上學習到的知識,在「Marcos談書」分享我在日常的閱讀和心得,歡迎您的到來!!
Marcos的方格子的其他內容
2024/12/21
可觀測性(Observability)是現代架構中的核心能力,透過指標、日誌和分散式追蹤三大支柱,幫助開發者深入理解系統狀態並快速定位問題根源。本篇文章回顧 DevOps Taiwan Meetup 的精彩內容,解析可觀測性與監控的差異、建置流程的四大階段,以及實務應用中的工具選擇與導入時機!
Thumbnail
2024/12/21
可觀測性(Observability)是現代架構中的核心能力,透過指標、日誌和分散式追蹤三大支柱,幫助開發者深入理解系統狀態並快速定位問題根源。本篇文章回顧 DevOps Taiwan Meetup 的精彩內容,解析可觀測性與監控的差異、建置流程的四大階段,以及實務應用中的工具選擇與導入時機!
Thumbnail
2024/12/14
本篇文章針對 CKA 認證考試中常見的實作題目,提供詳細解題流程與指令範例。內容基於 examtopic 題目解析,幫助考生掌握實作技能與應試技巧,快速提升 Kubernetes 操作能力,為通過 CKA 考試做好萬全準備!
Thumbnail
2024/12/14
本篇文章針對 CKA 認證考試中常見的實作題目,提供詳細解題流程與指令範例。內容基於 examtopic 題目解析,幫助考生掌握實作技能與應試技巧,快速提升 Kubernetes 操作能力,為通過 CKA 考試做好萬全準備!
Thumbnail
2024/09/17
如何一年內考取 Google Cloud 所有雲端證照
Thumbnail
2024/09/17
如何一年內考取 Google Cloud 所有雲端證照
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
Cloud Run 允許您指定哪些修訂版應該接收流量,並指定不同版本接收的流量比例。Revisions 也能使您能夠回滾到先前的版本、逐步增加新版本的流量比例,或在多個修訂版之間拆分流量。
Thumbnail
Cloud Run 允許您指定哪些修訂版應該接收流量,並指定不同版本接收的流量比例。Revisions 也能使您能夠回滾到先前的版本、逐步增加新版本的流量比例,或在多個修訂版之間拆分流量。
Thumbnail
Google 提供了免費的雲端服務 Google Apps Script (GAS) ,我們可以撰寫一些簡易的程式APP,串接其他 Google 雲端服務 如 Google Docs ,Sheets …,就能夠幫助我們利用雲端硬碟做日常工作
Thumbnail
Google 提供了免費的雲端服務 Google Apps Script (GAS) ,我們可以撰寫一些簡易的程式APP,串接其他 Google 雲端服務 如 Google Docs ,Sheets …,就能夠幫助我們利用雲端硬碟做日常工作
Thumbnail
實驗目的:Lambda@Edge (L@E) 讓 CLoudFront (CF) 回源時,自動選擇較近的 S3 region 回源
Thumbnail
實驗目的:Lambda@Edge (L@E) 讓 CLoudFront (CF) 回源時,自動選擇較近的 S3 region 回源
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
客戶提出以下需求: 當用戶在日本,會導到離用戶最近的CloudFront節點(亞洲),當CF要回原站時,需要導到新加坡的S3 當用戶為美國,會導到離用戶最近的CloudFront節點(美國東岸),當CF要回原站時,需要導到美國的S3
Thumbnail
客戶提出以下需求: 當用戶在日本,會導到離用戶最近的CloudFront節點(亞洲),當CF要回原站時,需要導到新加坡的S3 當用戶為美國,會導到離用戶最近的CloudFront節點(美國東岸),當CF要回原站時,需要導到美國的S3
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
分享關於 AWS CLF-C02 考試的準備心得,包括考試主要範圍、準備過程中的學習資源及建議,以及考試當日的流程和心得。希望本文能為欲嘗試取得此認證的人提供心得與參考。
Thumbnail
分享關於 AWS CLF-C02 考試的準備心得,包括考試主要範圍、準備過程中的學習資源及建議,以及考試當日的流程和心得。希望本文能為欲嘗試取得此認證的人提供心得與參考。
Thumbnail
上回說明的手動下指令,傳出訊息。為了節省手動輸入之動作,將欲執行的curl指令內容,事先作成執行檔。當需要傳送訊息時,只要按兩下執行檔,便可立刻傳出訊息至LINE群組內之全員 2. 說明 2.1 因每次要傳送內容不同,將這些會變動的訊息資料,輸入後保存 於bat執行檔內
Thumbnail
上回說明的手動下指令,傳出訊息。為了節省手動輸入之動作,將欲執行的curl指令內容,事先作成執行檔。當需要傳送訊息時,只要按兩下執行檔,便可立刻傳出訊息至LINE群組內之全員 2. 說明 2.1 因每次要傳送內容不同,將這些會變動的訊息資料,輸入後保存 於bat執行檔內
Thumbnail
在沒有分環境之前,每一隻lambda只有一個code console給所有人一起編輯,開發好了就deploy,根據設定的trigger觸發執行。 現在我們希望能夠在code console開發,然後deploy到不同的stage,目標是不同stage的api gateway能夠調用該lambda的
Thumbnail
在沒有分環境之前,每一隻lambda只有一個code console給所有人一起編輯,開發好了就deploy,根據設定的trigger觸發執行。 現在我們希望能夠在code console開發,然後deploy到不同的stage,目標是不同stage的api gateway能夠調用該lambda的
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News