デプロイ ポリシーを使用してロールアウトを制限する

このクイックスタートでは、指定した時間内にターゲットへの Cloud Deploy のロールアウトを防ぐ方法と、その制限をオーバーライドする方法について説明します。

このクイックスタートでは、以下の内容を行います。

  1. Skaffold 構成と Kubernetes マニフェストまたは Cloud Run サービス定義を作成して、デプロイする(ビルド済みの)コンテナ イメージを指定します。

  2. Cloud Deploy デリバリー パイプラインと 1 つのデプロイ ターゲットを定義し、1 つの GKE クラスタまたは Cloud Run サービスを指定します。

    このパイプラインには、1 つのターゲットに対して 1 つのステージのみが含まれます。

  3. ターゲットに対するデプロイ ポリシーを構成します。

    このポリシーでは、そのターゲットへのロールアウトを禁止する期間を定義します。

  4. リリースを作成します。

    通常、リリースを作成すると、Cloud Deploy はデリバリー パイプラインの進行で最初のターゲットに対するロールアウトを作成します。この場合、ターゲットへのデプロイを禁止するポリシーがあるため、そのターゲットに対するロールアウトは作成されません。

  5. Google Cloud コンソールで結果を表示します。

    ポリシーにより、リリースに対するロールアウトは表示されず、デリバリー パイプラインの可視化に保留中のアクションがありません。

  6. デプロイ ポリシーをオーバーライドします。

    このオーバーライドにより、Cloud Deploy ではターゲットに対するロールアウトが作成されます。

  7. 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Deploy, Cloud Build, GKE, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Deploy, Cloud Build, GKE, and Cloud Storage APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Google Cloud CLI がすでにインストールされている場合は、最新バージョンを実行していることを確認してください。

    gcloud components update
    
  13. デフォルトの Compute Engine サービス アカウントに十分な権限があることを確認します。

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

    1. 最初に、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"
      
    2. clouddeploy.policyAdmin ロールを追加します。
      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.policyAdmin"
      
    3. 特定のランタイム向けのデベロッパー ロールを追加します。
      • 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"
        

    4. 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
      

ランタイム環境を作成する

Cloud Run にデプロイする場合は、以下のコマンドをスキップできます

GKE の場合は、クラスタを 1 つ作成します(quickstart-cluster-qsprod)。クラスタの Kubernetes API エンドポイントは、公共のインターネットからネットワークに到達可能である必要があります。GKE クラスタには、デフォルトで外部からアクセス可能です。

gcloud container clusters create-auto quickstart-cluster-qsprod \
                 --project=PROJECT_ID \
                 --region=us-central1

Skaffold 構成とアプリケーション マニフェストを準備する

Cloud Deploy では、Skaffold を使用して、デプロイする対象と、それをターゲットにデプロイする方法の詳細を提供します。

このクイックスタートでは、skaffold.yaml ファイルを作成して、サンプルアプリのデプロイに使用する Kubernetes マニフェストを識別します。

  1. ターミナル ウィンドウを開きます。

  2. 新しいディレクトリを作成し、そのディレクトリに移動します。

    GKE

    mkdir deploy-policy-quickstart
    cd deploy-policy-quickstart
    

    Cloud Run

    mkdir deploy-policy-quickstart
    cd deploy-policy-quickstart
    
  3. 次の内容のファイルを skaffold.yaml という名前で作成します。

    GKE

    apiVersion: skaffold/v4beta1
    kind: Config
    manifests:
      rawYaml:
      - k8s-pod.yaml
    deploy:
      kubectl: {}
    

    Cloud Run

    apiVersion: skaffold/v4beta1
    kind: Config
    manifests:
      rawYaml:
      - service.yaml
    deploy:
      cloudrun: {}
    

    このファイルは、最小限の Skaffold 構成ファイルです。このクイックスタートでは、このファイルを作成します。ただし、Cloud Deploy で作成することで、基本的な非本番環境アプリケーション用に作成することもできます。

    この構成ファイルの詳細については、skaffold.yaml リファレンスをご覧ください。

  4. アプリケーションのマニフェスト(Cloud Run サービス定義か GKE Kubernetes マニフェスト)を作成します。

    GKE

    次の内容のファイルを k8s-pod.yaml という名前で作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: getting-started
    spec:
      containers:
      - name: nginx
        image: my-app-image
    

    このファイルは、基本的な Kubernetes マニフェストであり、アプリケーションをデプロイするためにクラスタに適用されます。

    Cloud Run

    次の内容のファイルを service.yaml という名前で作成します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: my-deploy-policy-run-service
    spec:
      template:
        spec:
          containers:
          - image: my-app-image
    

    このファイルは基本的な Cloud Run サービス定義であり、デプロイ時に Cloud Run サービスを作成するために使用されます。

