概要
Google App Engineの更新後にウェブアプリでサーバーエラーが起きるようになったが、アプリ側のapp.yamlで設定を変えることで復旧した。
起きた現象
Google App Engine(以下GAE)のF1インスタンスのPython上で稼働していたウェブアプリが、2023年4月27日に突然、以下のようなメッセージをブラウザ上に表示してアクセスできなくなった。
Error: Server Error
The server encountered an error and could not complete your request.
Please try again in 30 seconds.
アプリのGCP上のログ[1]を確認すると、次のようなログが記録されていた。
Exceeded hard memory limit of 384 MiB with 434 MiB after servicing 0 requests total. Consider setting a larger instance class in app.yaml.
ログから判断する限り、アプリがメモリーを使い尽くして、強制終了されたようである。
問題の起きる前後で、アプリ側はいっさい変更していかったため、GAEの更新が影響しているものと考え、GAEの更新状況を確認したところ[2]、たしかに2023年4月27日に更新が行われていた。
原因の調査
問題の起きる前後でのログを比較したところ、以下のようにgunicornのワーカー数が変化していることに気がついた。
問題の起きる前
Running /bin/sh -c exec gunicorn main:app --workers 2 -c /config/gunicorn.py
問題の起きた後
Running /bin/sh -c exec gunicorn main:app --workers 4 -c /config/gunicorn.py
ここから、GAEの更新によってワーカー数が2から4に変化したために、必要なメモリー量が増え、メモリー不足となって強制終了されたと推測された。
このワーカー数の変更が意図的な仕様変更なのか、不具合なのかは不明だが、現在時点(2023年5月11日)では、ドキュメントにF1インスタンスのデフォルトのワーカー数が2であることが明記されている[3]ので、不具合の可能性がある。
問題への対応
以下のようにしてGAEでのワーカー数を明示的に指定することで、問題は起こらなくなった。
- requirements.txtファイルに「gunicorn==20.1.0」と記載してgunicornを自前でインストールするようにする(※これを行わないとentrypoint指定で問題が起きる)。
- app.yamlファイルに「entrypoint: gunicorn main:app --workers 2」と記載して明示的にワーカー数2を指定。
なお緊急的にはF2やF4のインスタンスに変更することでメモリー量を増やして対応することも可能だが、F2やF4では課金されるフロントエンドインスタンス時間が2倍、4倍され[4]、なおかつ単価も高くなるため費用が高くなることに注意が必要である。
参照
[1] Google Cloud console[2] App Engine standard environment for Python 3 release notes | Google App Engine standard environment docs | Google Cloud
[3] Python 3 Runtime Environment | Google App Engine standard environment docs | Google Cloud
[4] Pricing | App Engine | Google Cloud