GoogleAppEngine + CloudSQL でRailsセットアップ備忘録

色々と記事としては、このやり方を取り上げている方が居るのですが、どうにも毎回忘れがちなことが多いので、自分用に備忘録として残そうと思います。

#Railsのセットアップをする
最低限、初期画面が出る所までやる。
私はIDEをRubyMine使ってるので、RubyのバージョンとRailsのバージョンを適切に選んだ後に「rails s」を実行して初期画面が見えればOK！

#GCPでセットアップ

パパっとGoogleアカウントを作ります。アカウントあったら、パパっとプロジェクトを作ります。
プロジェクトを作ったらホームにあるプロジェクトIDとプロジェクトナンバーをメモしておくこと。
アカウント登録した場合は、お支払い情報を入力して、課金を有効化しておくこと。

#CloudSQLを作成

CloudSQLをメニューから選んで作成。
この時点で作成ボタンが無い画面だったら課金が有効化されてないので、再度確認をしておくこと。
作成する時のrootパスワードは必ず控えておくこと。
あと、リージョンは「asia-northeast1」ここが東京なので、覚えておくこと。
ただ、ちょっと高いので個人でやる場合は違う所でも良いかも。

#CloudSQLの設定

まずは開発端末から接続出来るように、接続タブで許可するIPにグローバルIPを設定する。
グローバルIPはぐぐって調べること。
データベースを２つ作成。開発用と本番用で分けること。

#config/database.ymlの編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391656/bbac2915-b999-8300-fc99-af362091011e.png)

今度はRails側。host部分をCloudSQLのパブリックIPアドレスに設定する。
その後、同様に「rails s」を実行して、表示されればOK。

#app.yaml作成

```app.yaml
entrypoint: bundle exec rackup --port $PORT
env: flex
runtime: ruby

env_variables:
  SECRET_KEY_BASE: [key]
```
基本的にはこれでOK！
[key]に入るのは下記コードで取得した値。

```
bundle exec rake secret
```

#CloudSDKの設定

ターミナルから下記コマンドで設定

```
gcloud init
```

プロファイルを作成して、Googleアカウントでログインし、作成していたプロジェクトを選択しておく。

#GoogleAppEngine作成

やり方が２つある。

```
gcloud app create
```

これを入力して設定する方法もあるが、Webブラウザでやる方が楽。
相変わらずリージョンは「asia-northeast1」が良いと思う。

#Windowsで作成していた場合
```
bundle lock --add-platform ruby
bundle lock --add-platform x86_64-linux
```
毎回忘れるのですが、これを必ず一回は実行をする。
WindowsでRails newしたものは、linuxに受け入れさせようとすると拒否されるので、linuxでも受け入れてっていう魔法のおまじないみたいなもの。絶対デプロイ前に入れること。


#とりあえずデプロイ

多分成功すると思うけど、とりあえず下記コマンドでデプロイ。

```
gcloud app deploy
```
補足でデプロイ時に使えるオプションも載せておく。

バージョン

```
--version バージョン名
```
バージョンを変えてアップロードすることが出来る。管理はGAEのバージョン項目。
別バージョンにしてアップロードして、何かミスった時には前のバージョンにトラフィックを切り替えることが出来る。

トラフィック割当回避

```
--no-promote
```
これをつけるとトラフィックに自動で割り当てられるのを回避出来る。
例えば、ステージングでアップロードした時とかには必須で付ける必要がある。これでアップロードした場合、トラフィックは割り当てられないが、アップロードしたページを見ることは出来るので、便利な代物。

ちなみに、トラフィックの割り当て管理はGAEのバージョン内で行うことが出来る。

#サービスアカウントに割当
大体の人がここで躓く所。

```
gcloud projects add-iam-policy-binding [projectID] ^
  --member=serviceAccount:[project number]@cloudbuild.gserviceaccount.com ^
  --role=roles/editor
```
私はWindowsなので、Windowsに準拠して記載する。
プロジェクトIDとプロジェクトナンバーを変更して、ターミナルで打ち込む。やっていることは、ビルドをする時にCloudSQLの編集権限をビルドしているサービスアカウントに付与をするというもの。
これをやらないと上手くCloudSQLに紐づけがされない。

#CloudSQL Admin API有効にする
もう一つ絶対に忘れていけないのがこれ。
「APIとサービス」からライブラリを押下して、CloudSQL Adminで検索し、出てきたAPIを有効にする。
これでGAEがCloudSQLを使えるようになった。

#CloudSQLの設定をRails側に記載
```database.yml
production:
  adapter: mysql2
  pool: 5
  encoding: utf8mb4
  timeout: 5000
  database: [database name]
  username: [username]
  password: [password]
  socket: /cloudsql/[cloudsql socket]
```
こんな感じで編集する必要がある。
socket部分はCloudSQLにある「インスタンス接続名」を設定してあげる

#app.yamlにCloudSQLの設定を掲載
```app.yaml
beta_settings:
  cloud_sql_instances: [cloudsql socket]
```
database.ymlのsocketと設定した内容と同じ内容で設定してあげる。

#再デプロイ

その前にrails側でプリコンパイルをしておく。
デプロイ前にはプリコンパイルをする癖をつける。

```
rails assets:precompile
gcloud app deploy
```

#確認

無事にアップロードされているか確認をして、何かあったらプリコンパイル＋デプロイをする。
ここまでを出来れば1時間半くらいで出来れば良い。

GAEへのデプロイは本当楽なんだけど、長いのがネック……なるべく万全の状態でデプロイ出来るように心がけて行きたい！

#参考サイト・記事
[https://cloud.google.com/ruby/rails/using-cloudsql?hl=ja](https://cloud.google.com/ruby/rails/using-cloudsql?hl=ja)
[AppEngine + Cloud SQL で Railsをデプロイする方法（GCP）](https://qiita.com/yoshiokaCB/items/e3bd078d91e45da421e7)