【個人開発】GCP Cloud Buildを利用したCloud Runへのシンプルオートデプロイ設定
はじめに
開発環境の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
各種デプロイオプションは以下を参考にしてください。
1.3 環境変数設定
最後に以下のようなフォーマットにてアプリケーションに必要な環境変数を設定します。
ENV: DEV
LOG_LEVEL: INFO
...
以上がビルド構成ファイル設定となります。
2. Cloud Build設定
2.1 準備
以下のようにCloud RunにデプロイできるようにCloud Run 管理者ロールのステータスを有効にします。
2.2 トリガー作成
Cloud Buildのトリガー作成より、以下のようにトリガーを作成します。
3 その他設定
あとは、各種権限及び必要なリソースを作成します。
3.1 権限
以下のようにCloud Build に Cloud Runサービスにデプロイできるための権限を付与します。
3.2 コンテナリポジトリの作成
ビルド構成ファイルにて定義したservice nameのリポジトリを作成します。
(必要であれば) 3.3 Cloud Runサービスの作成
すでに作成済みであれば、新規で作成する必要はないのですが、
ビルド構成ファイルにて定義したservice nameのサービスをCloud Runに作成します。
私は初期は適当なコンテナイメージを配置して、その後にビルド構成ファイルにより正しいイメージに更新されるように作成しています。
最後に
上記の設定をすることで、Githubの特定のブランチへコードが反映されると、自動にてCloud Runにてアプリケーションがデプロイされるようになります。
また、上記のようなフローを使いつつ、以下のようなアプリケーションを作っています。
ぜひご利用ください。
Discussion