1リクエスト = 0.001円以下
APIを運用するうえで、コストは無視できない問題。特にアクセスが増えると、サーバー代や通信量が膨らみ、気づけば数千円、数万円なんてことも。
でも、工夫次第で圧倒的にコストを抑えられる。今回、たった100円で10万リクエストを処理できるAPIをテストで構築したので、そのインフラの構成やかかった費用を詳しく紹介します。
コストを抑えるための技術選定
今回考えたインフラ構成は以下のとおりです。
リクエストの処理は非同期で処理を行う前提となります。
リクエストはAPI Gatewayでリクエストを受け付けLambdaに連携し、DynamoDBとSQSにデータを保存するようになっています。
SQSに貯めたデータは定期的にEventBridgeから起動したLambdaで処理するようにしています。
なぜ非同期処理を選んだのか?
リクエストを受け付けているLambdaは処理を一切行わずデータを格納することだけに集中しています。
データの登録や加工の処理の性能が不要になることで、性能を削減しています。
またAPIが即座にレスポンスを返せるようにし、リクエストごとの処理時間を短縮しました。
実際の処理を行うLambdaにデータを渡すためにSQSを間に入れています。
なぜLambdaを使うのか?
Lambdaで作っているので、必要な時にだけリソースが使用されるので使用されていない時のランニングコストを削減しています。
またアクセス数が増えたとしても自動で並列処理されるのでパフォーマンスの確保ができることも利点です。
性能
個人利用を想定し、コスト削減のために書き込み・読み込みキャパシティを最小限に設定しました。
費用
1月中に実装していろいろ試していた時の費用は0.4$でした。
およそ7万リクエストを処理して0.4$なので10万リクエストで0.57$かかるようになります。
1/30時点でのドル円レートが154円のため、日本円換算すると約87円で実現可能です。
(※為替レートの変動により、実際の費用は異なる場合があります)
内訳
以下の内訳に対して税額が合計0.3$かかりました。
API Gateway 合計0.32$
$4.25/million requests - first 333 million requests/month
75,206 Requests
Simple Storage Service 合計0.04$
$0.0047 per 1,000 PUT, COPY, POST, or LIST requests
729 Requests
$0.0037 per 10,000 GET and all other requests
1,024 Requests
$0.025 per GB - first 50 TB / month of storage used
1.72 GB-Mo
DynamoDB 合計0.01$
$0.228 per GB-Month of storage used for DynamoDB PITR backup
0 GB-Mo
$0.00 per GB-Month of storage for first 25 free GB-Months
0 GB-Mo
$0.1425 per million read request units (Asia Pacific (Tokyo))
75,275 ReadRequestUnits
$0.715 per million write request units (Asia Pacific (Tokyo))
6,905 WriteRequestUnits
※ストレージは25Gの無料枠の範囲内に収まった
Simple Queue Service 合計0$
First 1,000,000 Amazon SQS Requests per month are free
96,363 Requests
※無料枠の範囲内で処理
まとめ
非同期処理 + サーバーレスを活用 することで、たった100円で10万リクエストを処理できるAPIを実現しました。
無料枠の活用によって、DynamoDB・SQSの費用をほぼゼロに抑えられました。
リクエストあたりのコストは0.001円以下 となり、大量リクエストを安価に処理可能であることの確認ができました。