👍

【個人開発】GCP Cloud Buildを利用したCloud Runへのシンプルオートデプロイ設定

2023/06/24に公開

はじめに

開発環境のGCPにて、Githubへのコード反映後にCloud Runにオートデプロイされると、開発効率が改善されると思います。
私も個人開発アプリケーションにてAPI及びBatchサーバーとしてCloud Runを愛用しており、デプロイ頻度はそこまで多くないにしても、開発環境では作業効率を上げるため、オートデプロイ設定を適用しております。
このようなオートデプロイ設定へのアプローチは多様にあると思うのですが、私は全てをGCPで完結する方法で実施しており、気に入っているので以下にその方法を共有します。

設定方法

前提

以下が利用可能であること

  • GCP
    • Cloud Build
    • Cloud Run
  • Github
  • Cloud Runにデプロイしたいコードがあること

1 ビルド構成ファイルの作成

まずは以下のようなCloud Buildのためのビルド構成ファイルを作成します。
以下の項目でそれぞれのステップの詳細を説明します。

steps:
  - id: Build
    name: gcr.io/cloud-builders/docker
    args: ['build', '-t', '$_IMAGE_REPO_HOST/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA', '.', '-f', '$_DOCKERFILE']
  - id: Push
    name: gcr.io/cloud-builders/docker
    args: ['push', '$_IMAGE_REPO_HOST/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA']
  - id: Deploy
    name: 'gcr.io/cloud-builders/gcloud'
    entrypoint: gcloud
    args: ['run', 'deploy', '$_SERVICE_NAME', 
     '--image', '$_IMAGE_REPO_HOST/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA',
     '--region', '$_SERVICE_REGION',
     '--allow-unauthenticated',
     '--port', '8080',
     '--cpu-throttling',
     '--cpu', '1',
     '--memory', '512Mi',
     '--timeout', '30s',
     '--concurrency', '100',
     '--min-instances', '0',
     '--max-instances', '1',
     '--use-http2',
     '--service-account', '$_SERVICE_ACCOUNT',
     '--env-vars-file', '$_ENV_FILE'
     ]
images:
  - '$_IMAGE_REPO_HOST/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
substitutions:
  _IMAGE_REPO_HOST: {repository host} # ex.) asia-northeast1-docker.pkg.dev
  _SERVICE_NAME: {Cloud Run service name}
  _SERVICE_REGION: {service region}  # ex.) asia-northeast1
  _SERVICE_ACCOUNT: {service account}
  _DOCKERFILE: {Dockerfile path} # ex.) Dockerfile
  _ENV_FILE: {env file path} # ex.) build/development/.env.dev.yml
tags:
  - gcp-cloud-build-deploy-cloud-run

1.1 Dockerビルド

まずは以下のBuildステップにて、Dockerイメージをビルドしていきます。
その後にPushステップにて、イメージをArtifact Registryにプッシュします。

steps:
  - id: Build
    name: gcr.io/cloud-builders/docker
    args: ['build', '-t', '$_IMAGE_REPO_HOST/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA', '.', '-f', '$_DOCKERFILE']
  - id: Push
    name: gcr.io/cloud-builders/docker
    args: ['push', '$_IMAGE_REPO_HOST/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA']
...
substitutions:
  _IMAGE_REPO_HOST: {repository host} # ex.) asia-northeast1-docker.pkg.dev
  _SERVICE_NAME: {Cloud Run service name}
  _SERVICE_REGION: {service region}  # ex.) asia-northeast1
  _SERVICE_ACCOUNT: {service account}
  _DOCKERFILE: {Dockerfile path} # ex.) Dockerfile
  _ENV_FILE: {env file path} # ex.) build/development/.env.dev.yml

1.2 Cloud Runへのデプロイ

イメージプッシュ後にDeployステップにてCloud Runにデプロイします。

steps:
...
  - id: Deploy
    name: 'gcr.io/cloud-builders/gcloud'
    entrypoint: gcloud
    args: ['run', 'deploy', '$_SERVICE_NAME', 
     '--image', '$_IMAGE_REPO_HOST/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA',
     '--region', '$_SERVICE_REGION',
     '--allow-unauthenticated',
     '--port', '8080',
     '--cpu-throttling',
     '--cpu', '1',
     '--memory', '512Mi',
     '--timeout', '30s',
     '--concurrency', '100',
     '--min-instances', '0',
     '--max-instances', '1',
     '--use-http2',
     '--service-account', '$_SERVICE_ACCOUNT',
     '--env-vars-file', '$_ENV_FILE'
     ]
images:
  - '$_IMAGE_REPO_HOST/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
substitutions:
  _IMAGE_REPO_HOST: {repository host} # ex.) asia-northeast1-docker.pkg.dev
  _SERVICE_NAME: {Cloud Run service name}
  _SERVICE_REGION: {service region}  # ex.) asia-northeast1
  _SERVICE_ACCOUNT: {service account}
  _DOCKERFILE: {Dockerfile path} # ex.) Dockerfile
  _ENV_FILE: {env file path} # ex.) build/development/.env.dev.yml
tags:
  - gcp-cloud-build-deploy-cloud-run

各種デプロイオプションは以下を参考にしてください。
https://cloud.google.com/sdk/gcloud/reference/run/deploy

1.3 環境変数設定

最後に以下のようなフォーマットにてアプリケーションに必要な環境変数を設定します。

ENV: DEV
LOG_LEVEL: INFO
...

以上がビルド構成ファイル設定となります。

2. Cloud Build設定

2.1 準備

以下のようにCloud RunにデプロイできるようにCloud Run 管理者ロールのステータスを有効にします。
https://cloud.google.com/build/docs/deploying-builds/deploy-cloud-run#required_iam_permissions

2.2 トリガー作成

Cloud Buildのトリガー作成より、以下のようにトリガーを作成します。


3 その他設定

あとは、各種権限及び必要なリソースを作成します。

3.1 権限

以下のようにCloud Build に Cloud Runサービスにデプロイできるための権限を付与します。
https://cloud.google.com/build/docs/deploying-builds/deploy-cloud-run#continuous-iam

3.2 コンテナリポジトリの作成

ビルド構成ファイルにて定義したservice nameのリポジトリを作成します。

(必要であれば) 3.3 Cloud Runサービスの作成

すでに作成済みであれば、新規で作成する必要はないのですが、
ビルド構成ファイルにて定義したservice nameのサービスをCloud Runに作成します。
私は初期は適当なコンテナイメージを配置して、その後にビルド構成ファイルにより正しいイメージに更新されるように作成しています。

最後に

上記の設定をすることで、Githubの特定のブランチへコードが反映されると、自動にてCloud Runにてアプリケーションがデプロイされるようになります。

また、上記のようなフローを使いつつ、以下のようなアプリケーションを作っています。
ぜひご利用ください。
https://ediaryplus.carrd.co/
https://edictationplus.carrd.co/

Discussion