このガイドでは、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 は、どちらも本番環境で実行されます。
始める前に
-
Enable the Cloud Build, Cloud Run, Artifact Registry, and Resource Manager APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
アプリケーションのソースコードを用意します。 ソースコードは、GitHub や Bitbucket などのリポジトリに保存する必要があります。
このページで
gcloudコマンドを実行するには、Google Cloud CLI をインストールします。
必要な Identity and Access Management 権限
-
Google Cloud コンソールで、settings Cloud Build の [権限] ページに移動します。
指定した Cloud Build サービス アカウントまたはデフォルトの Cloud Build サービス アカウントで、次のロールのステータスを [有効] に設定します。
- Compute インスタンス管理者 v1(
roles/compute.instanceAdmin)| Cloud Build が新しいインスタンスを Compute Engine にデプロイできるようにします。- [サービス アカウント ユーザーのロールを割り当てる] パネルで、権限を借用するサービス アカウントを選択し、[権限を付与] をクリックします。
- ストレージ管理者(
roles/storage.admin)| Cloud Storage からの読み取りと書き込みを有効にします。 - Artifact Registry 書き込み(
roles/artifactregistry.writer)| Artifact Registry からのイメージの pull と Artifact Registry への書き込みを許可します。 - ログ書き込み(
roles/logging.logWriter)| ログエントリを Cloud Logging に書き込むことができます。 - Cloud Build 編集者(
roles/cloudbuild.builds.editor)| サービス アカウントでビルドを実行できます。
- Compute インスタンス管理者 v1(
デザインの概要
次の図は、このドキュメントで説明するコードサンプルで使用される 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 アドレスを出力します。
破棄トリガーは手動でトリガーされ、適用トリガーによって作成されたすべてのリソースを削除します。
試してみる
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-enginecopy-of-gcp-mig-simpleリポジトリのクローンを作成します。gcloud source repos clone copy-of-mig-blue-greenクローン作成したディレクトリに移動します。
cd ./copy-of-mig-blue-greeninfra/main.tfvarsを更新して、Blue を Green に置き換えます。sed -i'' -e 's/blue/green/g' infra/main.tfvars更新したファイルを追加します。
git add .ファイルを commit します。
git commit -m "Promote green"ファイルを push します。
git pushinfra/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/editorIAM ロールを付与します。このロールは、Cloud Build がデプロイに必要な GitOps コンポーネントを作成して設定するために必要です。 - プロジェクトの Cloud Build サービス アカウントに
roles/source.adminIAM ロールを付与します。このロールは、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 プールが作成されるようにします。