🌞

GAEのmin_idle_instancesを設定するときはウォームアップリクエストを有効にする必要がある

2022/02/07に公開

先日GAEでサービスを立ち上げた際、app.yamlにmin_idle_instances: 1を書いているにも関わらず、起動中インスタンスが0になってしまうことがありました。


アクセスがあるときだけインスタンスが起動して、その後インスタンスが0になってしまっています。しばらくアクセスがない状態でアクセスが発生するとサービスがコールドブートすることになり、リクエストからサイトの表示までに10秒くらいかかってしまうことになります。

app.yamlはこんな感じ。

app.yaml
env: standard

runtime: nodejs16

instance_class: F1

automatic_scaling:
  target_cpu_utilization: 0.7
  target_throughput_utilization: 0.7
  max_instances: 10
  min_instances: 0
  max_idle_instances: 2
  min_idle_instances: 1
  max_pending_latency: automatic
  min_pending_latency: automatic
  max_concurrent_requests: 80

なんでだろうな〜と思っていたんですが、ちゃんと公式ドキュメントに書いてありました。

https://cloud.google.com/appengine/docs/standard/nodejs/config/appref

「min_idle_instances」のところに、

警告: この機能を適正に機能させるには、ウォームアップ リクエストが有効であることを確認する必要があります。また、アプリケーションでウォームアップ リクエストが処理されることも確認する必要があります。

なるほど。
また、min_idle_instancesと同様にmin_instancesを設定するときもウォームアップリクエストが有効な必要があるとのことですね。
ということでウォームアップリクエストを有効にしよう。

https://cloud.google.com/appengine/docs/standard/nodejs/configuring-warmup-requests

app.yaml
// 省略

+ inbound_services:
+   - warmup
server.ts
import express from 'express'

const app = express()

+ app.get('/_ah/warmup', (req, res) => {
+   res.sendStatus(200)
+ })

app.listen(3000, () => {
  console.log('Start Express on port 3000.')
});

app.yamlにinbound_services: - warmupを追記し、サーバーの方で/_ah/warmupへのリクエストが来たら200を返すようにします。

これでデプロイすると…

デプロイ後はちゃんとインスタンスが常時1つ以上立ち上がっている状態になりました!しばらくアクセスがない状態からアクセスしても、インスタンスが起動しているときと同じくらいの表示速度になりました。

まとめ

公式ドキュメントをちゃんと読もう。

Discussion