Rails + AppEngine を試してみる
概要
現在、k8s 上に構築している rails アプリを app engine に移行することを考え、app engine を試してみたので、そのメモ。
環境ごとに GCP プロジェクトを分けるか
重要: 各 Cloud Platform プロジェクトには、1 つの App Engine アプリケーションだけを含めることができます。App Engine アプリケーションを作成した後にリージョンを変更することはできません。
App Engine は GCP プロジェクト1個に対して、1個しか作れないし、1度作ってしまうと削除もできないらしい。
誤って、リージョンを us-central に作ってしまった...
一般的なプロジェクト ID の命名には、次のようなパターンがあります。 [company tag]-[group tag]-[system name]-[environment (dev, test, uat, stage, prod)]
GCP としては、開発環境ごとに、プロジェクトを作成することを推奨しているっぽい。
※k8s の 1リージョン、1クラスタの方針とは、違う方針なのか...
Google Cloud Next 18 で GCP の人に質問してみた。
GCP プロジェクトごとに quota が決められているから、同じプロジェクトだと本番環境の quota を圧迫する(特に負荷試験環境は注意)可能性があり、やはり環境ごとにプロジェクトを用意することを進めているっぽい。
とはいえ、k8s のリソースを最大限に活用しようとすると、1クラスタで namespace 区切りで開発環境を分けた方が良い。
また、GCP プロジェクトを複数用意すると、鍵の管理などがわずらわしくなる。
GAE でもサービス単位で環境を用意できるようなので、一旦、1つの GCP プロジェクトに staging, production を用意することを考えてみる。カスタムドメインも設定できるらしい。
環境ごとにサービスを分ける
GAEで公開するアプリは https://[サービス]-dot-[プロジェクトID].appspot.com
でアクセス可能。
GoogleCloudPlatform/ruby-docs-samples/appengine/hello_worldで試す。
カスタムしたコンテナイメージを使う
- ポートは8080
gcr.io/google_appengine/ruby
を base イメージに。ruby:2.5.1
などでも動くが、CloudSQL をドキュメント通りに使うには、指定されているイメージの必要がある
$ tree . ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── app.rb ├── prod.yaml └── stg.yaml
FROM gcr.io/google_appengine/ruby ENV RUBY_VERSION 2.5.1 ENV APP_HOME /home/app WORKDIR $APP_HOME RUN rbenv install -v $RUBY_VERSION && \ rbenv global $RUBY_VERSION && \ gem install bundler && \ rbenv rehash COPY Gemfile* ./ RUN bundle install COPY . . EXPOSE 8080 CMD ["bundle", "exec", "ruby", "app.rb"]
# [START gae_flex_quickstart_yaml] runtime: custom service: stg env: flex # entrypoint: bundle exec ruby app.rb env_variables: STAGE: stg
デプロイ
gcloud app deploy stg.yaml prod.yaml
Tips
AppEngine のコンテナに入る
App Engine インスタンスから cloud shell を起動
$ docker exec -it gaeapp /bin/sh $ bin/rails c
デプロイ時に Cloud Build Timeout が起こってしまう
- cloud shell を起動して、デバッグを有効にしている場合は、無効にする。
gcloud app instances disable-debug
- cloud build を利用せず、イメージを指定してデプロイする。
gcloud app deploy stg_migration.yaml --image-url イメージ
- cloud build のタイムアウトの設定を変更する。
gcloud config set app/cloud_build_timeout 1000
デバッグモードでデプロイ
gcloud app deploy stg.yaml --verbosity debug
AppEngine のコンテナでコマンド実行
gcloud app instances ssh --service サービス名 --version バージョン インスタンスID \ --container=gaeapp -- bin/rails db:migrate db:seed