App Engine で Rails を動かした

お試しで動かしてみた。下のリンクどおりにやれば大丈夫なはず。

https://cloud.google.com/ruby/rails/appengine

Cloud SDK をインストールする

https://cloud.google.com/sdk/?hl=jaからインストールする。

ログインをする 

gcloud auth login

コマンドを叩くとブラウザが起動して使用するユーザーを選んで SDK に権限を与える

ちなみに警告で以下のように出る。
ADCってなんだ?と思ったけど application default credentials らしい。
デフォルト設定するとうっかりミスしそうなので無視した。

WARNING: `gcloud auth login` no longer writes application default credentials.
If you need to use ADC, see:
  gcloud auth application-default --help

デフォルト値を変更する

GCPを既に使っているとデフォルトプロジェクトが勝手にセットされてしまうので外しておく

# 確認
gcloud config list

# 外す
gcloud config unset project

プロジェクトの作成

ブラウザ上から作ったほうが楽だと思う。コマンドで作りたい場合は下記URLを参照。
https://cloud.google.com/sdk/gcloud/reference/projects/create

デプロイを試す

Rails プロジェクト直下で以下のコマンドを叩く

# 初回のみ実行
gcloud app create --project PROJECT_NAME

# デプロイ
gcloud app deploy --project=PROJECT

昔の記事だと gcloud preview app deploy というコマンドを見かけたが、現在はなくなっているっぽい

WARNING: Automatic app detection is currently in Beta
Deployment to Google App Engine requires an app.yaml file. This 
command will run `gcloud beta app gen-config` to generate an app.yaml 
file for you in the current directory (if the current directory does 
not contain an App Engine service, please answer "no").

Do you want to continue (Y/n)?

警告が出た。 app.yaml ないと怒っているので n を選択して、app.yaml を作成する。

gcloud beta app gen-config

勝手に言語を認識してくれた。すごい。
質問形式で聞いてくるけど、一旦デフォルトのまま作ってみる。

entrypoint: bundle exec rackup -p $PORT
env: flex
runtime: ruby

とてもシンプル。
https://cloud.google.com/appengine/docs/flexible/ruby/runtime
を見ながら挙動を確認してみる

  • 内部で docker を使っている
  • Ruby は rbenv 経由でインストールされ、バージョンは .ruby-version ファイルで指定する。
    ファイルがないとデフォルトの 2.3.4 が使われるらしい (2018年7月時点)
  • Gemfile を探して bundle install してくれる。偉い。
  • RAILS_ENV などはイメージで既に環境変数としてセットされているのでもし変えたい場合はカスタムイメージを使う必要があるっぽい

とりあえず rails プロジェクトなのでエントリーポイントを修正

entrypoint: bundle exec rails -p $PORT
env: flex
runtime: ruby

その他の環境変数を設定する

entrypoint: bundle exec rails -p $PORT
env: flex
runtime: ruby
env_variables:
  SECRET_KEY_BASE: 'xxxxx'
gcloud app deploy --project=PROJECT

ここで環境変数設定するとなると、セキュアな情報も含んでしまうので .gitignore に入れておいたほうが良さそう。
他によい方法あるのかな?