デプロイの前後にフックを実行する

このクイックスタートでは、Cloud Deploy を使用してデプロイする前後に実行する任意のプログラムであるデプロイフックを実行する方法について説明します。

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

  1. GKE クラスタを 1 つ、または Cloud Run サービスを 1 つ作成します。

    GKE Enterprise クラスタも使用できますが、このクイックスタートでは GKE と Cloud Run のみを使用します。

  2. Skaffold 構成および、Kubernetes マニフェストまたは Cloud Run サービス定義のいずれかを作成します。

    Skaffold 構成ファイルで、実行するデプロイフックを構成します。デプロイ前に実行するコンテナと、デプロイ後に実行するコンテナを識別します。

  3. Cloud Deploy デリバリー パイプラインとデプロイ ターゲットを定義します。

    デリバリー パイプラインの構成で、skaffold.yaml で定義されたデプロイフックを参照して、これらのフックを実行します。

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

  4. リリースを作成します。リリースは自動的にターゲットにデプロイされます。

    1 つのフックはアプリケーションのデプロイ前に実行され、もう 1 つはデプロイ後に実行されます。

  5. Google Cloud コンソールの Cloud Deploy の [ロールアウトの詳細] ページを使用して、Cloud Build のログにデプロイ前フックとデプロイ後のフックの結果を表示します。

