GAE (AppEngine) からの卒業!Cloud Run に移行してコスト4分の1に
想定する読者
- Google AppEngine/Go (GAE/Go) を今でも使い続けている方
- サーバ費用が気になっている方
結論
テラーノベルではインスタンス費用が4分の1になった
※リクエスト特性やAPIの仕様、アーキテクチャによって異なる点に注意
見込み
以前弊社のメンバーが投稿した記事で、「現状の4分の1程度にインスタンス料金を抑える見込み」と書いていたのですが、実際のところ厳密な見積もりはなく、主に課金体系の違いから安くはなるだろうと考えて見切り発車していたというのが正直なところでした。
GAE と Cloud Run の課金体系の違い
• 基本または自動スケーリング: 課金はインスタンスが最後のリクエストを処理してから 15 分後に終了します。
https://cloud.google.com/appengine/pricing?hl=ja
GAE の場合は1台のインスタンスが立ち上がると、最低15分間起動し続けるためその分の費用は必ず発生します。時間帯によってリクエスト数の変動が大きい弊社のサービスでは、アイドル状態でスケールイン待ちの余分なインスタンス費用がある程度存在するのではないかと見込んでいました。
ある日の QPS の推移
一方で、Cloud Run はリクエストを処理していた時間のみが課金対象なので、余分なインスタンス費用というものは存在しません。(Always on CPU だと課金体系が変わりますが、前述の変動を考慮すると金額的にはあまりメリットがなさそうだと判断しました)
GAE と Cloud Run の課金体系の違いによるコスト比較は下記の記事が詳しいです。
Cloud Run VS App Engine: What’s the lowest cost?
https://medium.com/google-cloud/cloud-run-vs-app-engine-whats-the-lowest-cost-6c82b874ed61
移行した結果
移行に必要なあれこれは以前の記事でおおよそ紹介したのでこの記事では結果だけを載せていきます。
インスタンス
- GAE: $0.13/hour
- F2 instance (cpu: 1.2GHz, memory: 768MB)
- Cloud Run: $0.09/hour
- cpu: 2, memory: 512MB
今回使用しているインスタンスの asia-northeast1 リージョンにおける単価をまず見ておくと、1台あたりの単価は Cloud Run の方が安くなっています。どちらもリクエスト数に応じてオートスケールすることから、インスタンス自体のスケールアップダウンによるコストへの影響はそこまで大きくないだろうと判断して、細かい調整は行っていません。
インスタンス一台あたりでさばける QPS
- GAE: 5 QPS
- Cloud Run: 40 QPS
本番環境の移行作業に際しては、まず teller.jp の Web アプリケーションの API リクエストだけを Cloud Run に切り替えました。
下図は本番環境のインスタンス数のチャートで、左はアプリからのリクエストを受け付けている GAE のインスタンス数の推移です。ピーク時間帯は 850 req/s 程度のリクエストを受け付けるために、140〜200台程度のF2インスタンスが立ち上がっています。
一方、右が Web からのリクエストを受け付けている Cloud Run のインスタンス数の推移で、ピーク時間帯は 200 req/s 程度のリクエストを受け付けるために5台のインスタンスが立っています。
以前から、GAE のインスタンスは平均して1台あたり 5 QPS 程度しかさばけておらず、疑問に思って調査はしていたのですが、結果的にほぼ同じコードを同じ価格帯の Cloud Run インスタンスにデプロイしただけで、1台あたり 40 QPS 程度さばけるようになってしまいました。
正確に言えば、アプリからのリクエストと Web からのリクエストの特性(リクエストする API の頻度やパラメータ)が異なるため、単純に8倍処理できるようになったとは言えませんが、それに近い結果は達成していそうです。
ある日のインスタンス数の推移(左:GAE、右:Cloud Run)
API のレイテンシ
- GAE: 950msec
- Cloud Run: 360msec
さらに、API のレイテンシに関しても、GAE では 95パーセンタイルで 950msec かかっていたのが、Cloud Run にしたところ 360msec まで短縮されました。レイテンシに占める割合が大きいのは主に DB との通信だと考えていたので、移行によってここまで大きくレイテンシが下がるのは予想外でした。
QPS が大きく向上したことから、DB との通信よりもむしろインスタンス内の処理速度が大きく高速化したと考えるのが妥当なのかもしれませんが、なぜ GAE と Cloud Run でそこまで処理速度が違うのかはよくわかりません。
ある日のAPIのレイテンシ
スピンアップ時間
- GAE: ?
- Cloud Run: 500-700msec
GAE のスピンアップ時間がモニタリング対象のメトリクスに入っていなかったため、正確にはわかりません。ただ、GAE/Go は特にスピンアップ時間が短いことに定評があるため、100ms 未満だっただろうとは思います。
トータルのインスタンス費用
総合で見てインスタンス費用面はどうだったかというと、
- 移行前の2023年12月は、1日あたり平均4万円程度
- 移行後の2024年3月は、1日あたり平均1万1000円程度
※ 1日あたりのアクセス数やリクエスト特性は大きくは変わらず
結果の説明でも「よくわからない」と書いていた通り、なぜここまで大きくコスト削減されたのかは正直よくわかりませんが、図らずもインタンス費用は4分の1になっていました。
振り返って
テラーノベルは2017年にサービスを開始して以来、バックエンドの API はずっと GAE/Go で稼働してきましたが、2024年についに別れを告げて Cloud Run に移行しました。同じくサービス開始当初から使ってきた Datastore についても Spanner への移行が完了しており、インフラ構成の変更は大きな一区切りが終わりました。どちらもかなりの工数をかけましたが、それに値するだけのコスト削減と開発体験の向上を実現しました。
インフラ基盤に限らず全体のアーキテクチャ刷新はエンジニアリングコストが大きく時間もかかり、先を見通しきるのが難しい問題です。特にスタートアップでは「そこに時間をかけてる暇があるのか」という懸念も上がります。この記事のように「やってみたらこれだけ安くなったよ」が、少しでも参考になれば幸いです。
そして、Cloud Run で安くなる理由がわかる人はぜひ教えて下さい🙏
Discussion