CloudBuildで始めるCloud Run 継続的デプロイメント

DevOps

こんにちは!Cloud Run でLaravel のバッチ処理用途と画面確認用の検証環境を作成したかったので、作成してみました!その内容をブログにしていきます。

今回の環境

下記が構成図とデプロイ時のフローになります。

構成図

デプロイフロー

実装について

今回の記事の大半の実装はCloud Build になります。Cloud Run もArtifact Registory もCloudbuild.yml で作成されます。Cloud SQL についても作成していますが、ユーザとデータベースを作成したこと以外は何もしていないので、今回はCloud SQL については省きます。

今回使用したレポジトリ

ここにCode などを全ておいてるので、ぜひ見てみてください。

GitHub - kentaindeed/laravel-docker-env
Contribute to kentaindeed/laravel-docker-env development by creating an account on GitHub.

Cloudbuild.yml の作成

Cloudbuild yml の実装は以下のようになりました。

# 本番環境用のCloud Build設定
steps:
  # GitHubリポジトリからソースコードをクローン
  - name: 'gcr.io/cloud-builders/git'
    args:
      - 'clone'
      - 'https://github.com/kentaindeed/laravel-kensho-env.git'
      - 'src'

  # Dockerイメージをビルド
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - 'build'
      - '-t'
      - 'gcr.io/$PROJECT_ID/laravel-app:$SHORT_SHA'
      - '-t'
      - 'gcr.io/$PROJECT_ID/laravel-app:latest'
      - '-f'
      - 'docker/cloudrun/Dockerfile'
      - '.'
    dir: '.'

  # Container Registryにプッシュ
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - 'push'
      - 'gcr.io/$PROJECT_ID/laravel-app:$SHORT_SHA'

  - name: 'gcr.io/cloud-builders/docker'
    args:
      - 'push'
      - 'gcr.io/$PROJECT_ID/laravel-app:latest'

  # Laravelマイグレーションを実行(プッシュしたイメージのwgetを使用)
  - name: 'gcr.io/google-appengine/exec-wrapper'
    args:
      - '-i'
      - 'gcr.io/$PROJECT_ID/laravel-app:latest'
      - '-s'
      - '${_DB_CONNECTION_NAME}' 
      - '-e'
      - DB_CONNECTION=mysql
      - '-e'
      - 'DB_SOCKET=/cloudsql/${_DB_CONNECTION_NAME}'
      - '-e'
      - DB_PORT=3306
      - '-e'
      - DB_DATABASE=$_DB_DATABASE
      - '-e'
      - DB_USERNAME=$_DB_USERNAME
      - '-e'
      - DB_PASSWORD=$_DB_PASSWORD
      - '-s'
      - '$_DB_CONNECTION'
      - '--'
      - 'php'
      - 'artisan'
      - 'migrate'
      - '--force'

  # Cloud Runにデプロイ(本番環境設定)
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: 'gcloud'
    args:
      - 'run'
      - 'deploy'
      - 'laravel-app-prod'
      - '--image'
      - 'gcr.io/$PROJECT_ID/laravel-app:$SHORT_SHA'
      - '--region'
      - 'asia-northeast1'
      - '--platform'
      - 'managed'
      - '--allow-unauthenticated'
      - '--port'
      - '8080'
      - '--memory'
      - '2Gi'
      - '--cpu'
      - '2'
      - '--max-instances'
      - '5'
      - '--min-instances'
      - '1'
      - '--concurrency'
      - '80'
      - '--timeout'
      - '300'
      - '--add-cloudsql-instances'
      - '${_DB_CONNECTION_NAME}'
      - '--set-env-vars'
      - 'APP_ENV=production,APP_DEBUG=false,APP_KEY=${_APP_KEY},DB_CONNECTION=mysql,DB_SOCKET=/cloudsql/${_DB_CONNECTION_NAME},DB_DATABASE=${_DB_DATABASE},DB_USERNAME=${_DB_USERNAME},DB_PASSWORD=${_DB_PASSWORD},LOG_CHANNEL=stderr,LOG_STDERR_FORMATTER=Monolog\Formatter\JsonFormatter'

