はじめに
先日、費用削減の一環として、弊社で運用しているAPIサーバーをApp EngineからCloud Runへと移行したところ、表題の通り98% (サーバーあたり月間2万円 -> 450円)の費用削減を達成することが出来ました。何故サービスを移行しただけでこれほどの違いが出たのか、そのカラクリについて調べてみました。
基本料金
2023年12月現在、両者の料金体系は以下の通りです。App Engineにはスタンダードとフレキシブルの2つの環境がありますが、今回はフレキシブル環境を前提としています。
App Engine | Cloud Run(下側) |
---|---|
例えばCPU: 2コア, Memory: 4GB
で運用した場合の、1日当たりの料金を算出すると...
App Engine
($0.0666 x 2vCPU + $0.0089 x 4GB) x 24時間 = 約4ドル
Cloud Run
($0.000024 x 2vCPU + $0.0000025 x 4GB) x 60秒 x 60分 x 24時間 = 約5ドル
基本料金はほとんど同じっぽいです。
インスタンスの状態遷移
両者の基本料金に大きな差はありませんでしたが、一方で課金システムに違いがあります。課金システムはサーバーインスタンスの状態遷移と密接に関係しているため、ここで整理しておきます。
インスタンスには『Active・Idle・Terminated』の3つの状態があります。
-
Active (処理中)
リクエストを受けてからレスポンスを返すまでの時間を指します。 -
Idle (待機中)
リクエストの処理が完了した後、インスタンスはすぐに破棄されるのではなく待機状態へ移行します。待機状態のインスタンスは、新規リクエストに対し迅速にレスポンスを返すことが出来ます。車のアイドリングストップなどと似た概念だと思います。 -
Terminated (終了)
インスタンスが破棄された状態のことです。待機状態がApp Engineでは15分、Cloud Runでは5~15分続くと、自動で終了状態へと移行します。
インスタンスの課金対象
ここが大切なポイントなのですが、App EngineはActiveとIdleの時間が課金対象になります。一方、Cloud RunではActiveの時間のみが課金対象です。ですので、Idleの時間が長いほどCloud Runの方がお得ということになります。
Idleの時間が長くなるユースケースとしては、ユーザーからのリクエスト頻度が少ないAPIであったり、バッチ処理などの用途で定期的にしか呼ばれないAPIなどが考えられます。
今回移行の対象となったAPIサーバーもバッチ処理で呼ばれるAPIだったのですが、メトリクスを確認したところ1日の中でActiveな時間はわずか20分ほどであり、残りの23時間40分は何もしていないのに無駄に費用が発生している状態だっだと判明しました。この無駄遣いをカットしたことが今回の成果に繋がっています。
まとめ
App EngineとCloud Runのどちらでも良いユースケースにおいては、Cloud Runを使用することで費用を大きく抑えられる可能性があります。ただし、App Engineでしか実現できない機能もあるので、そこだけ注意しましょう。
参考