kawabatas技術ブログ

試してみたことを書いていきます

Rails + AppEngine を試してみる

概要

現在、k8s 上に構築している rails アプリを app engine に移行することを考え、app engine を試してみたので、そのメモ。

環境ごとに GCP プロジェクトを分けるか

ドキュメント

重要: 各 Cloud Platform プロジェクトには、1 つの App Engine アプリケーションだけを含めることができます。App Engine アプリケーションを作成した後にリージョンを変更することはできません。

App Engine は GCP プロジェクト1個に対して、1個しか作れないし、1度作ってしまうと削除もできないらしい。

誤って、リージョンを us-central に作ってしまった...

best practice に関して記載があるドキュメント

一般的なプロジェクト 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で試す。

カスタムしたコンテナイメージを使う

Building Custom Runtimes

  • ポートは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

stackoverflow

デバッグモードでデプロイ

gcloud app deploy stg.yaml --verbosity debug

AppEngine のコンテナでコマンド実行

gcloud app instances ssh --service サービス名 --version バージョン インスタンスID \
          --container=gaeapp -- bin/rails db:migrate db:seed