BETA

GCP初心者がRails6+MySQL5.7アプリをGAEにデプロイしてみる

投稿日:2020-03-23
最終更新:2020-03-23

これなに?

  • 手元にあるRails6のアプリをGoogle App Engineへデプロイしてみました
  • 永続化にはCloud SQL(MySQL)を使います
  • 公式ドキュメントはありますが、いろいろつまずいたので、記録を残します

公式ドキュメント

https://cloud.google.com/ruby/rails/using-cloudsql-mysql?hl=ja

手順

セットアップ

https://cloud.google.com/ruby/rails/using-cloudsql-mysql?hl=ja
にある4つのステップをこなします

1. GCP Console のプロジェクト セレクタのページで、GCP プロジェクトを選択または作成します。  

2. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 プロジェクトに対して課金が有効になっていることを確認する方法を学習する。  

3. Cloud SDK をインストールして初期化します。  

4. Datastore, Pub/Sub, Cloud Storage JSON, Cloud Logging, and Google+APIs を有効にします。  

課金については無料体験にアカウントでも大丈夫です。

4.のAPIを有効にしないと、すべての設定が合っていても、接続できない!とかになります。(これで結構はまりました)

ActionView::Template::Error (Can't connect to local MySQL server through socket '/cloudsql/${APP_NAME}:asia-northeast1:${DB_NAME}:' (2)):  

こんなメッセージがでたら、APIの有効化を疑ってみましょう

GCP上にMySQLのインスタンスを準備する

Preparing Cloud SQL for a MySQL instance
To set up Cloud SQL for a MySQL instance for this tutorial:

Create a Second Generation instance. In this tutorial the name for the instance is rails-cloudsql-instance.  

Create a database in the instance. In this tutorial the name for the production database is cat_list_production.  

Set a root user password for the instance.  

上に書いてあるとおり、以下のURLからMySQLのインスタンスを作成します。
https://console.cloud.google.com/sql/instances

この辺はほぼ迷わないと思います。

Railsアプリの設定をする

To set up your local environment for this tutorial:  

Install Ruby version 2.3.4 or newer.  

Install the Rails 5 gem.  

Install the Bundler gem.  

Rails 5とかRuby2.3.4とか言っていますが、
Rails 6.0.2.1 + Ruby 2.6.5 で動作確認できています。

すでにRailsアプリの準備ができている前提で話をします。
追加で必要になる設定がいくつかあります。

gem

bundle add mysql2  
bundle add appengine  

で依存追加します

database.yml

production環境で実行する時にGCPのMySQLを使うようにします。

production:  
  adapter: mysql2  
  encoding: utf8  
  pool: 5  
  timeout: 5000  
  username: "[YOUR_MYSQL_USERNAME]"  
  password: "[YOUR_MYSQL_PASSWORD]"  
  database: "cat_list_production"  
  socket:   "/cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]"  

YOUR_MYSQL_USERNAME とかは、DB作った時に設定したものを使います。
YOUR_INSTANCE_CONNECTION_NAME はインスタンス接続名というやつで、
https://console.cloud.google.com/sql/instances
からDBインスタンスを選択したところにある概要のページに記載されています。

app.yaml

Google App Engine にデプロイするための設定ファイルです。
プロジェクトのルートディレクトリに作りましょう。
ファイルの内容は下記のようなものになります。

runtime: ruby  
env: flex  
entrypoint: bin/rails s  
beta_settings:  
  cloud_sql_instances: [YOUR_INSTANCE_CONNECTION_NAME]  

rubyランタイムで rails serverを起動して、cloud_sqlに繋げる...そんな設定。

config/application.rb

細かいですがrails6なので、以下を設定しないとエラーになるので注意です...

    config.hosts << ".appspot.com"  

DBマイグレーション

このまま起動しても、DBが空っぽなので、Migrationしましょう。

bundle exec rake appengine:exec -- bundle exec rake db:migrate  

ローカル環境からGCPのDBをMigrationする

ドキュメントには上の手順書いてあったんだけど、うまく行かなくて色々試していた。

結局Proxy使うことでできた...

https://cloud.google.com/ruby/getting-started/using-cloud-sql?hl=ja#creating_a_cloud_sql_instance
にある Cloud SQL Proxyを使うことで、ローカル環境からCloudのMySQL DBの操作が可能です。

認証して、ローカル環境からふつーに

bundle exec rake db:migrate    

すると、Migrationできるのは不思議な感覚...

環境設定

JavaScript アセットを本番環境向けにコンパイルします。

RAILS_ENV=production bundle exec rake assets:precompile  

これはやっておきましょう。

デプロイ

以下のコマンドでデプロイできます。

gcloud app deploy --stop-previous-version  

--stop-previous-version は一つ前のバージョンを止めるオプションで、初回は不要です。
無料プラン使っていると、同時に動かせないとかで制限に引っかかるんですよね。。。

もし、上記でもエラーになる場合、コンソールから一つ前のバージョンのインスタンスを止めて、5分くらい待ってから再度実行してみてください。

補足

ログをみたい

なんかエラーになってしまった場合、以下からログが見れます
https://console.cloud.google.com/logs/viewer
ちゃんとエラー書いてありますので、細かいところまで見ましょう。

Google Cloud SDK

CLIでGCPの操作を行うツールと考えるとよいかと..

感想

AWS、Azure、GCPと似たようなサービス試していたのですが、
GCPが一番迷わなかったです。
AWSはサービス多すぎ&IAMの設定が大変すぎ、
Azureはドキュメントがわからん。。。
コマンドベースで色々操作可能なGCPは比較的わかりやすかったです。
それでも苦労しましたが...

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@takahashino1の技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう