Cloud Code、Cloud Build、Google Cloud Deploy、GKE を使用したアプリの開発と配信

更新日: 2022 年 11 月 18 日

このチュートリアルでは、Google Cloud ツールの統合セットを使用して、開発、継続的インテグレーション(CI)、継続的デリバリー(CD)システムを設定し、使用する方法について説明します。このシステムを使用すると、アプリケーションを開発し、Google Kubernetes Engine(GKE)にデプロイできます。

このチュートリアルは、ソフトウェア デベロッパーとオペレーターの両方を対象としており、完了すると両方の役割を果たせます。まず、CI / CD パイプラインを設定するオペレーターの役割を果たします。このパイプラインの主要なコンポーネントは、Cloud BuildArtifact RegistryGoogle Cloud Deploy です。

次にデベロッパーとして機能し、Cloud Code を使用してアプリケーションを変更します。デベロッパーとして機能すると、このパイプラインが提供する統合されたエクスペリエンスが表示されます。

最後に、オペレータとして機能して、アプリケーションを本番環境にデプロイする手順を実行します。

このチュートリアルは、Google Cloud での gcloud コマンドの実行と GKE へのアプリケーション コンテナのデプロイに精通していることを前提としています。

この統合システムの主な特徴は次のとおりです。

  • 開発とデプロイが迅速になります

    デベロッパー ワークスペースで変更を検証できるため、開発ループが効率的です。自動化された CI/CD システムと環境間のパリティの向上により、本番環境に変更を展開する際に、より多くの問題を検出できるため、デプロイが高速化されます。

  • 開発、ステージング、本番環境全体で一貫性の向上によるメリットを享受できます

    このシステムのコンポーネントは、共通の Google Cloud ツールセットを使用します。

  • さまざまな環境で構成を再利用します

    こうした再利用は Skaffold を使用して行われますが、Skaffold は異なる環境に対して共通の構成形式を認めます。また、デベロッパーとオペレーターが同じ構成を更新して使用することもできます。

  • ワークフローの早い段階でガバナンスを適用します。

    このシステムでは、本番環境、CI システム、開発環境でガバナンスに関する検証テストが適用されます。開発環境では、ガバナンスを適用することで、問題を検出し、早期に修正できます。

  • 独自のツールでソフトウェア配信を管理します。

    継続的デリバリーはフルマネージドであり、CD パイプラインのステージをレンダリングやデプロイの細部から分離します。

アーキテクチャの概要

次の図に、このチュートリアルで使用するリソースを示します。

Cloud Code、Cloud Build、Artifact Registry、Google Cloud Deploy、GKE を使用したシステムの開発とデプロイ

このパイプラインを構成する 3 つの主要コンポーネントは次のとおりです。

  1. 開発ワークスペースとしての Cloud Code

    このワークスペースの一部として、minikube で実行される開発クラスタで変更を確認できます。Cloud Shell で Cloud Code と minikube クラスタを実行します。Cloud Shell は、ブラウザからアクセスできるオンライン開発環境です。コンピューティング リソース、メモリ、統合開発環境(IDE)を備え、Cloud Code もインストールされます。

  2. アプリケーションのビルドとテストを行うための Cloud Build(パイプラインの「CI」部分)

    パイプラインのこの部分には、次のアクションが含まれます。

    • Cloud Build は、Cloud Build トリガーを使用して、ソース リポジトリに対する変更をモニタリングします。
    • メインブランチに変更が commit されると、Cloud Build トリガーは次の処理を行います。
      • アプリケーション コンテナを再構築します。
      • ビルド アーティファクトを Cloud Storage バケットに配置します。
      • アプリケーション コンテナを Artifact Registry に配置します。
      • コンテナでテストを実行します。
      • Google Cloud Deploy を呼び出して、コンテナをステージング環境にデプロイします。このチュートリアルでは、ステージング環境は Google Kubernetes Engine クラスタです。
    • ビルドとテストが成功したら、Google Cloud Deploy を使用して、ステージング環境から本番環境にコンテナを昇格できます。
  3. デプロイを管理するための Google Cloud Deploy(パイプラインの「CD」部分)

    パイプラインのこの部分では、Google Cloud Deploy が次の処理を行います。

    • 配信パイプラインターゲットを登録します。ターゲットはステージング クラスタと本番環境クラスタを表します。
    • Cloud Storage バケットを作成し、Skaffold レンダリング ソースとレンダリングされたマニフェストを作成したバケットに保存します。
    • ソースコードを変更するたびに新しいリリースを行います。このチュートリアルには 1 つの変更点があるため、新しいリリースを 1 つ行います。
    • アプリケーションを本番環境にデプロイします。この本番環境へのデプロイでは、運用担当者(または指定した人)がデプロイを手動で承認します。このチュートリアルでは、本番環境は Google Kubernetes Engine クラスタです。

