GCEとGAE、どっち使えばいいの？という人のためのGCP運用診断

#はじめに
GCP（Google Cloud Platform）を利用しようと思い色々と調べてみたのですが、**「これ、クラウドサービスを利用したことがない人だと、どれを使えば良いのか分からないのでは？」**と感じたので、ここでは**自分の用途に合った運用方法を見つけるため**の情報を簡単にまとめました。

**GCP全体では自由度が高すぎるので、初心者の方向けに、GCE（Google Computer Engine）かGAE（Google App Engine）のどちらかを利用するという条件で絞っています。ご了承ください。**

#GCP（Google Cloud Platform）
Googleが提供しているクラウドサービス群の総称です。Googleが提供しているサービス群をネットワーク上で利用することができます。GCEやGAEはそのクラウドサービス群の一つです。

-- 同種のサービス --
**Amazonの`AWS`**
**Microsoftの`Azure`**


#GCE（Google Computer Engine）
Googleが提供している`IaaS（Infrastructure as a Service）`です。

IaaSとは仮想化技術を用いたクラウドサーバー環境を提供するサービスで、急な大量アクセスに対しても柔軟に対応できることが強みです。またOSやミドルウェアを選択できるため、サーバー環境や運用について柔軟に構築できるという特徴があります。

-- 同種のサービス --
**AWSの`EC2`**
**Azureの`VirtualMachine`**

同じ仮想サーバーとして`VPS`が似たような環境になりますが、クラウドサーバーとは異なり、急な大量アクセスについては自分でなんとかしなければなりません。また、クラウドサーバーでは災害などで稼働中のサーバーが止まったとしても別の地域のサーバーを稼働できるような仕組みが整っているので、障害に強い環境を作りやすいと言えます。


#GAE（Google App Engine）
Googleが提供している`PaaS （Platform as a Service）`です。

PaaSとはアプリケーションを実行する環境（プラットフォーム）を提供するサービスで、IaaSよりも制限はありますが、代わりにプラットフォームのメンテナンスを行わなくても良いため、アプリケーション開発のみに専念できることが特徴です。

-- 同種のサービス --
**`Heroku`**
**AWSの`Elastic Beanstalk`**
**Azureの`AppService`**

