Cloud Deploy でのリリース プロモーションとロールアウト進行の自動化
このページでは、Cloud Deploy を使用して自動的にリリースをターゲットに昇格し、次のフェーズにロールアウトを進める方法について説明します。
このクイックスタートでは、以下の内容を行います。
2 つの GKE クラスタまたは 2 つの Cloud Run サービスを作成します。
Skaffold 構成および、Kubernetes マニフェストまたは Cloud Run サービス定義のいずれかを作成します。
Cloud Deploy デリバリー パイプラインとデプロイ ターゲットを定義します。
このパイプラインは、
devとstagingの 2 つのターゲットにデプロイされます。また、stagingターゲットは カナリア デプロイ戦略を使用します。次の 2 つの自動化ルールを定義します。
devへのロールアウトが成功すると、stagingターゲットにリリースを昇格させる自動化。canary-25フェーズが正常に完了するとstableフェーズにロールアウトを進める自動化。
リリースを作成してデリバリー パイプラインをインスタンス化します。リリースは自動的に
devターゲットにデプロイされます。Google Cloud コンソールでデリバリー パイプラインとリリースを表示します。
自動プロモーションにより、このリリースは自動的に
stagingに昇格します。stagingターゲットはカナリア デプロイ戦略を使用し、さらにこのランタイムに対する初回のデプロイとなるため、canary-25フェーズはスキップされます。カナリア フェーズが初回にスキップされる理由について詳しくは、フェーズがスキップされることがある理由をご覧ください。フェーズの自動進行により、ロールアウトは
stableフェーズに進みます。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage 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.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage 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.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init - デフォルトの Compute Engine サービス アカウントに十分な権限があることを確認します。
このサービス アカウントにはすでに必要な権限が付与されている場合があります。これらの手順は、デフォルトのサービス アカウントの自動的なロール付与を無効にするプロジェクトに含まれています。
- 最初に、
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/clouddeploy.jobRunner" clouddeploy.releaserロールを追加します。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.releaser"- 特定のランタイム向けのデベロッパー ロールを追加します。
- GKE の場合:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/container.developer" - Cloud Run の場合:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/run.developer" -
iam.serviceAccountUserロールを追加します。これには、デフォルト サービス アカウントがランタイムにデプロイするactAs権限が含まれます。gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID -
actAs権限を含むiam.serviceAccountUserロールをご自身に追加してデフォルト サービス アカウントを使用します。gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=user:YOUR_EMAIL_ADDRESS \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_IDこの場合、YOUR_EMAIL_ADDRESS は Google Cloud へのアクセスに使用するメールアドレスです。
- 最初に、
CLI がすでにインストールされている場合は、最新バージョンを実行していることを確認してください。
gcloud components update
ランタイム環境を作成する
Cloud Run にデプロイする場合は、以下のコマンドをスキップできます。
GKE の場合は、デフォルト設定で automation-quickstart-cluster-dev と automation-quickstart-cluster-staging の 2 つのクラスタを作成します。クラスタの Kubernetes API エンドポイントは、公共のインターネットからネットワークに到達可能である必要があります。
GKE クラスタには、デフォルトで外部からアクセス可能です。
gcloud container clusters create-auto automation-quickstart-cluster-dev \
--project=PROJECT_ID \
--region=us-central1 \
&& gcloud container clusters create-auto automation-quickstart-cluster-staging \
--project=PROJECT_ID \
--region=us-central1
プロジェクト番号を取得する
デフォルトのサービス アカウントを識別するには、プロジェクト番号が必要です。これは、自動化リソースの構成に必要です。
次のコマンドを実行して、プロジェクト番号を取得します。
gcloud projects describe PROJECT_ID --format="value(projectNumber)"コマンドライン出力からプロジェクト番号をコピーし、こちらに貼り付けます。
これをコマンドとして実行する必要はありません。こちらに貼り付けると、このクイックスタートの後半にある自動化構成ファイルにサービス アカウントのリファレンスが追加されます。
PROJECT_NUMBER
Skaffold 構成とアプリケーション マニフェストを準備する
Cloud Deploy では、Skaffold を使用して、デプロイする対象と、個々のターゲットに適切にデプロイする方法の詳細を提供します。
このクイックスタートでは、skaffold.yaml ファイルを作成して、サンプルアプリのデプロイに使用する アプリケーション マニフェストを識別します。
ターミナル ウィンドウを開きます。
新しいディレクトリを作成し、そのディレクトリに移動します。
GKE
mkdir deploy-automation-gke-quickstart cd deploy-automation-gke-quickstartCloud Run
mkdir deploy-automation-run-quickstart cd deploy-automation-run-quickstart次の内容のファイルを
skaffold.yamlという名前で作成します。GKE
apiVersion: skaffold/v4beta7 kind: Config metadata: name: gke-automation manifests: rawYaml: - k8s-deployment.yaml deploy: kubectl: {}Cloud Run
apiVersion: skaffold/v4beta7 kind: Config metadata: name: run-automation profiles: - name: dev manifests: rawYaml: - run-dev.yaml - name: staging manifests: rawYaml: - run-staging.yaml deploy: cloudrun: {}このファイルは最小限の Skaffold 構成ファイルです。このクイックスタートでは、このファイルを作成します。ただし、Cloud Deploy で作成することで、単純な非本番環境アプリケーション用に作成することもできます。
この構成ファイルの詳細については、
skaffold.yamlリファレンスをご覧ください。Cloud Run サービス定義のペアか、GKE Kubernetes マニフェストでアプリケーションの定義を作成します。
GKE
次の内容のファイルを
k8s-deployment.yamlという名前で作成します。apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app namespace: default spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: my-app-image --- apiVersion: v1 kind: Service metadata: name: my-service namespace: default spec: selector: app: my-app ports: - protocol: TCP port: 80このファイルは、アプリケーションのデプロイに使用される単純な Kubernetes マニフェストです。デプロイするコンテナ イメージは、プレースホルダ
my-app-imageとしてここに設定されます。これは、リリースを作成するときに特定のイメージに置き換えられます。Cloud Run
次の内容のファイルを
run-dev.yamlという名前で作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-automation-run-service-dev spec: template: spec: containers: - image: my-app-image次の内容のファイルを
run-staging.yamlという名前で作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-automation-run-service-staging spec: template: spec: containers: - image: my-app-image
これらのファイルは、アプリケーションのデプロイに使用される単純な Cloud Run サービス定義です。デプロイするコンテナ イメージは、プレースホルダ
my-app-imageとしてここに設定されます。このプレースホルダは、リリースを作成するときに特定のイメージに置き換えられます。
デリバリー パイプライン、ターゲット、自動化を作成する
デリバリー パイプラインとターゲットは、1 つのファイルまたは個別のファイルで定義できます。個別のファイルで自動化アクションを定義することもできます。このクイックスタートでは、パイプライン、ターゲット、自動化に 1 つのファイルを使用します。
デリバリー パイプライン、ターゲット定義、自動化のアクションを作成します。
GKE
deploy-automation-gke-quickstartディレクトリに、次の内容を含む新しいclouddeploy.yamlファイルを作成します。apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-automation-demo-app-1 description: Automation demonstration pipeline serialPipeline: stages: - targetId: automation-quickstart-dev - targetId: automation-quickstart-staging profiles: [] strategy: canary: runtimeConfig: kubernetes: serviceNetworking: service: "my-service" deployment: "my-deployment" canaryDeployment: percentages: [25] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-dev description: Dev cluster to demonstrate deploy automation gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-dev --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-staging description: Staging cluster to demonstrate deploy automation gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-staging --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/promote description: promotes a release suspended: false serviceAccount: PROdeveloper.gserviceaccount.comJECT_NUMBER-compute@ selector: targets: - id: automation-quickstart-dev rules: - promoteReleaseRule: id: "promote-release" wait: 1m destinationTargetId: "@next" --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/advance description: advances a rollout suspended: falsedeveloper.gserviceaccount.com serviceAccount: PROJECT_NUMBER-compute@ selector: targets: - id: automation-quickstart-staging rules: - advanceRolloutRule: id: "advance-rollout" sourcePhases: ["canary-25"] wait: 1mCloud Run
deploy-automation-run-quickstartディレクトリに、次の内容を含む新しいclouddeploy.yamlファイルを作成します。apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-automation-demo-app-1 description: Automation demonstration pipeline serialPipeline: stages: - targetId: automation-quickstart-dev profiles: [dev] - targetId: automation-quickstart-staging profiles: [staging] strategy: canary: runtimeConfig: cloudRun: automaticTrafficControl: true canaryDeployment: percentages: [25] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-dev description: Dev cluster to demonstrate deploy automation run: location: projects/PROJECT_ID/locations/us-central1 --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-staging description: Staging cluster to demonstrate deploy automation run: location: projects/PROJECT_ID/locations/us-central1 --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/promote description: Promotes a release to the next target suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: targets: - id: automation-quickstart-dev rules: - promoteReleaseRule: id: "promote-release" wait: 1m destinationTargetId: "@next" --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/advance description: advances a rollout suspended: false serviceAccount: PROdeveloper.gserviceaccount.comJECT_NUMBER-compute@ selector: targets: - id: automation-quickstart-staging rules: - advanceRolloutRule: id: "advance-rollout" sourcePhases: ["canary-25"] wait: 1mパイプラインとターゲットを Cloud Deploy サービスに登録します。
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_IDこれで、2 つの GKE ターゲットまたは Cloud Run ターゲットから成るマルチターゲットを有するパイプラインが作成されました。これで、アプリケーションをデプロイする準備が整いました。
次のとおりに、パイプラインとターゲットを確認します。
Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動し、使用可能なデリバリー パイプラインのリストを表示します。
作成したデリバリー パイプラインが表示され、[ターゲット] 列に 2 つのターゲットが表示されます。