始める前に

  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. Verify that billing is enabled for your Google Cloud project.

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

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. 外部 ID プロバイダ(IdP)を使用している場合は、まずフェデレーション ID を使用して gcloud CLI にログインする必要があります。

  7. gcloud CLI を初期化するには、次のコマンドを実行します。

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

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. 外部 ID プロバイダ(IdP)を使用している場合は、まずフェデレーション ID を使用して gcloud CLI にログインする必要があります。

  13. gcloud CLI を初期化するには、次のコマンドを実行します。

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

    gcloud components update
    

  15. デフォルトの 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. 特定のランタイム向けのデベロッパー ロールを追加します。
      • 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"
        

    3. 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 の場合は、デフォルト設定でクラスタ deploy-hooks-cluster を 1 つ作成します。クラスタの Kubernetes API エンドポイントは、公共のインターネットからネットワークに到達可能である必要があります。GKE クラスタには、デフォルトで外部からアクセス可能です。

    gcloud container clusters create-auto deploy-hooks-cluster \
                     --project=PROJECT_ID \
                     --region=us-central1
    

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

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

    このクイックスタートでは、サンプルアプリのデプロイに使用するマニフェストと、デプロイの前後に実行するコンテナ(デプロイフック)を識別する skaffold.yaml ファイルを作成します。

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

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

      GKE

      mkdir deploy-hooks-gke-quickstart
      cd deploy-hooks-gke-quickstart
      

      Cloud Run

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

      GKE

      apiVersion: skaffold/v4beta7
      kind: Config
      manifests:
        rawYaml:
        - k8s-pod.yaml
      deploy:
        kubectl: {}
      customActions:
      - name: predeploy-action
        containers:
        - name: predeploy-echo
          image: ubuntu
          command: ["/bin/sh"]
          args: ["-c", 'echo "this is a predeploy action"' ]
      - name: postdeploy-action
        containers:
        - name: postdeploy-echo
          image: ubuntu
          command: ["/bin/sh"]
          args: ["-c", 'echo "this is a postdeploy action"' ]
      

      Cloud Run

      apiVersion: skaffold/v4beta7
      kind: Config
      manifests:
        rawYaml:
        - service.yaml
      deploy:
        cloudrun: {}
      customActions:
      - name: predeploy-action
        containers:
        - name: predeploy-echo
          image: ubuntu
          command: ["/bin/sh"]
          args: ["-c", 'echo "this is a predeploy action"' ]
      - name: postdeploy-action
        containers:
        - name: postdeploy-echo
          image: ubuntu
          command: ["/bin/sh"]
          args: ["-c", 'echo "this is a postdeploy action"' ]
      

      このファイルには customActions: スタンザが含まれています。これにより、デプロイの前後に実行するコンテナ(フック)が定義されます。

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

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

      GKE

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

      apiVersion: v1
      kind: Pod
      metadata:
        name: my-hooks-pod
      spec:
        containers:
        - name: nginx
          image: my-app-image
      

      このファイルは、基本的な Kubernetes マニフェストであり、アプリケーションをデプロイするためにクラスタに適用されます。デプロイするコンテナ イメージは、プレースホルダ my-app-image としてここに設定されます。このプレースホルダは、リリースを作成するときに特定のイメージに置き換えられます。

      Cloud Run

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

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

      このファイルは単純な Cloud Run サービス定義であり、アプリケーションのデプロイに使用されます。デプロイするコンテナ イメージは、プレースホルダ my-app-image としてここに設定されます。このプレースホルダは、リリースを作成するときに特定のイメージに置き換えられます。

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

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

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

      GKE

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

      apiVersion: deploy.cloud.google.com/v1
      kind: DeliveryPipeline
      metadata:
        name: deploy-hooks-demo-app-gke-1
      description: main application pipeline
      serialPipeline:
        stages:
        - targetId: hooks-staging
          profiles: []
          strategy:
            standard:
              predeploy:
                actions: ["predeploy-action"]
              postdeploy:
                actions: ["postdeploy-action"]
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: hooks-staging
      description: hooks staging cluster
      gke:
        cluster: projects/PROJECT_ID/locations/us-central1/clusters/deploy-hooks-cluster
      

      Cloud Run

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

      apiVersion: deploy.cloud.google.com/v1
      kind: DeliveryPipeline
      metadata:
        name: deploy-hooks-demo-app-run-1
      description: main application pipeline
      serialPipeline:
        stages:
        - targetId: hooks-staging
          profiles: []
          strategy:
            standard:
              predeploy:
                actions: ["predeploy-action"]
              postdeploy:
                actions: ["postdeploy-action"]
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: hooks-staging
      description: staging 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 つのターゲットを含むデリバリー パイプラインが用意され、アプリケーションをデプロイして、デプロイ前とデプロイ後のジョブを実行する準備が整いました。

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

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

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

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

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

    リリースを作成する

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

    GKE

    deploy-hooks-gke-quickstart ディレクトリから次のコマンドを実行して、デプロイするコンテナ イメージを表す release リソースを作成します。

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

    --images= フラグに注目してください。このフラグは、マニフェスト内のプレースホルダ(my-app-image)を特定の SHA 修飾イメージに置き換えるために使用します。Google は、この方法でマニフェストをテンプレート化し、リリースの作成時に SHA 修飾イメージ名を使用することをおすすめします。

    Cloud Run

    deploy-hooks-run-quickstart ディレクトリから次のコマンドを実行して、デプロイするコンテナ イメージを表す release リソースを作成します。

     gcloud deploy releases create test-release-001 \
       --project=PROJECT_ID \
       --region=us-central1 \
       --delivery-pipeline=deploy-hooks-demo-app-run-1 \
       --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
    

    --images= フラグに注目してください。これは、サービス定義のプレースホルダ(my-app-image)を特定の SHA 修飾イメージに置き換えるために使用します。この方法でサービスとジョブの定義をテンプレート化し、リリース作成時に SHA 修飾イメージ名を使用することをおすすめします。

    すべてのリリース(--disable-initial-rollout を含むものを除き)において、Cloud Deploy ではロールアウト リソースも自動的に作成されます。アプリケーションは、このデリバリー パイプライン用に構成された 1 つのターゲットに自動的にデプロイされます。

    また、デプロイ前ジョブはアプリケーションのデプロイ前に実行され、デプロイ後ジョブはデプロイ後に実行されます。

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

    数分後、リリースがターゲット ランタイムにデプロイされます。

    (例を示す目的で)構成したデプロイ前およびデプロイ後フックで、Cloud Build ログに文字列が出力されます。これらのログを表示して、フックが想定どおりに機能したことを確認できます。

    1. Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動し、デリバリー パイプライン(「deploy-hooks-demo-app-gke-1」または「deploy-hooks-demo-app-run-1」)を表示します。

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

    2. デリバリー パイプラインの名前(「deploy-hooks-demo-app-gke-1」または「deploy-hooks-demo-app-run-1」)をクリックします。

      可視化されたパイプラインでは、アプリのデプロイ ステータスが表示されます。パイプラインには 1 つのステージしかないため、可視化されたパイプラインにはノードが 1 つだけ表示されます。

      成功を示すデリバリー パイプラインのビジュアリゼーション

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

    3. [デリバリー パイプラインの詳細] の [ロールアウト] タブをクリックします。

    4. ロールアウト名をクリックして、ロールアウトの詳細を表示します。

       Google Cloud コンソールでのロールアウト

      [デプロイ前] と [デプロイ後] はジョブとして一覧表示されます。

    5. [デプロイ前] をクリックします。

      ジョブ実行ログが表示されます。

    6. ログエントリのリストを下にスクロールして、predeploy-echo を見つけて、それをクリックします。

      デプロイ前ジョブのログ

      textPayload に注目してください。この文字列は、Skaffold 構成predeploy-action で構成されたものです。

    7. [デプロイ後] ジョブをクリックして、postdeploy-echo ログエントリを見つけます。

      デプロイ後ジョブのログ

    クリーンアップ

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

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

      GKE

      gcloud container clusters delete deploy-hooks-cluster --region=us-central1 --project=PROJECT_ID
      

      Cloud Run

      gcloud run services delete my-hooks-run-service --region=us-central1 --project=PROJECT_ID
      
    2. 次のように、デリバリー パイプライン、ターゲット、リリース、ロールアウトを削除します。

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

      1 つは _clouddeploy で終わり、もう 1 つは [region].deploy-artifacts.[project].appspot.com で終わります。

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

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

    次のステップ