サーバーレスアーキテクチャを採用する理由として、コスト削減が挙げられるケースをしばしば耳にします。しかし本当にコストは常に削減されるのでしょうか?
EC2に対するAWS Lambdaのコストのメリットを説明するために、以下のような図が用いられるケースがあります。

サーバーが起動していた時間に対して課金されるEC2に対して、AWS Lambdaはプログラムが実行された時間に対して課金されるため、最終的にはコストが最適化されることをこの図では説明しています。では、実際にどんな場合にでもコストは最適化・削減されているのかを見ていきましょう。
LambdaとEC2のコストを比較する
トラフィックが少ないワークロードの場合
月間2万リクエスト、1リクエスト辺りのプログラムの平均実行時間が0.5秒、必要なメモリサイズは512MBのワークロードを考えてみましょう。t3.microインスタンスでこのトラフィックをさばけたと仮定して、以下のようになります。

結果、AWS Lambdaが圧倒的に安くなることが分かります。次に大きなトラフィックを捌く場合を見てみましょう
トラフィックが大きなワークロードの場合
月間3千万リクエスト、1リクエスト辺りのプログラムの平均実行時間が0.5秒、必要なメモリサイズは2048MBのワークロードを考えてみましょう。m5.largeインスタンスでこのトラフィックをさばけたと仮定して、以下のようになります。

結果、AWS Lambdaがコストは高くなることが分かります。
サーバーレスのサービスは「動いた分だけ」という課金体系になっていることが多く、たくさんのトラフィックを捌くためにはそれなりにコストがかかることが分かります。
他の例を見てみましょう。
API GatewayとApplication Load Balancerのコストを比較してみる
トラフィックが少ないワークロードと大きなワークロードでそれぞれ比較します。同じ様にトラフィックが少ないうちはAPI Gatewayが安いですが、トラフィックが大きくなると高くなる傾向にあることが分かります。


大きなワークロードではALBを選んだほうがいいのか?
そうとは限りません。API Gatewayに合って、ALBには無い機能がいくつかあります。以下のような機能です。これらを使いたい場合はAPI Gatewayを選択するべきでしょう。
- 認証認可のためにいくつかの機能(Lambda AuthorizerやIAM Authorizerなど)
- リクエストバリデーション
- Cache
- Usage plan
- サービスプロキシインテグレーション
また、Serverless FrameworkなどのIaCのツールを使ってデプロイする際にもAPI Gatewayの方が全体の記述量が少なく、手軽なケースが多いでしょう。ALBは先にリスナーなどを定義する必要があるため少し複雑です。
DynamoDBとElasticache Redisのコストを比較してみる
同様にトラフィックが少ないワークロードと大きなワークロードでそれぞれ比較します。やはり、トラフィックやストレージ使用量が少ないうちはサーバーレスなDBであるDynamoDBが安いですが、大きなワークロードになるとそれが逆転することが分かります。


運用コストの違い
Elasticache Redisを使った方が一般的には運用面のコストは高くなるでしょう。インスタンスの管理やノードの管理はユーザで実施する必要があります。また、ノードの増減などのオペレーションに備えて手順を準備しておく必要もあります。
また、ElasticacheにVPCが必要なことも大きな違いでしょう。冗長化などの信頼性確保はユーザで実施する必要があります。
DynamoDBであれば、インスタンスサイズを選定する必要もなければ、ノードの管理も不要です。冗長化もAWS側で実施してくれるため、運用面でのコストはDynamoDBに大きなメリットがあります。