パイプライン名をクリックして、デリバリー パイプラインの可視化を開きます。
[配信パイプラインの詳細] で、[自動化] タブを選択します。
作成した 2 つの自動化が表示されます。

リリースを作成する
リリースは Cloud Deploy リソースの中心で、デプロイの変更を表します。デリバリー パイプラインは、そのリリースのライフサイクルを定義します。このライフサイクルの詳細については、Cloud Deploy のサービス アーキテクチャをご覧ください。
GKE
deploy-automation-gke-quickstart ディレクトリから次のコマンドを実行して、デプロイするコンテナ イメージを表す release リソースを作成します。
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-automation-demo-app-1 \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
--images= フラグに注目してください。このフラグは、マニフェスト内のプレースホルダ(my-app-image)を特定の SHA 修飾イメージに置き換えるために使用します。Google では、この方法でマニフェストをテンプレート化し、リリース作成時に SHA 修飾イメージ名を使用することをおすすめします。
Cloud Run
deploy-automation-run-quickstart ディレクトリから次のコマンドを実行して、デプロイするコンテナ イメージを表す release リソースを作成します。
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-automation-demo-app-1 \
--images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
--images= フラグに注目してください。これは、サービス定義のプレースホルダ(my-app-image)を特定の SHA 修飾イメージに置き換えるために使用します。この方法でサービスとジョブの定義をテンプレート化し、リリース作成時に SHA 修飾イメージ名を使用することをおすすめします。
デフォルトでは、リリースを作成すると、パイプラインの最初のターゲットに対してロールアウトが自動作成されます。
このクイックスタートには 2 つの自動化が含まれているため、次の 2 つのことが自動的に行われます。
最初のターゲットでデプロイが成功すると、リリースは 2 番目のターゲットに自動的に昇格します。
プロモートの自動化には 1 分の待機時間があります。
2 番目のターゲット(25% のカナリアが構成されている)では、2 番目の自動化によってロールアウトが
canary-25からstableに進行します。この最初のリリースでは、カナリア対応の既存バージョンのアプリが存在しないため、
canary-25フェーズはスキップされます。これにより、ロールアウトが自動的にstableに進みます。自動化の進行には 1 分の遅延があります。
すべてが完了すると、一切の操作を必要とせずにアプリケーションは両方のターゲットに正常にデプロイされます。
カナリア デプロイ戦略の実行に関する詳細は、カナリアのクイックスタートをお試しください。
Google Cloud コンソールで結果を表示する
自動化の実行などの結果はGoogle Cloud コンソールで確認できます。
Cloud Deploy の [デリバリー パイプライン] ページに移動して、デリバリー パイプラインを表示します。
デリバリー パイプラインの名前 [my-automation-demo-app-1] をクリックします。
可視化されたパイプラインでは、アプリのデプロイ ステータスが表示されます。十分な時間が経過すると、両方のターゲットが緑色で表示されます。

リリースが [デリバリー パイプラインの詳細] の下の [リリース] タブに表示されます。
[自動化の実行] タブをクリックします。
作成した 2 つの自動化に 1 つずつ、2 つのエントリが存在します。そのいずれかをクリックすると、その自動化実行の詳細が表示されます。

クリーンアップ
このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、次の手順を実施します。
GKE クラスタまたは Cloud Run サービスを削除します。
GKE
gcloud container clusters delete automation-quickstart-cluster-dev --region=us-central1 --project=PROJECT_ID \ && gcloud container clusters delete automation-quickstart-cluster-staging --region=us-west1 --project=PROJECT_IDCloud Run
gcloud run services delete my-automation-run-service-dev --region=us-central1 --project=PROJECT_ID \ && gcloud run services delete my-automation-run-service-staging --region=us-central1 --project=PROJECT_IDデリバリー パイプライン、ターゲット、自動化、リリース、ロールアウトを削除します。
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_IDCloud Deploy によって作成された Cloud Storage バケットを削除します。
1 つは
_clouddeployで終わり、もう 1 つは[region].deploy-artifacts.[project].appspot.comで終わります。
これでクイックスタートの演習はすべて終了です。