サーバーレスアーキテクチャの料金構成は基本的に実行単位での従量課金制であるため、そのコストの予測及び見積もりは非常に難しいです。
特に大きなトラフィックや膨大なデータ量を扱う場合には、それに応じてコストは高くなる傾向にあります。また、会社によっては経営層やエンジニアリングマネージャーに事前にコストの見積もりを求められるケースもあるでしょう。
コストを見積もる現実的なやり方は、実際にあなたのサーバーレスアプリケーションにトラフィックをかけることで課金を発生させ、それを元に1日もしくは1ヶ月の見積もりや将来的にアクセスが増えたときのコスト予測を行うことでしょう。
本記事ではそのやり方について解説しています。
見積もり対象となるアーキテクチャ
以下のような構成のサーバーレスアプリケーションを考えてみましょう。
SQSでデータを受け付けて、最終的にKinsis Streamsを通してRDSにデータが登録されるという構成になっています。
このアーキテクチャの中にはリクエスト数や実行時間に応じての課金になるSQS, Lambda, Kinesis Streamsと、インスタンスを立ち上げていた時間に応じて課金になるRDSが存在します。RDSは単純に(時間) x (インスタンスサイズ)ごとの単価でコストが算出されるため、計測の対象外とします。
課金の計測は「コスト配分タグ」を使っておこないます。つまり、計測対象のリソースにタグ付けを行い、そのコストをフィルタリング出来るようにします。
今回は、CloudFormationでデプロイし、そこにStack Tagsとして、Key: forecasting_cost, Value: app1をそれぞれ付与しました。
コスト配分タグの設定
リソースにタグを付けるだけではコストは計測されません。AWS Billingのメニューからデプロイ済みのタグに対してコスト配分タグを有効化しましょう。
もしあなたがAWS Organizationの機能を使ってその子アカウントでAWSリソースを動かしている場合は、一括請求の親となっているマスターアカウントにてこの設定を行ってください。
また、コスト配分タグはこの一覧に表示されているタグの中から有効にできます。そしてこの一覧に表示されるためにはまずタグの付いたリソースをAWSにデプロイしなければなりません。さらに、デプロイ直後はこの一覧に表示されないため、確認できない場合は表示されるまでしばらく待ちましょう
負荷をかけてコストを発生させる
コスト配分タグが付与できれば、実際に5分程度負荷をかけます。負荷を掛ける前にアプリケーションの特性からどのくらいのトラフィックが見込まれるかは想定を行いましょう。今回は仮に700RPS程度のトラフィックを想定して以下の通り負荷をかけました。
コストを確認して予測値を計算する
1日程度経てばCost Exploreからコスト配分タグでフィルタできるようになります。結果のCSVをダウンロードすると以下のような結果となりました。
Kinesis($) | Lambda($) | SQS($) | CloudWatch($) | Summary($) |
0.0052342938 | 0.04321226 | 0.0969616 | 0.01323 | 0.1586381538 |
5分間負荷を掛けて$0.1454ということは1日で$0.1586 x 12(1時間) x 24(1日) = $45.69 、1ヶ月で$45.69 x 30(日) = $1,370くらいかかりそうということが分かります。
また、RDSがdb.m5.2xlarge1台でこのトラフィックを捌けたとします。すると1日で$0.94 x 24 = $22.56、1ヶ月で$22.56 x 30 = $676.8になります。
結果をまとめると、このアリケーションが常時700RPSのトラフィックを捌いた場合以下のようなコストがかかることが分かります。
Serverless Resources($) | RDS($) | Summary($) | |
1日 | 45.69 | 22.56 | 68.25 |
1ヶ月 | 1,370 | 676.8 | 2,046.8 |