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 で作成されたリリースを確認します。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 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. 次のステップ