GAEを使うときはmax_idle_instancesを指定した方がいい

Zennではバックエンドのアプリケーション(Rails)を動かすためにGoogle App Engine(GAE)を使っているのだけど、リリースしてから2ヶ月間どんどん料金が上がっていった。

設定がまずいのかなーと思い、インスタンスクラス(メモリ)を変えてみたりしたが、ほとんど変わらず…。

それで、Cloud Monitoring(旧Stackdriver Monitoring)で、メモリやらインスタンス数やらをチェックしてみた。メモリ使用量についてはリリースから比較的安定していて問題なさそうだったが、課金対象のインスタンス数がびっっくりするくらい立ち上がっていた。

実際に動いているインスタンス数は2〜3にも関わらず、idle_instances(負荷が大きくなったときのために待機してくれているもの)が常時10個くらい立ち上がっていた。
idle_instancesは普通に課金されるため、そりゃあ料金は高くなるよなと。

GAEではapp.yml
にインスタンス数に関する設定を書くことができる。ここにmax_idle_instances
が指定されていなかったのが問題だった。
具体的には、以下のような設定に変えた。
automatic_scaling:
min_instances: 1
max_instances: 20
min_idle_instances: 1
max_idle_instances: 2 # 👈 ここがポイント

結果どうなったかというと、idle_instancesの数が減り、料金が1/3になった。

どこかで「GAEは過去のアクセスから最適なidle_instancesの数を推測して立ち上げている」というような話を耳にしたことがある。真偽は分からないが、同じ負荷だったにも関わらず、日に日にidle_instances
が増えていったのは、このあたりが関係しているのかも

GAEは気軽に使えるが、ある程度アクセスが出てきたときには、ちゃんと設定しておかないと大変なことになるよ、というお話でした。

ちなみに「Google App Engine」についてググるときなんだけど、
- 日本語 => 「GAE」
- 英語 => 「AppEngine」
というキーワードにすると良さそう。英語圏だとあまり「GAE」という呼ばれ方はしていないように感じた。