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は以下のコマンドで確認できます。
・app.yaml
GAEにデプロイしたアプリはDocker上で動くためDockerfileがプロジェクト直下にあるとruntime rubyでデプロイができません。
runtime rubyでデプロイする場合は、DockerfileをDockerfile-devなどに置き換えておきましょう。
.gcloudignoreの作成
デプロイしないファイルを指定するために.gcloudignoreファイルを作成します。
・.gcloudignore
MySQL用Cloud SQLをセットアップ
RailsアプリでCloud SQLを使用するために、mysql2とappenginegemをGemfileファイルに追加します
以下のコマンドでインスタンス接続名を取得できます。
gcloud sql instances describe < インスタンス名 >
・database.yml
GAEにデプロイ
以下のコマンドで、GAEアプリを作成します。
デプロイする前に、Railsアセットをプリコンパイルします。
アセットのコンパイルが完了したらGAEにデプロイします。
マイグレーションでテーブル作成
以下のコマンドでプロジェクトを一覧表示できます。アプリのデプロイに使用するプロジェクトを見つけ、プロジェクト番号をコピーします。
roles/editorデータベース移行を実行するロールのプロジェクトIAMポリシーに新しいメンバーを追加します。
先ほど追加したappengineを使用して、Cloud SQL上でのマイグレーションを実行します。
Cloud SQL画面の「Cloud Shellを使用して接続」から以下のコマンドで接続し、実際にテーブルが作成されたか確認してみましょう。
以降のデプロイ
以降、ソースを更新して再度デプロイする場合は以下のコマンドで実行する流れになります。
ハマりポイント
① コンパイル時にエラー
コンパイル時に以下のエラーが発生。
develop環境では使用しないようfalseにすることで解決しました。
・development.rb
② MySQLに接続できない
以下のエラーによりCloud SQLのMySQLに接続できずハマり。。
公式ではdatabase.yamlの「/cloudsql/< インスタンス接続名 >」の箇所がhostとなっていたため、hostで書いていたのですが、socketに変更することで解決しました。。
参考:
・修正前
・修正後
③ GAEのデフォルトTime Outが10分なためSeedが完了しない
GAEのデフォルトタイムアウトが10mのため、Seedが完了せず途中で終了してしまう。。
GAE_TIMEOUTオプションでタイムアウトを伸ばすことができました。1h23m45sの形式で指定できます。
参考:
How to set the value of timeout? · Issue #26 · GoogleCloudPlatform/appengine-ruby · GitHub
以上、Google App EngineのRuby 2.5 StandardでRails環境構築する方法とCloud SQLのMySQLとの接続方法でした。