GAE
Google App Engine
app.yaml
npm start で起動するので、package.json に script.start がないと当然動かない
起動しない
PORT 環境変数で待ってるか?
gcp-build
package.json の script を実行してくれる...が、devDependencies は入ってない
max_concurrent_requests
を 10 以上にする場合 instance_class は F2 以上推奨
でも F1 でも max_concurrent_requests: 80 でデプロイできる
Request ヘッダ例
httpRequest, _ := httputil.DumpRequest(c.Request, false) を出力したもの
code:httputil.DumpRequest.txt
GET /devel/dumpRequest HTTP/1.1
Host: ******.appspot.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Cache-Control: no-cache
Pragma: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Via: 1.1 google
X-Appengine-City: kyoto
X-Appengine-Citylatlong: 35.011564,135.768149
X-Appengine-Country: JP
X-Appengine-Region: 26
X-Cloud-Trace-Context: fdddafd26d20124266fc7d4465c70806/12935805563810517035
X-Forwarded-For: 122.221.184.68, 172.217.25.84
X-Forwarded-Proto: https
X-Goog-Cloud-Trace-Parent: 00-fdddafd26d20124266fc7d4465c70806-b385369f9a72902b-00
--no-promote
$ gcloud app deploy --no-promote
カナリアリリースのためデプロイはするけど切り替えない
コンソールのトラフィックを分割で流せる(CLI にもあるかも?)
https://gyazo.com/e805df299dbe7da435a75fafdc44dd8e
静的ファイルの配信
app.yaml で static_dir, static_files でハンドラを定義する
優先順位は app.yaml 内の定義順、 全てにマッチするアプリケーションの /.* より先に定義する必要がある
code:app.yaml
handlers:
# 静的ファイルディレクトリ
- url: /static
static_dir: public/static
secure: always
# /robots.txt など単体ファイル
- url: /robots.txt
static_files: public/static/robots.txt
upload: public/static/robots.txt
# アプリケーション
- url: /.*
secure: always
redirect_http_response_code: 301
script: auto
redirect_http_response_code
なんか気軽に 301 してるけど大丈夫? → 大丈夫
secure オプションを補足するパラメータ、http -> https のリダイレクトする際のステータスコードを指定している
Flexible environment 終了時のシグナル
特にドキュメントはないが Go の Graceful restart のために SIGINT と SIGTERM を Listen している channel に値がやってくるのは確認した。
インスタンスの起動と終了
flex env での起動 & 終了はまあまあ遅い(しょぼいアプリケーションでも3分はかかる)
ステータス と インスタンス の裏側は独立している
ステータスが 停止しました に更新されていても インスタンスが 0 じゃないならまだ停止中という感じ
その間に起動しようとしたり停止しようとしたらエラーになる
タイミングによっては提供中でインスタンスが 1 つ以上立っていてもアプリケーション自体はまだ起動してない、ということがある(docker pull & 起動中?)
https://gyazo.com/e805df299dbe7da435a75fafdc44dd8e
トラフィックの割り当て の設定も ステータス と独立していて、止まってても設定変えれば流せるちゃんと起動してレスポンス受け取れるのを確認してからトラフィック流そう。
https://gyazo.com/31fa217f098553c740d619df8839804d
モニタリング
app.yaml 中にヘルスチェック設定を書ける
実行チェック /liveness_check
実行チェックでは、VM と Docker コンテナが実行中かどうかを確認します。異常と見なされたインスタンスは再起動されます。
/readiness_check
準備チェックでは、インスタンスが受信要求を処理できる状態かどうかを確認します。準備チェックに合格していないインスタンスは、使用可能なインスタンスのプールに追加されません。