デリバリー パイプラインとターゲットを作成する

デリバリー パイプラインとターゲットは、1 つのファイルまたは個別のファイルで定義できます。このクイックスタートでは、両方を含む 1 つのファイルを作成します。

  1. デリバリー パイプラインとターゲット定義を作成:

    GKE

    deploy-policy-quickstart ディレクトリに、次の内容を含む新しい clouddeploy.yaml ファイルを作成します。

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: deploy-policy-pipeline
    serialPipeline:
      stages:
      - targetId: prod-target
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: prod-target
    description: production cluster
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/quickstart-cluster-qsprod
    

    Cloud Run

    deploy-policy-quickstart ディレクトリに、次の内容を含む新しい clouddeploy.yaml ファイルを作成します。

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: deploy-policy-pipeline
    serialPipeline:
      stages:
      - targetId: prod-target
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: prod-target
    description: production Run service
    run:
      location: projects/PROJECT_ID/locations/us-central1
    
  2. パイプラインとターゲット リソースを Cloud Deploy サービスに登録します。

    gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
    

    これで、1 つのデリバリー パイプラインと 1つのターゲットが作成されました。

  3. 次のとおりに、パイプラインとターゲットを確認します。

    Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動し、使用可能なデリバリー パイプラインのリストを表示します。

    [デリバリー パイプライン] ページを開く

    作成したデリバリー パイプラインが表示され、[ターゲット] 列に 1 つのターゲットが一覧表示されます。

    パイプラインが表示された Google Cloud コンソールのデリバリー パイプライン ページ

デプロイ ポリシーを作成する

デプロイ ポリシーは、デリバリー パイプラインやターゲットと同じファイルで定義することも、別のファイルで定義することもできます。このクイックスタートでは、別に定義します。

  1. deploy-policy-quickstart ディレクトリに、次の内容を含む新しい deploypolicy.yaml ファイルを作成します。

    apiVersion: deploy.cloud.google.com/v1
    description: Restrict all rollouts in the deploy-policy-pipeline resource all the time
    kind: DeployPolicy
    metadata:
      name: quickstart-deploy-policy
    selectors:
    - deliveryPipeline:
        id: 'deploy-policy-pipeline'
    rules:
    - restrictRollouts:
        id: no-rollouts
        timeWindow:
          timeZone: America/New_York
          ranges:
          - startDate:
              day: 1
              month: 1
            endDate:
              month: 12
              day: 31
    

    このポリシーにより、1 月 1 日から 12 月 31 日までロールアウトがブロックされます。

  2. デプロイ ポリシー リソースを Cloud Deploy サービスに登録します。

    gcloud deploy apply --file=deploypolicy.yaml --region=us-central1 --project=PROJECT_ID
    
  3. デプロイ ポリシーを確認します。

    Google Cloud コンソールで、Cloud Deploy の [デプロイ ポリシー] ページに移動し、使用可能なポリシーのリストを表示します。

    [デプロイ ポリシー] ページを開く

    作成したデプロイ ポリシーが表示されます。

    Google Cloud コンソールの [ポリシーのデプロイ] ページ

