Compute Engine にデプロイ (original) (raw)


このガイドでは、Cloud Build と Terraform を使用して Compute Engine マネージド インスタンス グループ(MIG)でダウンタイムなしの Blue/Green デプロイを行う方法について説明します。

Cloud Build を使用すると、さまざまな Google Cloud ランタイム(Compute Engine、Google Kubernetes EngineGKE EnterpriseCloud Run functions など)へのアプリケーションのビルドとデプロイなど、さまざまなデベロッパー プロセスを自動化できます。

Compute Engine MIG を使用すると、複数の同じ仮想マシン(VM)でアプリケーションを操作できます。自動スケーリング、自動修復、リージョン(マルチゾーン)デプロイ、自動更新などの自動化 MIG サービスを活用することで、ワークロードのスケーラビリティと高可用性を実現できます。Blue/Green 継続的デプロイモデルを使用して、ユーザー トラフィックを、ある MIG(Blue)から別の MIG(Green)に段階的に転送する方法について学習します。MIG は、どちらも本番環境で実行されます。

デザインの概要

次の図では、このドキュメントで説明するコードサンプルで使用される Blue / Green デプロイモデルを示します。

Blue/Green モデル

大まかに表現すると、このモデルには、次のコンポーネントが含まれています。

Blue と Green の VM プールは Compute Engine MIG として実装され、外部 IP アドレスは、外部 HTTP(S) ロードバランサを使用して MIG の VM に転送されます。このドキュメントで説明するコードサンプルでは、Terraform を使用してこのインフラストラクチャを構成します。

次の図では、デプロイで発生するデベロッパー オペレーションを示します。

デベロッパー オペレーションのフロー

上の図では、赤い矢印はデプロイメント インフラストラクチャを初めて設定するときに発生するブートストラップ フローを表し、青い矢印はすべてのデプロイ中に発生する GitOps のフローを表しています。

このインフラストラクチャを設定するには、ブートストラップ プロセスを開始して GitOps フロー用のコンポーネントを設定するセットアップ スクリプトを実行します。

セットアップ スクリプトは、次のオペレーションを実行する Cloud Build パイプラインを実行します。

apply トリガーは、Cloud Source Repositories の main.tfvars という名前の Terraform ファイルにアタッチされています。このファイルには、Blue ロードバランサと Green ロードバランサを表す Terraform 変数が含まれています。

デプロイを設定するには、main.tfvars ファイルの変数を更新します。apply トリガーは、tf_apply を実行し、次のオペレーションを実行する Cloud Build パイプラインを実行します。

destroy トリガーは手動でトリガーされ、apply トリガーによって作成されたすべてのリソースを削除します。

目標

費用

このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新規の Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. 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.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:
    gcloud init
  4. 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.
  5. Make sure that billing is enabled for your Google Cloud project.
  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:
    gcloud init
  8. 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.
  9. Make sure that billing is enabled for your Google Cloud project.

試してみる

  1. Google コードサンプル リポジトリから設定スクリプトを実行します。
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/setup.sh)  
  1. セットアップ スクリプトでユーザーの同意を求められたら、「yes」と入力します。
    スクリプトの実行は、数秒で完了します。
  2. Google Cloud コンソールで、Cloud Build の [ビルド履歴] ページを開きます。
    [ビルド履歴] ページを開く
  3. 最新のビルドをクリックします。
    [ビルドの詳細] ページが開き、3 つのビルドステップを含む Cloud Build パイプラインが表示されます。最初のビルドステップで、Cloud Source Repositories にリポジトリが作成されます。2 番目のステップでは、GitHub のサンプル リポジトリの内容のクローンを Cloud Source Repositories に作成します。3 番目のステップでは 2 つのビルドトリガーを追加します。
  4. Cloud Source Repositories を開く
    Cloud Source Repositories を開く
  5. リポジトリ リストで 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 が表示されます。
  6. Cloud Build の [トリガー] ページを開きます。
    [トリガー] ページを開く

