Cloud Run Functionsのリビジョンを切り替えてトラフィックの制御をしてみる

Cloud Run Functionsのリビジョンを切り替えてトラフィックの制御をしてみる

Clock Icon2025.03.05

概要

Cloud Run FunctionsにリブランディングされてからCloud Runの機能がどんどん使えるようになったCloud Run Functionsですが、トラフィック分割も使用可能になっています。

https://cloud.google.com/run/docs/rollouts-rollbacks-traffic-migration?hl=ja

デプロイするたびにリビジョンという単位でバージョンが保持され、リビジョン単位でトラフィックを指定した比率で流したり、切り替えたりすることができます。
スクリーンショット 2025-03-05 21.38.07.png
スクリーンショット 2025-03-05 21.38.14.png

このリビジョンを用いた制御をすることで、本番リリース時や切り戻し時に安全に作業することができます。

やってみる

まずは通常通り関数のソースコードを作成します。

import functions_framework

@functions_framework.http
def get_revision(request):
    return "This is version1"

デプロイにはdeployコマンドを使用して、revisionを設定します。関数としてデプロイする場合は--funcion引数に関数のエントリポイント名とベースイメージを指定します。またリビジョンを設定するために--revision-suffixを用います。

gcloud run deploy get-revisionfunction \
    --source . \
    --function=get_revision \
    --base-image python312 \
    --region asia-northeast1 \
    --no-allow-unauthenticated \
    --revision-suffix r1 \

デプロイしたらコンソールから確認します。リビジョン名は関数名-リビジョン名となります。

スクリーンショット 2025-03-05 21.01.33.png

トラフィックが100%となっているのが確認できますね。

それでは2つめのリビジョンをデプロイしてみます。--revision-suffixr2と指定してみます。

gcloud run deploy get-revisionfunction \
    --source . \
    --function=get_revision \
    --base-image python312 \
    --region asia-northeast1 \
    --no-allow-unauthenticated \
    --revision-suffix r2 \

Cloud Runのコンソールで確認してみます。
スクリーンショット 2025-03-05 21.05.03.png

2つ目のリビジョンがいらっしゃいますね。しかし、よくみると2つめのリビジョンにトラフィックが100%となっています。
これは、deployコマンドのデフォルトでは最新のリビジョンにトラフィックが100%になるようになっているからです。

最新のリビジョンにトラフィックを向けずにテストしたい場合deployコマンド(またはservices updateコマンド)で--no-trafficを使用します。

gcloud run deploy get-revisionfunction \
    --source . \
    --function=get_revision \
    --base-image python312 \
    --region asia-northeast1 \
    --no-allow-unauthenticated \
    --no-traffic \
    --revision-suffix r3

デプロイしたらコンソールから確認します。
スクリーンショット 2025-03-05 21.11.39.png

最後にデプロイしたr3のリビジョンは最新のデプロイだけれどもトラフィックは0%になっているのが確認できますね。

では今度はトラフィックをr2からr3に向けてみます。

トラフィックを振り分けるにはdeployコマンドではなくgcloud run services update-trafficコマンドを使用します。

--to-revisions引数で、トラフィックを振り分けたいリビジョンをそれぞれ指定します。
以下の例ではget-revisionfunction-r2に0%、get-revisionfunction-r3に100%としています。
get-revisionfunction-r2=0,get-revisionfunction-r3=100

gcloud run services update-traffic get-revisionfunction \
    --region=asia-northeast1 \
    --to-revisions=get-revisionfunction-r2=0,get-revisionfunction-r3=100

コマンドを実行したらコンソールから確認してみます。
スクリーンショット 2025-03-05 21.20.08.png

r3(get-revisionfunction-r3)にトラフィックが向いていることが確認できますね。

既存の関数でも使用できるか

deployコマンドでデプロイしたものではない(gcloud functions deployでデプロイ)した既存の関数に対してもgcloud run services update-trafficで問題なくトラフィックを切り替えることができました。

まとめ

Cloud Run Functionsでもトラフィック分割ができるようになっているので、この機能を用いると本番リリースや切り戻しが容易になると考えます。Cloud Run Serviceではお馴染みの機能ではありましたがCloud Run Functionsにはなかったので、Cloud Runとの統合が進んで使えるようになった現在ではどんどん使っていきたいですね。

参考

https://cloud.google.com/run/docs/deploy-functions

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.