# Cloud Buildトリガーで設定する置換変数
# トリガー設定の「置換変数」セクションで以下の変数を設定してください
substitutions:
  _APP_KEY: ''  # Cloud Buildトリガーで設定
  _DB_DATABASE: ''  # Cloud Buildトリガーで設定
  _DB_USERNAME: ''  # Cloud Buildトリガーで設定
  _DB_PASSWORD: ''  # Cloud Buildトリガーで設定
  _DB_CONNECTION_NAME: ''  # Cloud SQL接続名(例: project-id:region:instance-name)

# ビルドしたイメージをContainer Registryに保存
images:
  - 'gcr.io/$PROJECT_ID/laravel-app:$SHORT_SHA'
  - 'gcr.io/$PROJECT_ID/laravel-app:latest'

# ビルドオプション
options:
  logging: CLOUD_LOGGING_ONLY
  machineType: 'E2_HIGHCPU_8'

それぞれ解説していきます!

ポイント

php artisan migrate 実行

php artisan migrate を実行する際に現在使用されているimage ではmigration が実行できなかったので、別のイメージでmigration を実行する必要がありました。

  - name: 'gcr.io/google-appengine/exec-wrapper'

exec-wrapper はmigration 用に作成された環境なので、このイメージを指定して実行する必要があります。ただ実際にmigration を実行するのは作成されたimage のコードのマイグレーションファイルを参照しますので、ここは留意ください。

ruby-docker/app-engine-exec-wrapper at master · GoogleCloudPlatform/ruby-docker
Ruby runtime for Google Cloud Platform. Contribute to GoogleCloudPlatform/ruby-docker development by creating an account...

Cloud SQL への接続

AWS のRDS やAurora を使用する際は、DB HOST などを指定してDB に接続しますが、Cloud SQLでは別の方法をとる必要がありました。Cloud Build からCloud SQL に接続する時は、DB SOCKET を通じて接続する必要があります。なので、Migration 実行の際に DB SOCKET を指定しています。

args:
      - '-i'
      - 'gcr.io/$PROJECT_ID/laravel-app:latest'
      - '-s'
      - '${_DB_CONNECTION_NAME}' 
      - '-e'
      - DB_CONNECTION=mysql
      - '-e'
      - 'DB_SOCKET=/cloudsql/${_DB_CONNECTION_NAME}'
      - '-e'
      - DB_PORT=3306
      - '-e'
      - DB_DATABASE=$_DB_DATABASE
      - '-e'
      - DB_USERNAME=$_DB_USERNAME
      - '-e'
      - DB_PASSWORD=$_DB_PASSWORD
      - '-s'
      - '$_DB_CONNECTION'

これでmigration が実行できるようになります。

migration 実行時の 環境変数の指定

migration の時だけではありませんが、Cloudbuild 上で下記の変数をトリガー上で設定しました。そしてその設定した変数をここから取得しています。今回はenv の数は少ないですが、増加してきたら、secret manager で保管する方が管理上好ましいと思います。

substitutions:
  _APP_KEY: ''  # Cloud Buildトリガーで設定
  _DB_DATABASE: ''  # Cloud Buildトリガーで設定
  _DB_USERNAME: ''  # Cloud Buildトリガーで設定
  _DB_PASSWORD: ''  # Cloud Buildトリガーで設定
  _DB_CONNECTION_NAME: ''  # Cloud SQL接続名(例: project-id:region:instance-name)

まとめ

今回はCloudbuild で自動デプロイ環境を作成しました。その時に実行されたのが以下です。

  • Git Clone でLaravel のコードを取得
  • Docker image を作成して、Artifact Registory に保存
  • php artisan migrate をexec-wrapper を用いて実行
  • Cloud Run へのデプロイ

今回はCloud Deploy などは全く用いなかったですが、Cloud Deploy も使用することで承認フェーズや可視化することができるので次回はその方法も紹介してみようと思います。

参考サイト

CloudBuildからCloudSQLへの接続
Daisuke KONISHIさんのスクラップ
Laravel migration for AppEngine in CloudBuild
We have a Laravel project running in app engine.We deploy everythough through CloudBuild which works great.Previously we...

\ 最新情報をチェック /

コメント

PAGE TOP
タイトルとURLをコピーしました