#GCEとGAEの料金について
当たり前ですが、料金体系としてはGCEとGAEとは異なります。
[Google Compute Engine の料金  |  Compute Engine ドキュメント  |  Google Cloud](https://cloud.google.com/compute/pricing?hl=ja)
[App Engine の料金  |  App Engine Documentation  |  Google Cloud](https://cloud.google.com/appengine/pricing?hl=ja)

使い方によって値段が変わるので、どちらがお得になるのか、という答えについては難しいかと思われます。また、各種サービスの無料区分も変化するため、過去の記事を見ても現状とは異なる、というパターンも多いです。

別途参考までに2017年の記事ですが、**1TB/月**までは違いはなく、**10TB/月**になると**92$ほどGCEの方が安くなった**という結果が残されていました。
[GAE/GCE/GCSの通信費＆ストレージ使用料比較 – codes / cipher](https://yukari-n.info/posts/gae-gce-gcs-storage/)

#GAEにはスタンダード環境とフレキシブル環境がある
GAEについては大きく分けて2種類の環境`「スタンダード環境・フレキシブル環境」`があります。
GAE（スタンダード）ではローカルディスクへの書き込み、アプリケーション内で利用できるCPUとメモリ量などについて制限がありますが、GAE（フレキシブル）は仮想マシン上のDockerコンテナで動いており、上記の制限からは解放され、任意のプログラミング言語やライブラリの利用も行うことができます。

例えば、2019年4月現在、RubyはGAE（スタンダード）に対応していないため、Rubyを利用する場合はGAE（フレキシブル）で利用する必要があります。

また、GAE（スタンダード）には`「1日あたり28インスタンス時間」`の無料枠がありますが、**GAE（フレキシブル）には無料枠はついていない**ので注意してください。
[GCP の無料枠 - 無料の長期トライアル、Always Free  |  Google Cloud](https://cloud.google.com/free/?hl=ja)

#GCEとGAEのまとめ

```
GCP：GCEとGCPを含む色々なサービスの大元。
GCE：IaaS。インフラ。色々できる。
GAE：PaaS。プラットフォーム。運用が楽。

GAEは2種類ある。
GAE（スタンダード） = GAE(Standard Environment) = GAE（SE）：
GAE（フレキシブル） = GAE(Flexible Environment) = GAE（FE）：
```

||GCE|GAE（FE）|GAE（SE）|
|:--|:--|:--|:--|
|制限|少ない|普通|多い|
|作業コスト|高い|普通|低い|
|無料枠|あり|なし|あり|


#スキル・用途ごとに運用方法を診断

###「インフラ？Docker？なにそれ？」な人
**GAE（スタンダード）**
が良いでしょう。

GAE（スタンダード）はインフラ周りの知識やDockerの知識を必要とせず、GCPで最も簡単にアプリケーションを構築するための手段と言えます。

ただし、言語・ライブラリ制限が多いため、あなたの考えているアプリケーションは構築できない可能性があります。

なにも分からないけどなんでもいいからとりあえず勉強でアプリを作ってみたい、という場合はGCP以外のサービスが適している場合もあるので、まずはドキュメントを読んでみましょう。
[Google App Engine のドキュメント  |  App Engine Documentation  |  Google Cloud](https://cloud.google.com/appengine/docs/?hl=ja)


###「サードパーティライブラリを利用したい！」な人
**GCE**
**GAE（フレキシブル）**
のいずれかが良いでしょう。

自由度がIaaSの魅力です。様々なサードパーティライブラリを利用して柔軟なサービス構築を目指すのであれば、GCEがまぎれもなく正しい選択です。

サービスの片隅でサードパーティライブラリを利用する場合はGAE（フレキシブル）を利用するのも一つの手ですが、注意点としてGAE（フレキシブル）はGAE（スタンダード）を補完することを目的としています。利用用途としては、Googleのドキュメントに

>たとえば、スタンダード環境で実行中の既存のウェブ アプリケーションがある場合に、ファイルを PDF に変換する新しい機能を追加するには、フレキシブル環境で実行され、PDF への変換のみを処理する別個のマイクロサービスを作成することができます。

と記述されています。つまり、アプリケーションの大元としてGAE（スタンダード）が存在し、GAE（フレキシブル）で作成した機能をGAE（スタンダード）から呼び出すようなイメージを想定しているようです。
[App Engine スタンダード環境ユーザーのための App Engine フレキシブル環境  |  Go の App Engine フレキシブル環境  |  Google Cloud](https://cloud.google.com/appengine/docs/flexible/go/flexible-for-standard-users?hl=ja)

GAE（スタンダード）とGAE（フレキシブル）とではお互いに利用できる機能・できない機能があるため、この点に注意が必要です。
[スタンダード環境からフレキシブル環境へのサービスの移行  |  Java の App Engine フレキシブル環境に関するドキュメント  |  Google Cloud](https://cloud.google.com/appengine/docs/flexible/java/migrating?hl=ja)


###「最新バージョンのプログラミング言語を利用したい！」な人
**GCE**
が良いでしょう。

例えば2018年の8月まで、GAEではPHP5.5までしか使えませんでした。PHP7.0が2015年12月にリリースされたことを考えると、最新バージョンに移行できないもどかしさは相当なものだったでしょう。
[PHP 7.2 release notes  |  App Engine standard environment for PHP 7.2 docs  |  Google Cloud](https://cloud.google.com/appengine/docs/standard/php7/release-notes)

GCEを使えば日々のアップデートに追従し新機能を堪能できる、充実したプログラミング生活を送ることができます。

GAE（フレキシブル）で動かせば良いのでは？と思いましたが、調べてみたところGAE（フレキシブル）のデプロイは非常に遅く、色々と大変なこともあるようです。
[マチマチをGAEで動かす話 - マチマチ技術ブログ](https://tech.machimachi.com/entry/2018/08/20/133000)

GAE（フレキシブル）でRubyアプリケーションを実運用している話も見当たらなかったので、このあたり実際に運用されている方がいれば経験談などコメントいただけると嬉しいです。

またGoogle kubernetes Engineを利用してDocker運用するのも良い手だと思いますが、この記事は初心者向けのため、深掘りはしないことにします（そして私自身がKubernetes分かりません）。


###「スクリプトでソースファイルを制御したい！」な人
**GCE**
**GAE（スタンダード） + Google Cloud Storage**
のいずれかが良いでしょう。

GAE（スタンダード）ではスクリプトからソースファイルにアクセスできませんので、画像のアップロードやトリミングなどの処理をGAE上で行うことはできません。
そのため、GCP上の別サービスであるGoogle Cloud Storageにファイルを格納して、GAE上から制御できるようにする必要があります。

**いちおうGAE（フレキシブル）の場合についてはローカルディスクへの書き込みは可能ですが、仮想マシンの再起動時に削除されます。**そのままだと永続化ができないため、用途としては限定的になるので注意が必要です。


###「明日、バズる！」な人
**GCE**
**GAE（スタンダード）**
のいずれかが良いでしょう。

サービスがヒットすることはとても喜ばしいですね！ですが待ってください。大量のアクセスが集まるということは、同時にサーバー費用が増大することを意味します。マネタイズの仕組みが出来ていないようなサービスを提供していた場合、ただただ、あなたのお金は無くなります。

そういったときのためにGAEでは`「費用制限」`という機能があります。この機能によって、設定した費用に達した場合（もしくは達する直前）にアプリケーションを自動的にストップさせることができます。

**ただし、GAE（フレキシブル）において「費用制限」は未対応です。**
[GCP プロジェクト、App Engine アプリケーション、課金の管理  |  Python の App Engine スタンダード環境  |  Google Cloud](https://cloud.google.com/appengine/docs/standard/python/console/?hl=ja#billing)

GAE（フレキシブル）では設定金額を超えた際にアラームが届く機能を使うことを推奨します。


###「ここまで読んでもよく分からないからとりあえず構築してみるわ！」な人
**GCE**
**GAE（フレキシブル）**
のいずれかが良いでしょう。

GAE（スタンダード）は制限が多く、やりたいことが増えた場合に柔軟に対応することが難しいためオススメできません。

また、GAE（スタンダード）の場合、GCPと連携するために`App Engine SDK`を利用する必要があるのですが、GCEやGoogle Kubernetes Engineでは同処理に`Google Cloud クライアントライブラリ`を利用します。そのため、

```
GAE（スタンダード） -> GCE
GAE（スタンダード） -> Google Kubernetes Engine
```

のような移行は各処理に関しての修正が必要となるため面倒です。

一方、GAE（フレキシブル）についてはGCEやGoogle Kubernetes Engineと同様に`Google Cloud クライアントライブラリ`を利用しているため、比較的移行は楽になるはずです。
[これを読めば Google App Engine（GAE）FE の魅力がわかる | apps-gcp.com](https://www.apps-gcp.com/gae-fe/)


#終わりに
私は趣味でRailsアプリケーションの構築を考えているので、**無料枠があり、Rubyが利用できるGCE**を使おうと思います。この機会にインフラ周りを勉強し直さなければ。。

**インフラ分からんけどWordPressを運用したいなぁ、という場合はGAE（スタンダード）**が良さそうに思います。

**金額面よりも作業コストを優先するのであれば、GAE（フレキシブル）**が合うシチュエーションもあるでしょう。またGAE（フレキシブル）はGo言語の運用例が多く見られるのでGoを使ったアプリケーションを考えている人はやりやすいと思います。

Google Kubernetes Engineは興味がありますが、個人で使うには金銭コストがかなり大きそうです。調べたら「GKEを安く使うにはどうすればいいか」ブログがめちゃめちゃ出てくるので、そちらを参考にするのも良いかもしれませんね。