GAE/Java8試行（その0：「App Engineについて」）

# お題
GAE(Google App Engine)を理解するために、実際に自分でアプリ作って乗せてみる。
とりあえず、App Engineの特徴をまとめる。

# 動機
GAE、ドキュメントを読めば読むほど「Webアプリなら、とりあえずGAEに乗せれば、運用面も含め、十分、本番稼働させられるのでは？」と思えてくる。
GKE(k8s)も勉強中だけれども、gRPCでなくRESTでいいなら、GAEにする方が運用コストも断然楽なんじゃないかと思える。
ただ、チュートリアルを多少やったくらいだと、結局出来合いのものなので、つまづくところもなく、したがって実際に自分でWebアプリを作ってGAEにデプロイ、運用しようとした時にどれほど大変（ないし、楽）なのかがわからない。
なので、試してみることにした。

# 前提
- [スタンダード環境](https://cloud.google.com/appengine/docs/the-appengine-environments?hl=ja)での開発とする。
- [自動スケーリングタイプ](https://cloud.google.com/appengine/docs/standard/java/an-overview-of-app-engine?hl=ja#scaling_types_and_instance_classes)を採用する。

# App Engineについて
- PaaSなので、決まった方式に沿って開発すると、あとの面倒（主にインフラ面）はGCP側で見てくれる。
- デフォルトで[「[プロジェクトID].appspot.com」のドメインでアクセス](https://cloud.google.com/appengine/docs/standard/java/designing-microservice-api?hl=ja#addressing_microservices)できる。（別途調達したドメインを用いることも可能）
- オートスケールが早い（Javaで5秒、Goで40ミリ秒）

## 構造

```
+----------------------------------------------------------------------------------+
|[App Engine]                                                                      |
|                                                                                  |
| +-------------------------------------+  +-------------------------------------+ |
| |[Service-A]                          |  |[Service-B]                          | |
| |                                     |  |                                     | |
| | +---------------------------------+ |  | +---------------------------------+ | |
| | |[Version-1]                      | |  | |[Version-1]                      | | |
| | |                                 | |  | |                                 | | |
| | | +-------------+ +-------------+ | |  | | +-------------+ +-------------+ | | |
| | | |[Instance-a] | |[Instance-b] | | |  | | |[Instance-e] | |[Instance-f] | | | |
| | | |             | |             | | |  | | |             | |             | | | |
| | | +-------------+ +-------------+ | |  | | +-------------+ +-------------+ | | |
| | |                                 | |  | |                                 | | |
| | +---------------------------------+ |  | +---------------------------------+ | |
| |                                     |  |                                     | |
| | +---------------------------------+ |  | +---------------------------------+ | |
| | |[Version-2]                      | |  | |[Version-2]                      | | |
| | |                                 | |  | |                                 | | |
| | | +-------------+ +-------------+ | |  | | +-------------+ +-------------+ | | |
| | | |[Instance-c] | |[Instance-d] | | |  | | |[Instance-g] | |[Instance-h] | | | |
| | | |             | |             | | |  | | |             | |             | | | |
| | | +-------------+ +-------------+ | |  | | +-------------+ +-------------+ | | |
| | |                                 | |  | |                                 | | |
| | +---------------------------------+ |  | +---------------------------------+ | |
| |                                     |  |                                     | |
| +-------------------------------------|  +-------------------------------------+ |
|                                                                                  |
+----------------------------------------------------------------------------------+
```

## App Engine
- １GCPプロジェクトに１つだけ存在する。

## Service
- 1 App Engineにつき、プログラミング言語別(Python, Java, Node.js, PHP, Go)に複数の[Service](https://cloud.google.com/appengine/docs/standard/java/an-overview-of-app-engine?hl=ja)を持てる。
- Service間の通信は、RESTによるやりとりや、[Datastore](https://cloud.google.com/appengine/docs/standard/java/datastore/?hl=ja)、[Memcache](https://cloud.google.com/appengine/docs/standard/java/memcache/?hl=ja)、[タスクキュー](https://cloud.google.com/appengine/docs/standard/java/taskqueue/?hl=ja)により可能。
- オートスケール、負荷分散、インスタンスタイプはService毎に独立して管理される。

## Version
- 1 Serviceにつき、複数のVersionを同時にデプロイできる。
- 各Versionはパーセンテージでリクエストの振り分けができるため、下記が可能。
  - A/Bテスト
  - スモークテスト
  - Blue/Greenデプロイメント
  - カナリアリリース
  - デプロイの高速ロールバック

## Instance
- 1 Versionにつき、複数のInstanceがオートスケールする。

## 注意点
- 一度作ると、リージョンの変更は不可
- 1リクエストは60秒以内に処理する必要がある（タスクキューの場合は10分以内）
- アプリがファイルを書き込めるパスは「```/tmp```」のみ

## 参考
https://cloud.google.com/appengine/docs/standard/java/concepts?hl=ja