Google App EngineにAngularアプリをデプロイしてみた

## 概要

Google AppEnbineにAngularアプリをデプロイしてみました。

AngularアプリはSSR対応しなければ静的コンテンツなSPAですので、単にCloud Storageなどにアップして公開すればよいのですが、興味本位でやってみました。


## 手順

以下を参考にしてDockerコンテナを作成して環境を作りました。
コンテナじゃなきゃいけない理由は特にありません。

DockerでAngularをお試し
https://qiita.com/k5n/items/1a4987a430cf32e3e57d

Dockerはインストール済みの前提です。
docker-composeがインストールされているか確認しておきます。

```sh
> docker-compose version

docker-compose version 1.22.0, build f46880f
docker-py version: 3.4.1
CPython version: 3.6.4
OpenSSL version: OpenSSL 1.0.2o  27 Mar 2018
```

Dockerfileとdocker-compose.ymlの作成。

```sh
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ

> touch Dockerfile
> touch docker-compose.yml
```

```txt:Dockerfile
FROM node:10.8.0-stretch

RUN npm install -g @angular/cli && ng config -g cli.packageManager yarn
WORKDIR /projects
```

```yaml:docker-compose.yml
version: '3'

services:
  node:
    build: .
    ports:
      - "4200:4200"
    volumes:
      - ".:/projects"
    tty: true
```

Dockerコンテナを起動する前に、今回はAngularのサンプルプロジェクトを利用するのでダウンロードして、展開しておきます。

```sh
> cd 任意のディレクトリ
> curl -LO https://angular.io/generated/zips/toh-pt6/toh-pt6.zip
> unzip toh-pt6 -d toh-pt6
```

Dockerコンテナを起動して入ります。

```sh
> docker-compose up -d

ker-compose build` or `docker-compose up --build`.
Creating appengine-on-angular_node_1 ... done

> docker-compose exec node bash
```

### ライブラリのインストール

コンテナに入れたら必要なライブラリをインストールします。
私の環境だと結構時間(30分)がかかりました。なぜに？

```sh:コンテナ内
> cd toh-pt6
> yarn

yarn install v1.9.2
(略)
[4/4] Building fresh packages...
success Saved lockfile.
Done in 1663.77s.
```

### ローカルでの起動確認

Angularアプリが立ち上がるか確認します。
```--host=0.0.0.0``` を指定してコンテナ外からアクセスできるようにするのをお忘れなく。

```sh
> yarn run ng serve --host=0.0.0.0
```

<img width="565" alt="ローカルでアクセス" src="https://qiita-image-store.s3.amazonaws.com/0/48549/cfe25be5-044a-4876-8664-cd1db0b9eac6.png">

はい。


### GCPの設定

```gcloud``` コマンドのインストールは下記をご参考ください。
※今回は記事中のNode.jsのインストールは不要。

SDK for App Engine のダウンロード
https://cloud.google.com/appengine/docs/flexible/nodejs/download

GCPプロジェクトやデプロイに必要な設定は下記をご参考ください。

GCP プロジェクト、App Engine アプリケーション、課金の管理
https://cloud.google.com/appengine/docs/flexible/nodejs/managing-projects-apps-billing

### App Engineへのデプロイ

では、AngularアプリをApp Engineへデプロイしましょう。


今回は静的コンテンツが参照できたらよいので、下記を参考にして、App EngineのランタイムをPHPにして、Webサーバにnginxを利用します。

App Engine > Documentation > PHP > フレキシブル環境 > 静的ファイルの提供
https://cloud.google.com/appengine/docs/flexible/php/serving-static-files?hl=ja

#### Angularアプリのビルド

デプロイするために、Angularアプリをビルドします。


```sh:コンテナ内
> yarn build

yarn run v1.9.2
$ ng build --prod

Date: 2018-08-13T05:10:08.196Z
Hash: ec4f1dff5a2a0a0fc658
Time: 18976ms
chunk {0} runtime.a66f828dca56eeb90e02.js (runtime) 1.05 kB [entry] [rendered]
chunk {1} styles.a006ff9ecb31fc360851.css (styles) 765 bytes [initial] [rendered]
chunk {2} polyfills.cdf87a8e5b31fe8a11f1.js (polyfills) 130 bytes [initial] [rendered]
chunk {3} main.a2bc6cab25d0aa41c17a.js (main) 128 bytes [initial] [rendered]
```

### デプロイ設定

Google App Engineへデプロイするための設定をします。
こちらの作業はコンテナ内・外どちらで行っても問題ありません。

もし、既存のGCPプロジェクトへデプロイする場合には、```service``` を指定します。
**指定しないと```default```サービスへデプロイして痛い目にあいます。**

Angularアプリをビルドするとdistフォルダに出力されますので、そこをドキュメントルートに指定します。

```sh
> touch app.yaml
```

```yaml:app.yaml
runtime: php
env: flex
service: サービス名

runtime_config:
  document_root: dist
```

### Google App Engineへデプロイ

準備ができましたので、デプロイします。
こちらはコンテナ外で作業しましょう。

```sh
> gcloud app deploy

Services to deploy:

descriptor:      [任意のディレクトリ/toh-pt6/app.yaml]
source:          [任意のディレクトリ/toh-pt6]
target project:  [プロジェクトID]
target service:  [サービス名]
target version:  [20180813t150926]
target url:      [https://サービス名-dot-プロジェクトID.appspot.com]

Do you want to continue (Y/n)?
(略)
DONE
-------------------------------------------------------------------------------------------------------------------

Updating service [サービス名] (this may take several minutes)...done.
Setting traffic split for service [サービス名]...done.
Deployed service [サービス名] to [https://サービス名-dot-プロジェクトID.appspot.com]
```

はい。
それでは、上記にあるURLにアクセスしてみましょう。
404になりましたね？
index.htmlをデフォルトでみてくれてないので、URLの後ろにindex.htmlを付けましょう。
設定方法はまた調べます(汗

```sh
> open https://サービス名-dot-プロジェクトID.appspot.com/index.html
```


<img width="729" alt="app-engine-on-angular.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/9e64a122-fdd4-7ed2-5e84-efee84a0452f.png">

やったぜ。

ひとまず、SPAもApp Engineへデプロイできることがわかりました^^


## 参考

DockerでAngularをお試し
https://qiita.com/k5n/items/1a4987a430cf32e3e57d

SDK for App Engine のダウンロード
https://cloud.google.com/appengine/docs/flexible/nodejs/download

GCP プロジェクト、App Engine アプリケーション、課金の管理
https://cloud.google.com/appengine/docs/flexible/nodejs/managing-projects-apps-billing

App Engine > Documentation > PHP > フレキシブル環境 > 静的ファイルの提供
https://cloud.google.com/appengine/docs/flexible/php/serving-static-files?hl=ja