Kubernetes ネイティブ アプリケーションの継続的な開発を容易にするコマンドライン ツールである Skaffold は、これらのコンポーネントの基盤であり、開発、ステージング、本番環境の間で構成を共有できます。

Google Cloud はアプリケーションのソースコードを GitHub に保存します。このチュートリアルの一環として、このリポジトリのクローンを Cloud Source Repositories に作成して、CI / CD パイプラインに接続します。

このチュートリアルでは、システムのほとんどのコンポーネントで Google Cloud プロダクトを使用し、Skaffold でシステムを統合しています。Skaffold はオープンソースであるため、このような原則で Google Cloud、社内コンポーネント、サードパーティ コンポーネントを組み合わせて同様のシステムを作成できます。このソリューションはモジュール方式を採用しているため、開発パイプラインとデプロイ パイプラインの一部として段階的に導入できます。

目標

オペレーターとして、次の操作を行います。

  • CI パイプラインと CD パイプラインを設定します。この設定には次のものが含まれます。
    • 必要な権限を設定する。
    • ステージング環境と本番環境用の GKE クラスタを作成する。
    • ソースコード用のリポジトリを Cloud Source Repositories に作成する。
    • アプリケーション コンテナ用のリポジトリを Artifact Registry に作成する。
    • メインの GitHub リポジトリに Cloud Build トリガーを作成する。
    • Google Cloud Deploy デリバリー パイプラインとターゲットを作成する。ターゲットはステージング環境と本番環境です。
  • ステージング環境にデプロイする CI / CD プロセスを開始し、本番環境に昇格させる。

開発者として、アプリケーションに変更を加えます。手順は次のとおりです。

  • 事前構成された開発環境と連携するように、リポジトリのクローンを作成する。
  • デベロッパー ワークスペース内でアプリケーションを変更する
  • 変更をビルドおよびテストします。テストには、ガバナンスの検証テストが含まれます。
  • 開発クラスタで変更を表示して検証します。このクラスタは minikube で実行されます。
  • メイン リポジトリに変更を commit する。

費用

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

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

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

始める前に

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. Artifact Registry, Cloud Build, Google Cloud Deploy, Cloud Source Repositories, Google Kubernetes Engine, Resource Manager, and Service Networking API を有効にします。

    API を有効にする

  4. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

環境を準備する

このセクションでは、アプリケーション オペレーターとして、次の処理を行います。

  • 必要な権限を設定する。
  • ステージング環境と本番環境用の GKE クラスタを作成する。
  • ソース リポジトリのクローンを作成する
  • ソースコード用のリポジトリを Cloud Source Repositories に作成する。
  • コンテナ アプリケーション用のリポジトリを Artifact Registry に作成します。

権限を設定する

このセクションでは、CI / CD パイプラインの設定に必要な権限を付与します。

  1. Cloud Shell エディタの新しいインスタンスで作業している場合は、このチュートリアルで使用するプロジェクトを指定します。

    gcloud config set project PROJECT_ID
    

    PROJECT_ID は、このチュートリアルで選択または作成したプロジェクトの ID に置き換えます。

    ダイアログが表示された場合は、[承認] をクリックします。

  2. サービス アカウントに必要な権限を付与します。

    1. デフォルトの Compute Engine サービス アカウントに、Google Cloud Deploy でジョブを実行して Artifact Registry からコンテナを pull できる十分な権限があることを確認します。Cloud Build と Google Cloud Deploy では、このデフォルトのサービス アカウントが使用されます。

      このサービス アカウントにはすでに必要な権限が付与されている場合があります。 この手順により、デフォルトのサービス アカウントに対する自動的なロール付与を無効にするプロジェクトに必要な権限が付与されます。

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/clouddeploy.jobRunner"
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/artifactregistry.reader"
      
    2. Google Cloud Deploy を使用してデプロイを呼び出し、配信パイプラインとターゲットの定義を更新する Cloud Build サービス アカウント権限を付与します。

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")@clou