リリースを作成する

リリースは Cloud Deploy リソースの中心で、デプロイの変更を表します。デリバリー パイプラインは、そのリリースのライフサイクルを定義します。このライフサイクルの詳細については、Cloud Deploy のサービス アーキテクチャをご覧ください。

GKE

deploy-policy-quickstart ディレクトリから次のコマンドを実行して、リリースを作成します。

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=deploy-policy-pipeline \
   --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa

Cloud Run

deploy-policy-quickstart ディレクトリから次のコマンドを実行して、リリースを作成します。

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=deploy-policy-pipeline \
   --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:6063adf8f687702b4065151acddba6781c47bc602167eb9f3bec8aebc9ce95cc

通常の状況では、このコマンドを使用してリリースを作成すると、Cloud Deploy は最初のターゲットへのロールアウトを作成します。この場合、デプロイ ポリシーに従ってロールアウトが制限されるため、ロールアウトは作成されません。コマンドラインにエラー メッセージが表示されます。

ERROR: (gcloud.deploy.releases.create) A create-rollout attempt was blocked by the "quickstart-deploy-policy" policy. Target: "prod-target", Delivery pipeline: "deploy-policy-pipeline", policy rule: "no rollouts"

ポリシー制限をオーバーライドする

デプロイ ポリシーによってブロックされているサンプル アプリケーションをデプロイするには、そのポリシーをオーバーライドする必要があります。これを行うには、このリリースに対する新しいロールアウトを作成します。今回は --override-deploy-policies オプションを含めます。

GKE

deploy-policy-quickstart ディレクトリから次のコマンドを実行して、リリースを作成します。

 gcloud deploy releases promote --release=test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=deploy-policy-pipeline \
   --to-target=prod-target \
   --override-deploy-policies=quickstart-deploy-policy

Cloud Run

deploy-policy-quickstart ディレクトリから次のコマンドを実行して、リリースを作成します。

 gcloud deploy releases promote --release=test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=deploy-policy-pipeline \
   --to-target=prod-target \
   --override-deploy-policies=quickstart-deploy-policy

--override-deploy-policies=quickstart-deploy-policy を含め、デフォルトのサービス アカウントに roles/clouddeploy.policyAdmin ロールがあるため、Cloud Deploy は作成したデプロイ ポリシーを無視し、prod-targetへのロールアウトを作成します。

Google Cloud コンソールで結果を表示する

  1. Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに戻り、デリバリー パイプライン(deploy-policy-pipeline)を表示します。

    [デリバリー パイプライン] ページを開く

  2. デリバリー パイプライン(deploy-policy-pipeline)の名前をクリックします。

    可視化されたパイプラインでは、アプリのデプロイ ステータスが表示されます。この例では、ポリシーがオーバーライドされているため、ロールアウトが作成され、成功しています。

    ロールアウトを示すデリバリー パイプラインの可視化

    リリースが [デリバリー パイプラインの詳細] の下の [リリース] タブに表示されます。

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. GKE クラスタまたは Cloud Run サービスを削除します。

    GKE

    gcloud container clusters delete quickstart-cluster-qsprod --region=us-central1 --project=PROJECT_ID
    

    Cloud Run

    gcloud run services delete my-deploy-policy-run-service --region=us-central1 --project=PROJECT_ID
    
  2. デプロイ ポリシーを削除します。

    gcloud deploy delete --file=deploypolicy.yaml --region=us-central1 --project=PROJECT_ID
    
  3. 次のように、デリバリー パイプライン、ターゲット、リリース、ロールアウトを削除します。

    gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
    
  4. Cloud Deploy によって作成された Cloud Storage バケットを両方とも削除します。

    Cloud Storage ブラウザページを開く

これでクイックスタートの演習はすべて終了です。

次のステップ