Cloud RunはAWSでいうところのAWS App Runnerのようなサービスで、比較的安価にコンテナアプリを動かすためのサービスです。
本記事では、コンテナをGoogle Cloud Buildでビルドし、ビルドしたものをCloud Runにデプロイします。
Dockerfile側は特に特殊な設定は不要です。
実際にDockerを動かしてみて、3000ポートにアクセスできれば、準備完了です。
Dockerfile1FROM node:16-alpine23RUN apk add --no-cache libc6-compat45WORKDIR /app67COPY package.json yarn.lock ./8RUN yarn install --frozen-lockfile910COPY . .1112ENV NODE_ENV production13RUN yarn build1415EXPOSE 30001617ENV PORT 30001819CMD ["yarn", "start"]
あらかじめGCP側でCode Buildを準備しておきます。
ここで、連携するGitHubの設定やブランチやタグをpushしたときに、Code Buildを実行するように設定できます。
構成については、「Code Build 構成ファイル (yaml または json)」を指定します。
環境変数を設定する場合は「代入変数」という箇所に「 _ 」付きで追加します。
公式を確認しながら、以下のように設定します。
codebuild.yaml1steps:2# 環境変数の設定3- name: node:16.15.04entrypoint: yarn5args: [ "run", "create-env" ]6env:7- 'API_KEY=${_API_KEY}'8- 'SERVICE_DOMAIN=${_SERVICE_DOMAIN}'9# ビルド10- name: 'gcr.io/cloud-builders/docker'11args: ['build', '-t', 'gcr.io/$PROJECT_ID/サービス名:$COMMIT_SHA', '.']12# Container Registryにデプロイ13- name: 'gcr.io/cloud-builders/docker'14args: ['push', 'gcr.io/$PROJECT_ID/サービス名:$COMMIT_SHA']15# Cloud Runにデプロイ16- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'17entrypoint: gcloud18args:19- 'run'20- 'deploy'21- 'サービス名'22# 誰でもアクセスできるように設定23- '--allow-unauthenticated'24- '--image'25- 'gcr.io/$PROJECT_ID/サービス名:$COMMIT_SHA'26- '--region'27- 'asia-northeast1'28# 最小起動インスタンスを設定29- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'30entrypoint: gcloud31args:32- 'run'33- 'services'34- 'update'35- 'サービス名'36- '--min-instances'37- '1'38- '--region'39- 'asia-northeast1'40timeout: "1600s"41images:42- 'gcr.io/$PROJECT_ID/サービス名:$COMMIT_SHA'
nameはクラウドビルダー (使用するコンテナ) を指定するために使います。
以下ではCloud Buildに登録した環境変数をコンテナ内で使用するための設定です。
1- name: node:16.15.02entrypoint: yarn3args: [ "run", "create-env" ]4env:5- 'API_KEY=${_API_KEY}'6- 'SERVICE_DOMAIN=${_SERVICE_DOMAIN}'
package.jsonでは以下のようになってます。
package.json1{2"name": "sample",3"version": "0.1.0",4"private": true,5"scripts": {6"dev": "next dev",7"build": "next build",8"start": "next start",9"create-env": "printenv > .env"10},11"dependencies": {12...13},14"devDependencies": {15...16}17}
gcr.io/cloud-builders/docker
を使用してビルドします。
サービス名は適当で大丈夫です。
$PROJECT_IDや$COMMIT_SHAは自動で値が入ります。
1- name: 'gcr.io/cloud-builders/docker'2args: ['build', '-t', 'gcr.io/$PROJECT_ID/サービス名:$COMMIT_SHA', '.']
コンテナレジストリへデプロイし、gcloudを使ってCloud Runにデプロイします。
デフォルトだと、未認証ユーザーのアクセスが制限されるので、gcloudの引数に--allow-unauthenticated
を設定しておきます。
codebuild.yaml1# Container Registryにデプロイ2- name: 'gcr.io/cloud-builders/docker'3args: ['push', 'gcr.io/$PROJECT_ID/サービス名:$COMMIT_SHA']4# Cloud Runにデプロイ5- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'6entrypoint: gcloud7args:8- 'run'9- 'deploy'10- 'サービス名'11# 誰でもアクセスできるように設定12- '--allow-unauthenticated'13- '--image'14- 'gcr.io/$PROJECT_ID/サービス名:$COMMIT_SHA'15- '--region'16- 'asia-northeast1'
デフォルトは最小インスタンスがゼロなので、--min-instances
で値を設定しておきます。
その他、ビルドのタイムアウトなどを設定しておきます。
1# 最小起動インスタンスを設定2- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'3entrypoint: gcloud4args:5- 'run'6- 'services'7- 'update'8- 'サービス名'9- '--min-instances'10- '1'11- '--region'12- 'asia-northeast1'13timeout: "1600s"14images:15- 'gcr.io/$PROJECT_ID/サービス名:$COMMIT_SHA'
以上で設定完了です。
Cloud RunのAPIを有効化し、ビルドを走らせるとデプロイできるようになります。