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 を生成できます。または、ご自身でお試しになることもできます。このステップを終えた後は変更できず、プロジェクト期間中は維持されます。
  • なお、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 Operator の権限を追加します。

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 で確認します。Dev 環境へのデプロイが完了するまで待ちます。

6. QA 環境と本番環境にリリースを昇格

Cloud コンソールまたは 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 コンソールで 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. 次のステップ