Cloud Run Functionsのリビジョンを切り替えてトラフィックの制御をしてみる
概要
Cloud Run FunctionsにリブランディングされてからCloud Runの機能がどんどん使えるようになったCloud Run Functionsですが、トラフィック分割も使用可能になっています。
デプロイするたびにリビジョンという単位でバージョンが保持され、リビジョン単位でトラフィックを指定した比率で流したり、切り替えたりすることができます。


このリビジョンを用いた制御をすることで、本番リリース時や切り戻し時に安全に作業することができます。
やってみる
まずは通常通り関数のソースコードを作成します。
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 \
デプロイしたらコンソールから確認します。リビジョン名は関数名-リビジョン名となります。

トラフィックが100%となっているのが確認できますね。
それでは2つめのリビジョンをデプロイしてみます。--revision-suffixにr2と指定してみます。
gcloud run deploy get-revisionfunction \
--source . \
--function=get_revision \
--base-image python312 \
--region asia-northeast1 \
--no-allow-unauthenticated \
--revision-suffix r2 \
Cloud Runのコンソールで確認してみます。

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
デプロイしたらコンソールから確認します。

最後にデプロイした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
コマンドを実行したらコンソールから確認してみます。

r3(get-revisionfunction-r3)にトラフィックが向いていることが確認できますね。
既存の関数でも使用できるか
deployコマンドでデプロイしたものではない(gcloud functions deployでデプロイ)した既存の関数に対してもgcloud run services update-trafficで問題なくトラフィックを切り替えることができました。
まとめ
Cloud Run Functionsでもトラフィック分割ができるようになっているので、この機能を用いると本番リリースや切り戻しが容易になると考えます。Cloud Run Serviceではお馴染みの機能ではありましたがCloud Run Functionsにはなかったので、Cloud Runとの統合が進んで使えるようになった現在ではどんどん使っていきたいですね。
参考