applydestroy という名前の 2 つのビルドトリガーが表示されます。apply トリガーは main ブランチの infra/main.tfvars ファイルにアタッチされています。このトリガーは、ファイルが更新されるたびに実行されます。destroy トリガーは手動トリガーです。

  1. デプロイ プロセスを開始するには、infra/main.tfvars ファイルを更新します。
    1. ターミナル ウィンドウで、deploy-compute-engine という名前のフォルダを作成して移動します。
    mkdir ~/deploy-compute-engine  
    cd ~/deploy-compute-engine  
    1. copy-of-gcp-mig-simple リポジトリのクローンを作成します。
    gcloud source repos clone copy-of-mig-blue-green  
    1. クローン作成したディレクトリに移動します。
    cd ./copy-of-mig-blue-green  
    1. infra/main.tfvars を更新して、Blue を Green に置き換えます。
    sed -i'' -e 's/blue/green/g' infra/main.tfvars  
    1. 更新したファイルを追加します。
    git add .  
    1. ファイルを commit します。
    git commit -m "Promote green"  
    1. ファイルを push します。
    git push  

    infra/main.tfvars を変更すると、apply トリガーの実行がトリガーされ、デプロイが開始されます。

  2. Cloud Source Repositories を開く
    Cloud Source Repositories を開く
  3. リポジトリ リストで copy-of-gcp-mig-simple をクリックします。
    ページの下部にある [履歴] タブに、Promote green と記述された commit が表示されます。
  4. apply トリガーの実行を表示するには、Google Cloud コンソールで [ビルド履歴] ページを開きます。
    [ビルド履歴] ページを開く
  5. 最初のビルドをクリックして、[ビルドの詳細] ページを開きます。
    2 つのビルドステップを含む apply トリガー パイプラインが表示されます。最初のビルドステップでは、Terraform apply を実行して、Compute Engine とデプロイのロード バランシング リソースを作成します。2 番目のビルドステップでは、アプリケーションが実行されている IP アドレスを出力します。
  6. ブラウザで、Green MIG に対応する IP アドレスを開きます。デプロイメントを示す次のようなスクリーンショットが表示されます。
    デプロイ
  7. Compute Engine の [インスタンス グループ] ページに移動して、Blue と Green のインスタンス グループを表示します。
    [インスタンス グループ] ページを開く
  8. [VM インスタンス] ページを開き、次の 4 つの VM インスタンスを確認します。
    [VM インスタンス] ページを開く
  9. [外部 IP アドレス] ページを開き、3 つのロードバランサを確認します。
    [外部 IP アドレス] ページを開く

コードについて

このコードサンプルのソースコードには以下が含まれます。

セットアップ スクリプト

setup.sh が、ブートストラップ プロセスを実行して Blue/Green デプロイのコンポーネントを作成するセットアップ スクリプトです。このスクリプトは、次の操作を実行します。

Cloud Build パイプライン

apply.cloudbuild.yamldestroy.cloudbuild.yaml は、セットアップ スクリプトが GitOps フローのリソースを設定するために使用する Cloud Build 構成ファイルです。apply.cloudbuild.yaml には、2 つのビルドステップがあります。

destroy.cloudbuild.yaml は、tf_apply によって作成されたすべてのリソースを削除する tf_destroy を呼び出します。

関数 tf_install_in_cloud_build_steptf_applydescribe_deploymenttf_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/ フォルダにあります。

次のコード スニペットでは、infra/main.tfvars の内容を示します。これには、Blue プールと Green プールにデプロイするアプリケーションのバージョンを決定する 2 つの変数と、アクティブな色(Blue または Green)の変数が含まれます。このファイルに変更を加えると、デプロイがトリガーされます。

infra/main.tf のコード スニペットは次のとおりです。このスニペットでは:

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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

リソースを個別に削除する

  1. 適用トリガーによって作成された Compute Engine リソースを削除します。
    1. Cloud Build の [トリガー] ページを開きます。
      [トリガー] ページを開く
    2. [トリガー] テーブルで、destroy トリガーに対応する行を見つけて、[実行] をクリックします。トリガーの実行が完了すると、apply トリガーによって作成されたリソースが削除されます。
  2. ターミナル ウィンドウで次のコマンドを実行して、ブートストラップ中に作成されたリソースを削除します。
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

次のステップ