Railsを乗せるPaaSを比較してみた

ちょっと前に比較しためもが雑にローカルに残っていたので投稿しておきます。
案件とかもHerokuで作ることが多いけどGoogle App Engine (以下GAE) が良さそうなので推進していきたい。

...のでとりあえずざっくりどんなものか自分のユースケースで比較してみた。

# 最低利用コスト

とりあえず、アクセスはそんなにないけど、安定稼働できてそこそこデータ入れたい（10,000レコード超）
案件とかのMVPならきっとこんなスペックで作るんじゃないかな（Herokuは無料DBで行くことも結構あるが）

### Heroku

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51402/eb60052c-3e94-2ee0-b494-325b85a1b680.png)

$16くらい

### GAE(Flexible)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51402/5bffcfc0-def2-235d-0836-bcdca3ee856a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51402/278c1e91-dfa1-ebfc-8eb2-b8a7f42b4a93.png)

$75くらい。
ちょっと高め

FlexibleとStandardっていう環境があるみたいだが現状Ruby使うならFlexibleっぽい（Standardはベータ）

# 手順・設定のシンプルさ

## githubのリポジトリをdeployする手順

### Heroku
1. コンソールでgithubと連携、リポジトリを選択などの設定
2. githubへpushまたはその場でデプロイ

### GAE(Flexible)
1. コンソールでgithubと連携、リポジトリを選択などの設定
2. app.yamlを作成して内容を書く
3. cloudbuild.yamlを作成して内容を書く
4. githubへpush

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

env_variables:
  SECRET_KEY_BASE: hogehogehogehoge
  APP_DATABASE: app_production
  APP_DATABASE_HOST: localhost
  APP_DATABASE_USERNAME: test
  APP_DATABASE_PASSWORD: test

beta_settings:
  cloud_sql_instances: rpg-g4:asia-northeast1:rpg-production

automatic_scaling:
  min_num_instances: 1
  max_num_instances: 5
  cool_down_period_sec: 180
  cpu_utilization:
    target_utilization: 0.6

resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

```

# 拡張性

### Heroku
- Dockerfileを使ったカスタムイメージを利用可能
  - docker pushに時間がかかる。ネットワーク状態の影響を受けやすい
- buildpackを使って拡張可能
  - 込み入った拡張は難しい

### GAE
- Dockerfileを使ったカスタムイメージを利用可能
  - cloudbuildでDockerビルドされるのでそれなりに早い?
  - Google提供のimageをFROMに指定してDockerfileを拡張すると安心

# デプロイ

## Staging環境やblue-green

### Heroku
- heroku pipelineがイケてる
- prebootが良い

heroku pipelineはほんとに良い

### GAE
- versionタグによって管理可能
- トラフィックを細かく制御できる
- A/Bテストにも

こちらもなかなか使いやすそう

# 環境変数

### Heroku
- Settingから簡単に変更可能

### GAE
- app.yamlに直接書く
  - app.yamlをcommitしないといけない
- メタデータサービスというものから取得できるらしいが、コードに取得処理を書かないといけなさそう

自分は暗号化したapp.yamlをcommitして
circle ciからdeploy時にを複合してdeployしてるがHerokuに比べると手軽さがないすねぇ

# ストレージ

### Heroku
別途自分で用意しないといけない

### GAE
GCP内にあるのでCloud Storage使うのがいいのかな

# ログ

### Heroku
- Papertrailかな
  - 無料では容量制限あるが使いやすい

### GAE
- Stackdriver Loggingをつかう
  - 見やすくはないなぁ

# まとめ

|                        | GAE(Flexible)    | Heroku  |
| ---------------------- | ---------------- | ------- |
| 最低利用コスト         | △ | ○ |
| 手順・設定のシンプルさ | ○                | ◎       |
| 拡張性                 | ○                | △       |
| デプロイ               | ○                | ○       |
| 環境変数               | △                | ○       |

# GAEのいいところ

- 東京リージョン
- セキュリティ安心感
- Dockerの扱いやすさ

# 結果

比較結果はまあHerokuいいよね。って感じですね。
でもGAE使ってみたかったのでGAEを使ってみることにしました（）

RubyのイメージがStandardで提供されるようになるみたいなので、そうなったらコスト面などかなり改善しそうだし、拡張もしやすそうで○

GAEのStandard環境で使えるようになると、使ってないときに0台まで縮退できたりするみたいなので、ステージング環境とかのコストを抑えたり色々使いみちが多そうで期待大

# GAEでサービスを作ったよ

以下のサービスのAPIサーバーをRails + graphql-rubyを使って書いてGAEにおいてます。

https://www.g-g-g-g.games


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51402/b340e7f8-bbb7-3a80-a412-64c9e76d061e.png)