Google App EngineのRuby 2.5 StandardでRails環境構築する方法とCloud SQLのMySQLとの接続方法について紹介します。
基本的には以下の公式を参考に環境構築しています。
- Running Rails 5 on App Engine flexible environment | Ruby
- Using Cloud SQL for MySQL with Rails 5 | Ruby
目次
前提条件
デプロイするRailsプロジェクトが以下に当てはまっていることが前提条件です。
- Ruby バージョン2.3.4以降をインストール
- Rails 5 gem をインストール
- Bundler gem をインストール
必要なAPIを有効化
データストア、Pub / Sub、Cloud Storage JSON、Stackdriver Logging、およびGoogle+必要なAPIを有効にします。
app.yamlの作成
GAEにデプロイするRailsアプリのディレクトリ直下にapp.yamlを作成します。
今回はスタンダード環境なので「env: flex」はコメントアウトしておきます。またapp.yamlに環境変数を書くことでGAEに環境変数を渡せます。
secret keyは以下のコマンドで確認できます。
1 | $ bundle exec rails secret |
・app.yaml
1 2 3 4 5 | entrypoint: bundle exec rackup --port $PORT runtime: ruby25 # env: flex env_variables: SECRET_KEY_BASE: < Your secret key> |
GAEにデプロイしたアプリはDocker上で動くためDockerfileがプロジェクト直下にあるとruntime rubyでデプロイができません。
runtime rubyでデプロイする場合は、DockerfileをDockerfile-devなどに置き換えておきましょう。
.gcloudignoreの作成
デプロイしないファイルを指定するために.gcloudignoreファイルを作成します。
・.gcloudignore
1 2 3 4 5 6 | .gcloudignore #!include:.gitignore .git .gitignore !/public/assets |
MySQL用Cloud SQLをセットアップ
RailsアプリでCloud SQLを使用するために、mysql2とappenginegemをGemfileファイルに追加します
1 2 | $ bundle add mysql2 $ bundle add appengine |
以下のコマンドでインスタンス接続名を取得できます。
gcloud sql instances describe < インスタンス名 >
・database.yml
1 2 3 4 5 6 7 8 9 | production: adapter: mysql2 encoding: utf8 pool: 5 timeout: 5000 username: < username > password: < password > database: < database > socket: /cloudsql/< インスタンス接続名 > |
GAEにデプロイ
以下のコマンドで、GAEアプリを作成します。
1 | $ gcloud app create |
デプロイする前に、Railsアセットをプリコンパイルします。
1 | $ bundle exec bin/rails assets:precompile |
アセットのコンパイルが完了したらGAEにデプロイします。
1 | $ gcloud app deploy |
マイグレーションでテーブル作成
以下のコマンドでプロジェクトを一覧表示できます。アプリのデプロイに使用するプロジェクトを見つけ、プロジェクト番号をコピーします。
1 | $ gcloud projects list |
roles/editorデータベース移行を実行するロールのプロジェクトIAMポリシーに新しいメンバーを追加します。
1 | $ gcloud projects add-iam-policy-binding < YOUR-PROJECT-ID > --member=serviceAccount: < PROJECT_NUMBER > @cloudbuild.gserviceaccount.com --role=roles/editor |
先ほど追加したappengineを使用して、Cloud SQL上でのマイグレーションを実行します。
1 | $ bundle exec rake appengine:exec -- bundle exec rake db:migrate |
Cloud SQL画面の「Cloud Shellを使用して接続」から以下のコマンドで接続し、実際にテーブルが作成されたか確認してみましょう。
1 | $ gcloud sql connect < インスタンス名 > --user=< username > --quiet |
以降のデプロイ
以降、ソースを更新して再度デプロイする場合は以下のコマンドで実行する流れになります。
1 2 3 | $ bundle exec bin/rails assets:precompile $ gcloud app deploy $ bundle exec rake appengine:exec -- bundle exec rake db:migrate |
ハマりポイント
① コンパイル時にエラー
コンパイル時に以下のエラーが発生。
1 2 3 4 | Note: Google::Cloud::Logging is disabled because it failed to authorize with the service. Note: Google::Cloud::Debugger is disabled because it failed to authorize with the service. Note: Google::Cloud::ErrorReporting is disabled because it failed to authorize with the service. Note: Google::Cloud::Trace is disabled because it failed to authorize with the service. |
develop環境では使用しないようfalseにすることで解決しました。
・development.rb
1 2 3 4 | config.google_cloud.use_logging = false config.google_cloud.use_debugger = false config.google_cloud.use_error_reporting = false config.google_cloud.use_trace = false |
② MySQLに接続できない
以下のエラーによりCloud SQLのMySQLに接続できずハマり。。
1 2 | [STDERR] rake aborted! [STDERR] Mysql2::Error::ConnectionError: Unknown MySQL server host '/cloudsql/< インスタンス接続名 >' (2) |
公式ではdatabase.yamlの「/cloudsql/< インスタンス接続名 >」の箇所がhostとなっていたため、hostで書いていたのですが、socketに変更することで解決しました。。
参考:
・修正前
1 2 3 4 5 6 7 8 9 | production: adapter: mysql2 encoding: utf8 pool: 5 timeout: 5000 username: < username > password: < password > database: < database > host: /cloudsql/< インスタンス接続名 > |
・修正後
1 2 3 4 5 6 7 8 9 | production: adapter: mysql2 encoding: utf8 pool: 5 timeout: 5000 username: < username > password: < password > database: < database > socket: /cloudsql/< インスタンス接続名 > |
③ GAEのデフォルトTime Outが10分なためSeedが完了しない
GAEのデフォルトタイムアウトが10mのため、Seedが完了せず途中で終了してしまう。。
1 | TIMEOUT: 10m |
GAE_TIMEOUTオプションでタイムアウトを伸ばすことができました。1h23m45sの形式で指定できます。
1 | bundle exec rake appengine:exec GAE_TIMEOUT=30m -- bundle exec rake db:seed |
参考:
How to set the value of timeout? · Issue #26 · GoogleCloudPlatform/appengine-ruby · GitHub
以上、Google App EngineのRuby 2.5 StandardでRails環境構築する方法とCloud SQLのMySQLとの接続方法でした。