Cloud Deploy を使用した Cloud Run アプリケーションのデプロイ

1. 概要

このラボでは、Cloud Deploy を使用して .NET アプリケーションを Cloud Run にデプロイします。Dockerfile を使用せずに Cloud Build でコンテナ イメージをビルドします。Cloud Deploy で 3 つのターゲット環境を含むパイプラインを設定し、環境間でリリースをプロモートする手順を行います。最後に、本番環境にデプロイするリリースを承認します。

916a54f51af5ee54.png

Cloud Build とは

Cloud Build を使用すると、すべてのプログラミング言語でソフトウェアを迅速にビルドできます。

Cloud Deploy とは

Cloud Deploy は、フルマネージドの継続的デリバリー サービスです。Cloud Deploy を使用すると、GKE、Anthos、Cloud Run のデプロイ パイプラインを作成できます。

Cloud Run とは

Cloud Run を使用すると、フルマネージド プラットフォームであらゆる言語(Go、Python、Java、Node.js、.NET、Ruby など)で記述されたスケーラブルなコンテナ型アプリケーションをデプロイできます。

Skaffold とは

Skaffold は、Kubernetes ネイティブ アプリケーションの継続的な開発を可能にするコマンドライン ツールです。Cloud Deploy は、レンダリングとデプロイのオペレーションに Skaffold を使用します。

学習内容

このラボでは、次の方法について学びます。

  • Cloud Deploy パイプラインを作成する
  • Dockerfile を使用せずに Cloud Build で .NET アプリケーションのコンテナ イメージを作成する
  • Cloud Deploy を使用してアプリケーションを Cloud Run にデプロイする
  • Cloud Deploy リリースをプロモートする

前提条件

  • このラボは、Cloud コンソールとシェル環境に精通していることを前提としています。

2. 設定と要件

Cloud プロジェクトのセットアップ

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この設定はいつでも変更できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

環境設定

検索バーの右にあるアイコンをクリックして、Cloud Shell をアクティブにします。

eb0157a992f16fa3.png

Cloud Shell から次のコマンドを実行して、プロジェクトの環境変数を設定します。

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
export REGION=us-central1

API の有効化:

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  clouddeploy.googleapis.com \
  artifactregistry.googleapis.com

アプリケーション コンテナ イメージを保存する Artifact Registry リポジトリを作成します。

gcloud artifacts repositories create containers-repo \
  --repository-format=docker \
  --location=${REGION} \
  --description="Containers repository"

3. 構成ファイルを確認する

29c2533441779de0.png

アプリケーションのソースコードのクローンを作成します。

git clone https://github.com/gitrey/deploy-cloudrun-app-with-clouddeploy.git
cd deploy-cloudrun-app-with-clouddeploy

Cloud Deploy パイプライン構成を確認します。

clouddeploy.yaml

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: cloud-run-pipeline
description: application deployment pipeline
serialPipeline:
 stages:
 - targetId: dev-env
   profiles: [dev]
 - targetId: qa-env
   profiles: [qa]
 - targetId: prod-env
   profiles: [prod]
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: dev-env
description: Cloud Run development service
run:
 location: projects/_PROJECT_ID/locations/us-west1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: qa-env
description: Cloud Run QA service
run:
 location: projects/_PROJECT_ID/locations/us-central1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: prod-env
description: Cloud Run PROD service
run:
 location: projects/_PROJECT_ID/locations/us-south1

3 つの環境を定義し、Cloud Run をターゲット サービスとして使用している skaffold.yaml ファイルを確認します。

skaffold.yaml

apiVersion: skaffold/v3alpha1
kind: Config
metadata: 
  name: cloud-run-app
profiles:
- name: dev
  manifests:
    rawYaml:
    - deploy-dev.yaml
- name: qa
  manifests:
    rawYaml:
    - deploy-qa.yaml
- name: prod
  manifests:
    rawYaml:
    - deploy-prod.yaml
deploy:
  cloudrun: {}

サービス構成ファイルを確認します。

deploy-dev.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app
        resources:
          limits:
            cpu: 1000m
            memory: 128Mi

deploy-qa.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app

deploy-prod.yaml

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: app-prod
spec:
  template:
    spec:
      containers:
      - image: app

コンテナ イメージをビルドして Cloud Deploy リリースを作成する手順を含む cloudbuild.yaml ファイルを確認します。

cloudbuild.yaml

steps:
- name: 'gcr.io/k8s-skaffold/pack'
  entrypoint: 'pack'
  args: ['build',
         '--builder=gcr.io/buildpacks/builder',
         '--publish', '${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID']
  id: Build and package .net app
- name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
  args: 
      [
        "deploy", "releases", "create", "release-$_RELEASE_TIMESTAMP",
        "--delivery-pipeline", "cloud-run-pipeline",
        "--region", "${_REGION}",
        "--images", "app=${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID"
      ]
  entrypoint: gcloud

4. Cloud Deploy パイプラインを作成する

clouddeploy.yaml の _PROJECT_ID 値を置き換えます。

sed -i "s/_PROJECT_ID/$PROJECT_ID/g" clouddeploy.yaml

Cloud Deploy パイプラインを作成します。

gcloud deploy apply \
  --file=clouddeploy.yaml \
  --region=${REGION} \
  --project=${PROJECT_ID}

Cloud Deploy で作成したパイプラインを確認します。

5. コンテナ イメージをビルドしてリリースを作成する

Cloud Build サービス アカウントに Cloud Deploy オペレーター権限を追加します。

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/clouddeploy.operator

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/iam.serviceAccountUser

コンテナ イメージと Cloud Deploy リリースを作成します。

export RELEASE_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud builds submit \
  --config cloudbuild-plus.yaml \
  --substitutions=_REGION=${REGION},_RELEASE_TIMESTAMP=${RELEASE_TIMESTAMP}

Cloud Deploy で作成されたリリースを確認します。開発環境へのデプロイが完了するまで待ちます。

6. リリースを QA 環境と本番環境にプロモートする

Cloud Console または Cloud Shell を使用して、リリースを次のターゲット(qa-env)に昇格させます。

Cloud Shell でリリースを昇格させます。gcloud コマンドを実行してリリースを昇格させます。

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

QA 環境へのデプロイが完了するまで待ちます。リリースを次のターゲット(prod-env)にプロモートします。

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

Cloud Console で Cloud Deploy を開き、本番環境へのデプロイのリリースを承認します。

4c838b60770e9691.png

Cloud Deploy パイプラインの状態と、使用可能な DORA 指標(「デプロイ数」、「デプロイの頻度」、「デプロイの失敗率」)を確認します。

指標

説明

デプロイの回数

デリバリー パイプライン内の最終ターゲットへのデプロイの成功回数と失敗回数の合計。

デプロイの頻度

デリバリー パイプラインがデリバリー パイプライン内の最終ターゲットにデプロイする頻度。DevOps Research and Assessment(DORA)プログラムで定義されている 4 つの主要な指標の 1 つ。

デプロイの失敗率

デリバリー パイプラインの最終ターゲットへのロールアウトの失敗の割合。

Cloud Run でデプロイされたアプリケーションを確認します。

d6372b5350f10875.png

7. 完了

お疲れさまでした。これでこの Codelab は終了です。

学習した内容

  • Cloud Deploy パイプラインを作成する方法
  • Cloud Build で .NET アプリケーションのコンテナ イメージを作成する方法
  • Cloud Deploy を使用してアプリケーションを Cloud Run にデプロイする方法
  • Cloud Deploy リリースを昇格させる方法

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

8. 次のステップ