このガイドでは、Cloud Build と Terraform を使用して Compute Engine マネージド インスタンス グループ(MIG)でダウンタイムなしの Blue/Green デプロイを行う方法について説明します。
Cloud Build を使用すると、さまざまな Google Cloud ランタイム(Compute Engine、Google Kubernetes Engine、GKE Enterprise、Cloud Run functions など)へのアプリケーションのビルドとデプロイなど、さまざまなデベロッパー プロセスを自動化できます。
Compute Engine MIG を使用すると、複数の同じ仮想マシン(VM)でアプリケーションを操作できます。自動スケーリング、自動修復、リージョン(マルチゾーン)デプロイ、自動更新などの自動化 MIG サービスを活用することで、ワークロードのスケーラビリティと高可用性を実現できます。Blue/Green 継続的デプロイモデルを使用して、ユーザー トラフィックを、ある MIG(Blue)から別の MIG(Green)に段階的に転送する方法について学習します。MIG は、どちらも本番環境で実行されます。
デザインの概要
次の図では、このドキュメントで説明するコードサンプルで使用される Blue / Green デプロイモデルを示します。
大まかに表現すると、このモデルには、次のコンポーネントが含まれています。
- 2 つの Compute Engine VM プール(Blue と Green)。
- 3 つの外部 HTTP(S) ロードバランサ:
- Blue/Green ロードバランサ。エンドユーザーから VM インスタンスの Blue または Green プールにトラフィックを転送します。
- QA エンジニアとデベロッパーから Blue VM インスタンス プールにトラフィックを転送する Blue ロードバランサ。
- QA エンジニアとデベロッパーから Green インスタンス プールにトラフィックを転送する Green ロードバランサ。
- 次の 2 セットのユーザー:
- Blue/Green ロードバランサにアクセスできるエンドユーザー。Blue または Green のインスタンス プールを参照します。
- 開発とテストを目的として、両方のプールセットにアクセスする必要がある QA エンジニアとデベロッパー。Blue ロードバランサと Green ロードバランサの両方にアクセスでき、ロードバランサはそれぞれ Blue インスタンス プールと Green インスタンス プールに転送されます。
Blue と Green の VM プールは Compute Engine MIG として実装され、外部 IP アドレスは、外部 HTTP(S) ロードバランサを使用して MIG の VM に転送されます。このドキュメントで説明するコードサンプルでは、Terraform を使用してこのインフラストラクチャを構成します。
次の図では、デプロイで発生するデベロッパー オペレーションを示します。
上の図では、赤い矢印はデプロイメント インフラストラクチャを初めて設定するときに発生するブートストラップ フローを表し、青い矢印はすべてのデプロイ中に発生する GitOps のフローを表しています。
このインフラストラクチャを設定するには、ブートストラップ プロセスを開始して GitOps フロー用のコンポーネントを設定するセットアップ スクリプトを実行します。
セットアップ スクリプトは、次のオペレーションを実行する Cloud Build パイプラインを実行します。
- Cloud Source Repositories に
copy-of-gcp-mig-simple
という名前のリポジトリを作成し、GitHub サンプル リポジトリから Cloud Source Repositories にあるこのリポジトリにソースコードをコピーします。 apply
とdestroy
という名前の 2 つの Cloud Build トリガーを作成します。
apply
トリガーは、Cloud Source Repositories の main.tfvars
という名前の Terraform ファイルにアタッチされています。このファイルには、Blue ロードバランサと Green ロードバランサを表す Terraform 変数が含まれています。
デプロイを設定するには、main.tfvars
ファイルの変数を更新します。apply
トリガーは、tf_apply
を実行し、次のオペレーションを実行する Cloud Build パイプラインを実行します。
- 2 つの Compute Engine MIG(1 つは Green、もう 1 つは Blue)、4 つの Compute Engine VM インスタンス(2 つの Green MIG と 2 つの Blue MIG)、3 つのロードバランサ(Blue、Green、スプリッターなど)と 3 つのパブリック IP アドレス。
- デプロイされたアプリケーションを Blue インスタンスと Green インスタンスで表示するために使用できる IP アドレスを出力します。
destroy トリガーは手動でトリガーされ、apply トリガーによって作成されたすべてのリソースを削除します。
目標
Cloud Build と Terraform を使用して、Compute Engine VM インスタンス グループのバックエンドを持つ外部 HTTP(S) ロードバランサを設定します。
VM インスタンスで Blue/Green デプロイを実行します。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
試してみる
Google コードサンプル リポジトリから設定スクリプトを実行します。
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/setup.sh)
セットアップ スクリプトでユーザーの同意を求められたら、「yes」と入力します。
スクリプトの実行は、数秒で完了します。
Google Cloud コンソールで、Cloud Build の [ビルド履歴] ページを開きます。
最新のビルドをクリックします。
[ビルドの詳細] ページが開き、3 つのビルドステップを含む Cloud Build パイプラインが表示されます。最初のビルドステップで、Cloud Source Repositories にリポジトリが作成されます。2 番目のステップでは、GitHub のサンプル リポジトリの内容のクローンを Cloud Source Repositories に作成します。3 番目のステップでは 2 つのビルドトリガーを追加します。
Cloud Source Repositories を開く
リポジトリ リストで
copy-of-gcp-mig-simple
をクリックします。ページの下部にある [履歴] タブでは、
copy-of-gcp-mig-simple
という名前のリポジトリを作成するために Cloud Build が作成した説明A copy of https://github.com/GoogleCloudPlatform/cloud-build-samples.git
を含む 1 つの commit が表示されます。Cloud Build の [トリガー] ページを開きます。
デプロイ プロセスを開始するには、
infra/main.tfvars
ファイルを更新します。ターミナル ウィンドウで、
deploy-compute-engine
という名前のフォルダを作成して移動します。mkdir ~/deploy-compute-engine cd ~/deploy-compute-engine
copy-of-gcp-mig-simple
リポジトリのクローンを作成します。gcloud source repos clone copy-of-mig-blue-green
クローン作成したディレクトリに移動します。
cd ./copy-of-mig-blue-green
infra/main.tfvars
を更新して、Blue を Green に置き換えます。sed -i'' -e 's/blue/green/g' infra/main.tfvars
更新したファイルを追加します。
git add .
ファイルを commit します。
git commit -m "Promote green"
ファイルを push します。
git push
infra/main.tfvars
を変更すると、apply
トリガーの実行がトリガーされ、デプロイが開始されます。
Cloud Source Repositories を開く
リポジトリ リストで
copy-of-gcp-mig-simple
をクリックします。ページの下部にある [履歴] タブに、
Promote green
と記述された commit が表示されます。apply
トリガーの実行を表示するには、Google Cloud コンソールで [ビルド履歴] ページを開きます。最初のビルドをクリックして、[ビルドの詳細] ページを開きます。
2 つのビルドステップを含む
apply
トリガー パイプラインが表示されます。最初のビルドステップでは、Terraform apply を実行して、Compute Engine とデプロイのロード バランシング リソースを作成します。2 番目のビルドステップでは、アプリケーションが実行されている IP アドレスを出力します。ブラウザで、Green MIG に対応する IP アドレスを開きます。デプロイメントを示す次のようなスクリーンショットが表示されます。
Compute Engine の [インスタンス グループ] ページに移動して、Blue と Green のインスタンス グループを表示します。
[VM インスタンス] ページを開き、次の 4 つの VM インスタンスを確認します。
[外部 IP アドレス] ページを開き、次の 3 つのロードバランサを確認します。
apply
と destroy
という名前の 2 つのビルドトリガーが表示されます。apply
トリガーは main
ブランチの infra/main.tfvars
ファイルにアタッチされています。このトリガーは、ファイルが更新されるたびに実行されます。destroy
トリガーは手動トリガーです。
コードについて
このコードサンプルのソースコードには以下が含まれます。
- セットアップ スクリプトに関連するソースコード。
- Cloud Build パイプラインに関連するソースコード。
- Terraform テンプレートに関連するソースコード。
セットアップ スクリプト
setup.sh
が、ブートストラップ プロセスを実行して Blue/Green デプロイのコンポーネントを作成するセットアップ スクリプトです。このスクリプトは、次の操作を実行します。
- Cloud Build、Resource Manager、Compute Engine、Cloud Source Repositories API を有効にします。
- プロジェクトの Cloud Build サービス アカウントに
roles/editor
IAM ロールを付与します。このロールは、Cloud Build がデプロイに必要な GitOps コンポーネントを作成して設定するために必要です。 - プロジェクトの Cloud Build サービス アカウントに
roles/source.admin
IAM ロールを付与します。このロールは、Cloud Build サービス アカウントがプロジェクトに Cloud Source Repositories を作成し、サンプル GitHub リポジトリの内容を Cloud Source Repositories にクローン作成するために必要です。 次のように、
bootstrap.cloudbuild.yaml
という名前の Cloud Build パイプラインをインラインで生成します。- Cloud Source Repositories に新しいリポジトリを作成します。
- サンプルの GitHub リポジトリから Cloud Source Repositories の新しいリポジトリにソースコードをコピーします。
- 適用ビルドトリガーと破棄ビルドトリガーを作成します。
Cloud Build パイプライン
apply.cloudbuild.yaml
と destroy.cloudbuild.yaml
は、セットアップ スクリプトが GitOps フローのリソースを設定するために使用する Cloud Build 構成ファイルです。apply.cloudbuild.yaml
には、2 つのビルドステップがあります。
- Terraform をインストールする
tf_install_in_cloud_build_step
関数を呼び出すtf_apply build
ビルドステップ。tf_apply
は、GitOps フローで使用されるリソースを作成します。関数tf_install_in_cloud_build_step
とtf_apply
はbash_utils.sh
で定義され、ビルドステップはsource
コマンドを使用してこれらの関数を呼び出します。 - ロードバランサの IP アドレスを出力する
describe_deployment
関数を呼び出すdescribe_deployment
ビルドステップ。
destroy.cloudbuild.yaml
は、tf_apply
によって作成されたすべてのリソースを削除する tf_destroy
を呼び出します。
関数 tf_install_in_cloud_build_step
、tf_apply
、describe_deployment
、tf_destroy
は、bash_utils.sh
ファイルで定義されています。ビルド構成ファイルは、source
コマンドを使用して関数を呼び出します。
次のコードでは、bash_utils.sh
で定義されている関数 tf_install_in_cloud_build_step
を示します。ビルド構成ファイルがこの関数を呼び出して、Terraform をその場でインストールします。Terraform のステータスを記録する Cloud Storage バケットが作成されます。
次のコード スニペットでは、bash_utils.sh
で定義されている関数 tf_apply
を示します。まず、すべてのモジュールとカスタム ライブラリを読み込む terraform init
を呼び出し、次に terraform apply
を実行して main.tfvars
ファイルから変数を読み込みます。
次のコード スニペットでは、bash_utils.sh
で定義されている関数 describe_deployment
を示します。gcloud compute addresses describe
を使用し、名前でロードバランサの IP アドレスを取得して出力します。
次のコード スニペットでは、bash_utils.sh
で定義されている関数 tf_destroy
を示します。すべてのモジュールとカスタム ライブラリを読み込む terraform init
を呼び出して、Terraform 変数をアンロードする terraform destroy
を実行します。
Terraform テンプレート
すべての Terraform 構成ファイルと変数は、copy-of-gcp-mig-simple/infra/
フォルダにあります。
main.tf
: Terraform 構成ファイルです。main.tfvars
: このファイルで Terraform 変数を定義します。mig/
とsplitter/
: これらのフォルダには、ロードバランサを定義するモジュールが含まれています。mig/
フォルダには、Blue ロードバランサと Green ロードバランサの MIG を定義する Terraform 構成ファイルが含まれています。Blue MIG と Green MIG は、同じであるため、Blue オブジェクトと Green オブジェクト用に 1 回定義され、インスタンス化されます。スプリッター ロードバランサの Terraform 構成ファイルは、splitter/
フォルダにあります。
次のコード スニペットでは、infra/main.tfvars
の内容を示します。これには、Blue プールと Green プールにデプロイするアプリケーションのバージョンを決定する 2 つの変数と、アクティブな色(Blue または Green)の変数が含まれます。このファイルに変更を加えると、デプロイがトリガーされます。
infra/main.tf
のコード スニペットは次のとおりです。このスニペットでは:
- Google Cloud プロジェクト用に変数が定義されます。
- Google は Terraform プロバイダとして設定されます。
- 名前空間用に変数が定義されます。Terraform で作成したすべてのオブジェクトには、この接頭辞が付けられるため、アプリケーションの複数のバージョンを同じプロジェクトにデプロイでき、オブジェクト名は互いに競合しません。
- 変数
MIG_VER_BLUE
、MIG_VER_BLUE
、MIG_ACTIVE_COLOR
は、infra/main.tfvars
ファイル内の変数に対するバインディングです。
infra/main.tf
の次のコード スニペットでは、スプリッター モジュールのインスタンス化を示します。このモジュールは、分配ロードバランサがアプリケーションをデプロイする MIG を認識できるように、アクティブ カラーを取得します。
次に示す infra/main.tf
のコード スニペットでは、Blue MIG と Green MIG に対する 2 つの同じモジュールを定義します。これはスプリッター モジュールで定義されたカラー、ネットワーク、サブネットワークを取得します。
ファイル splitter/main.tf
では、スプリッター MIG 用に作成されるオブジェクトを定義します。splitter/main.tf
のコード スニペットを次に示します。これには、Green MIG と Blue MIG を切り替えるロジックが含まれています。これは google_compute_region_backend_service
サービスを基盤としており、var.instance_group_blue
または var.instance_group_green
の 2 つのバックエンド リージョンにトラフィックを転送できます。capacity_scaler
では、転送するトラフィックの量を定義します。
次のコードでは、トラフィックの 100% が指定された色に転送されますが、このコードをカナリア デプロイで更新して、そのトラフィックをユーザーのサブセットに転送できます。
ファイル mig/main.tf
では、Blue MIG と Green MIG に関連するオブジェクトが定義されています。このファイルの次のコード スニペットでは、VM プールの作成に使用される Compute Engine インスタンス テンプレートを定義します。このインスタンス テンプレートでは、Terraform ライフサイクル プロパティが create_before_destroy
に設定されます。これはプールのバージョンを更新する際、テンプレートが以前のバージョンのプールでまだ使用されている場合に、そのテンプレートで新しいバージョンのプールを作成できないためです。ただし、新しいテンプレートを作成する前に古いバージョンのプールが破棄された場合、プールが停止する期間があります。このシナリオを回避するため、Terraform のライフサイクルを create_before_destroy
に設定して、古いバージョンが破棄される前に新しいバージョンの VM プールが最初に作成されるようにします。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
リソースを個別に削除する
適用トリガーによって作成された Compute Engine リソースを削除します。
Cloud Build の [トリガー] ページを開きます。
[トリガー] テーブルで、destroy トリガーに対応する行を見つけて、[実行] をクリックします。トリガーの実行が完了すると、apply トリガーによって作成されたリソースが削除されます。
ターミナル ウィンドウで次のコマンドを実行して、ブートストラップ中に作成されたリソースを削除します。
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/teardown.sh)
プロジェクトの削除
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
次のステップ
- ビルドトリガーの詳細を確認する。
- ビルドの来歴を表示する方法を確認する。