5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Cloud Run のリビジョン トラフィック管理を試してみた

Last updated at Posted at 2023-09-05

はじめに

こんにちは、京セラコミュニケーションシステム 福留(@kccs_kazuo_fukudome)です。

今回は、Cloud Run や Cloud Functions(第 2 世代)で利用できるリビジョントラフィックの管理について紹介したいと思います。
この機能は、1 年くらい前から知っていましたが、デプロイしたモジュールの切り戻しで利用したのみでした。そのため、トラフィックの割り当てを 0% や 100% 以外の割合で使った場合、どのようになるんだろうと気になってたので、この機能についての紹介もかねて、記事を作成してみました。

本記事は 2023 年 7 月ごろに作成しております。
Google Cloud の機能を利用した場合は、利用料が発生します。

Cloud Run の リビジョントラフィックとは

Cloud Run でデプロイしたモジュールについて、トラフィック管理を行う機能となります。
たとえば、Cloud Run で実行しているモジュールをバージョンアップしリリースしたとします。ですが、リリースしたモジュールに不具合があり、前のバージョンに戻したいといった状況が発生した場合、この機能の出番となります。
この機能を利用しない場合、前のバージョンに戻すには、前のソースコードでデプロイし直す必要があります。しかし、リビジョントラフィックを利用すると、Cloud Run の設定画面から簡単に前のバージョンに戻すことができます。
また、段階的にリリースをするカナリアリリースにも利用できます。
image1.png
私も、この機能を利用し新しいバージョンで、どこに問題が発生したのか?原因調査のために、トラフィックコントロール機能で切り戻しをよくします。ただ、25% とかの割合にした場合、どういった動きになるのか試してみました。

事前準備

説明が長くなりましたが、改めてリビジョントラフィックを検証するため、 python で簡単なプログラムを作成しました。
このプログラムは、HTTP リクエストを受けると、DB(PostgreSQL)の version テーブルに、バージョンを登録するものです。このプログラムを Cloud Run へデプロイします。

Version1のプログラム
main.py(Version1)
import os
import psycopg2
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/")
def main():
    # データベースに接続
    connection = psycopg2.connect(host='DBサーバーのIP',
                                  user='DBサーバーのユーザー',
                                  password='DBサーバーのパスワード',
                                  database='DBマネージャー名')

    with connection:
      with connection.cursor() as cursor:
        # レコードの登録
        sql = "INSERT INTO version (version) VALUES (%s)"
        cursor.execute(sql, ('1'))

        # コミット
        connection.commit()

    res_str = "insert success v1"
    return res_str

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
Version2のプログラム
main.py(Version2)
import os
import psycopg2
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/")
def main():
    # データベースに接続
    connection = psycopg2.connect(host='DBサーバーのIP',
                                  user='DBサーバーのユーザー',
                                  password='DBサーバーのパスワード',
                                  database='DBマネージャー名')

    with connection:
      with connection.cursor() as cursor:
        # レコードの登録
        sql = "INSERT INTO version (version) VALUES (%s)"
        cursor.execute(sql, ('2'))

        # コミット
        connection.commit()

    res_str = "insert success v2"
    return res_str

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

検証

Cloud Run にデプロイ後、リビジョントラフィックを設定します。
リビジョントラフィックは、Cloud Run の リビジョンタグ にある、”トラフィックを管理"のリンクから設定できます。
image2.png
image3.png

検証は、次の設定内容で リクエストを 100 回ずつ 3 回に分けて行いました。

  1. バージョン 1 25%、バージョン 2 75% の場合
  2. バージョン 1 50%、バージョン 2 50% の場合
  3. バージョン 1 75%、バージョン 2 25% の場合

結果

結果は、SQL の count 関数を利用して求めました。ここでは、その結果をエビデンスとして記載します。

バージョン 1 25%、バージョン 2 75% の場合

1 回目
image4.png
2 回目
image5.png
3 回目
image6.png

バージョン 1 50%、バージョン 2 50% の場合

1 回目
image7.png
2 回目
image8.png
3 回目
image9.png

バージョン 1 75%、バージョン 2 25% の場合

1 回目
image10.png
2 回目
image11.png
3 回目
image12.png

まとめ

試行回数が不足していた為でしょうか?私個人の意見としては、数値に少し偏りがあったので、期待していた結果と少し違うかな?と思いました。皆さんは、どのように思いましたか?もし、意見がありましたらコメントを頂ければと思います。
先に説明した通り、この機能を用いることで、段階的なリリースができたり、トラブル発生時の切り戻しも簡単に行う事ができます。私は、アプリケーション開発業務が中心のため、 普段は 0% か 100% の設定しか使いません。ですが、運用チームなどに配属された場合は、この機能も利用してみたカナリアリリース等もできればいいなと思いました。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?