サーバレスアーキテクチャ構成にしたときに
実際のところ、どれくらいの料金になるのか気になったので算出してみようと思います。
(あくまでシミュレーションしたものでAWS側で値段や計算方法が変わったりするため、責任は負いかねますので導入する際は自己責任でお願いします。)
AWSのどこにどれくらいの料金がかかっているのか知ることは大事だと思ったのですが、トータルだとなかなかまとまってなかったのでまとめてみました。
間違ってたらご指摘いただけると助かります。
サーバレスアーキテクチャって何?って方はこちら参照してください
- 世界に先駆けてAWSサーバレスアーキテクチャでユーザ認証とAPI認可の実装をしてみた
- AWSサーバレスアーキテクチャでCloudFrontからWAFをかけてAPI Gatewayを呼ぶ
- Lambda+RDSはアンチパターン
普通のサービスということで以下の構成で考えてみます。
- Cognito(ユーザ認証、OAuth認証)
- IAM(認可)
- API Gateway(APIのURL)
- Lambda(ビジネスロジック)
- DynamoDB(データベース)
- S3(ファイルストレージ)
- CloudFront(CDN)
- WAF(ファイアウォール)
- SNS(プッシュ通知)
- CloudWatch(ログ)
継続利用前提で1年間の無料枠を省いて算出してみようと思います。
IAMは無料なため、計算から除外しています。
参考:AWS料金シミュレータ
最安の米国東部(バージニア北部、us-east-1)リージョンの場合で計算してます。(2016/7月時点)
東京リージョンの場合(レスポンス速度を出したい場合など)はもう少し値段があがります。
参考:EC2リージョン別応答時間メモ
EC2とRDSに関してはまとめてる人がいたのでそちらを参考してください(価格帯東京リージョンですが・・・)
AWS 月額料金チートシート
Cognitoの料金
次の項目に関して料金が計算されます。
- MAU(月間アクティブユーザー)
月間アクティブユーザー(MAU)5万まで無料(無料期間過ぎても)です。
MAUが5万超えると一気に請求が来るという計算になりますね・・・
MAUが5万の場合
0.00550ドル×50000=275ドル=約27500円
| 月間ユーザ数(MAU) | ユーザあたりの単価 |
|---|---|
| 0〜5万 | 無料 |
| 5万〜10万 | $0.00550 |
| 10万〜100万 | $0.00460 |
| 100万〜1000万 | $0.00325 |
| 1000万以上 | $0.00250 |
API Gatewayの料金
ここが詳しいです。
Amazon API Gatewayについての参考情報
次の項目に関して料金がかかります。
- API呼び出し
- レスポンスデータ送信量
- キャッシング
・API 呼び出し
100万API呼び出しあたり3.5ドルです。
・レスポンスデータ送信量
レスポンスの総データ量に応じてレートが変わります。
総データ量が1TBならば9ドルです。10TBならば85ドルです。
| レスポンスデータ送信量 | TBデータあたりの単価 |
|---|---|
| 0〜10TB | $90 |
| 10TB〜50TB | $85 |
| 50TB〜150TB | $70 |
| 150TB〜500TB | $50 |
・キャッシング
キャッシングを有効にしている場合、さらに容量と時間に応じた料金が課金されます。
キャッシング容量が0.5GBの場合、1時間あたり0.02ドルです。
月あたり100万APIリクエスト、100GBレスポンスデータ送信でキャッシングなしだとしたら
3.5ドル+90ドル/TB×0.1TB=12.5ドル=約1250円
Lambdaの料金
ここが詳しいです。
AWS LambdaのPricingを読み解く
次の項目に関して料金がかかります
- Lambda関数のリクエスト数
- Lambda関数のメモリに応じた実行時間
・リクエスト数
100万リクエスト(呼び出し)あたり0.2ドルなのでこちらはあまり気にしなくても良いと思います。
・実行時間
正確な計測はできないようです。
Lambdaには128MB〜1GBまでのメモリ割り当てができるのですが、
単価としては1GBのLambda関数を1秒間実行するにあたり0.00001667ドルとなるようです。
下記の料金表は小数点10位が四捨五入されているようです。
| メモリ(MB) | 1か月の無料利用枠の秒数 | 100ミリ秒単位の価格(ドル) |
|---|---|---|
| 128 | 3200000 | 0.000000208 |
| 192 | 2133333 | 0.000000313 |
| 256 | 1600000 | 0.000000417 |
| 320 | 1280000 | 0.000000521 |
| 384 | 1066667 | 0.000000625 |
| 448 | 914286 | 0.000000729 |
| 512 | 800000 | 0.000000834 |
| 576 | 711111 | 0.000000938 |
| 640 | 640000 | 0.000001042 |
| 704 | 581818 | 0.000001146 |
| 768 | 533333 | 0.000001250 |
| 832 | 492308 | 0.000001354 |
| 896 | 457143 | 0.000001459 |
| 960 | 426667 | 0.000001563 |
| 1024(1GB) | 400000 | 0.000001667 |
・無料枠に関して
1か月あたりに100万のリクエストが無料および400,000 GB/秒の実行時間が無料利用枠となっています。
これは1年間の無料枠期間を過ぎても適用されます。
例えば、128MBのLambdaのみで構成されていたとしたら40万秒 * 1024/128(=8)の320万秒=889時間分くらいは無料で利用可能です。
実際はLambdaの処理によって必要なメモリが異なると思います。
ちなみにメモリ不足で失敗しても3回までリトライしてくれるらしいです。
AWS Lambdaを使うときに注意する4つのこと -> 3つになりました
下記の例で計算するとします。
API Gatewayに割り当てられた10個のLambda関数(256MB、平均処理時間1秒)がそれぞれ1日あたり1万回ずつ呼ばれるとします
→それぞれ256MBのメモリを割り当てた10個のLambda関数が月あたり30万回ずつ実行され、平均処理時間が1秒だった場合
無料枠の40万秒 * 1024/256(=4)の160万秒を超過した部分が課金対象です。
課金対象の実行時間:300万秒 - 160万秒(40万秒 * 4) = 140万秒
実行時間に対する課金額:0.00001667ドル/秒∗0.25(256/1024)∗140万秒=5.8345
リクエストに対する課金額は300万回で0.2ドル/100万回ですが100万回分は無料枠の範囲内なので超過は0.4ドルとなります。
よって料金は以下のようになります。
5.8345ドル+0.4ドル = 6.2345ドル = 約623円
ちなみにそれぞれ256MBのメモリを割り当てた10個のLambda関数が月あたり10万回ずつ実行され、平均処理時間が1秒だった場合(100万リクエスト100万秒だった場合)、なんと無料枠内です。
DynamoDBの料金
ここが詳しいです。
AWS DynamoDB の料金がわかりにくいので、最小テーブルの月額を計算してみた
テーブル作成時にテーブルの読み込み、書き込み速度(スループット)を決める
読み込みキャパシティーと書き込みキャパシティーのユニット数が料金項目になります。
- 読み込みキャパシティー
- 書き込みキャパシティー
・読み込みキャパシティー
0.0065ドル : 50ユニットの読み込みキャパシティあたり/1時間
より、1ユニットの読み込みキャパシティを1ヶ月使用した場合のコストは、
0.0065ドル * 720[hour] / 50[ユニット] = 0.0936 [ドル/(ユニット * 月)]
となります。
・書き込みキャパシティ
0.0065ドル : 10ユニットの書き込みキャパシティあたり/1時間
より、1ユニットの書き込みキャパシティを1ヶ月使用した場合のコストは、読み込みキャパシティの5倍です。
0.0936 × 5 = 0.468[ドル/(ユニット * 月)]
よってスループット最小の場合、テーブルあたりの月額は
0.0936 + 0.468 =0.5916ドル
となりました。
スループット最小のテーブルが10個ある場合は
0.5916ドル×10=5.916ドル= 約591円
・スループットシミュレータ
テーブル作成時にキャパシティー計算ツールも存在しているため(DynamoDBテーブル作成画面)、
目標のスループットを満たせるようにシミュレーションすることも可能です。
S3の料金
ここが詳しいです。
S3の料金体系が分かりにくいと聞かれたので纏めた
以下の3つが課金対象となります。
- ストレージ容量
- リクエスト数
- データ転送
・ストレージ容量
保存データ量の総量によってデータあたり(GB)の単価が決まります。
あまり使われないと思われる低頻度アクセスストレージ、Glacierストレージは除外しています。
| 保存総量 | スタンダードストレージ |
|---|---|
| 0〜1TB | $0.0300 |
| 0〜50TB | $0.0295 |
| 50〜500TB | $0.0290 |
| 500〜1000TB | $0.0285 |
| 1000〜5000TB | $0.0280 |
| 5,000TB以上 | $0.0275 |
・リクエスト数
ややこしいことにリクエスト形式によって単価が違います。
| リクエスト形式 | リクエスト単価(1万件あたり) |
|---|---|
| POST、PUT、COPY、または LIST リクエスト | $0.05 |
| GET および他のすべてのリクエスト | $0.004 |
| DELETE | Free |
・データ転送
S3へのアップロードは無料です。
同じリージョン内AWSサービスへのダウンロードは無料です。(別リージョンの場合、$0.020/GBかかります。)
S3を静的ホスティングしてインターネット経由で直接ダウンロードする場合は次の料金表となります。
| データ転送総量 | Amazon S3からインターネットへのデータ転送送信(GB) |
|---|---|
| 0〜1GB | $0.000 |
| 1GB〜10TB | $0.090 |
| 10〜50TB | $0.085 |
| 50〜150TB | $0.070 |
| 150〜300TB | $0.050 |
100GB超えた時点でCloudFront経由のほうが明らかに速度とコスパがよいです。
10GBのストレージを利用で静的ホスティングにて100GBのデータを100万リクエストのGETでS3から直接ダウンロードする場合、次のような計算になります。
0.03[ドル/GB]×10[GB]+0.004[ドル/万リクエスト]×100[万リクエスト]+0.09[ドル/GB]×100[GB]=9.7ドル=約970円
CloudFrontの料金
おそらく正確な計算は不可能です。どこからどのエッジロケーション(地域別CDN)にアクセスされたかで料金がかわり、どこからアクセスされたか特定できないため
- インターネットへのリージョンデータ転送送信(GB単位)
- オリジンへのリージョンデータ転送送信(GB単位)
- HTTPメソッドのリクエスト料金(1万件あたり)
・インターネットへのリージョンデータ転送送信
CloudFrontからインターネットへのデータ送信量を指します。
CDNのリージョン別、データ転送総量によってデータ転送の単価(GB)が異なります。
| 転送総量 | 米国 | 欧州 | 香港、フィリピン、韓国、シンガポールおよび台湾 | 日本 | 南米 | オーストラリア | インド |
|---|---|---|---|---|---|---|---|
| 0〜10TB | $0.085 | $0.085 | $0.085 | $0.140 | $0.250 | $0.140 | $0.170 |
| 10〜50TB | $0.080 | $0.080 | $0.135 | $0.135 | $0.200 | $0.135 | $0.130 |
| 50〜150TB | $0.060 | $0.060 | $0.120 | $0.120 | $0.180 | $0.120 | $0.110 |
| 150〜500TB | $0.040 | $0.040 | $0.100 | $0.100 | $0.160 | $0.100 | $0.100 |
| 500〜1024TB(1PB) | $0.030 | $0.030 | $0.080 | $0.080 | $0.140 | $0.095 | お問い合わせ |
| 1PB〜5PB | $0.025 | $0.025 | $0.070 | $0.070 | $0.130 | $0.090 | お問い合わせ |
| 5PB/月を超えた場合 | $0.020 | $0.020 | $0.060 | $0.060 | $0.125 | $0.085 | お問い合わせ |
・オリジンへのリージョンデータ転送送信(GB単位)
オリジンサーバ(API GatewayやEC2)に転送する際(POST リクエストや PUT リクエストの場合など) にかかる料金です。
| 米国 | 欧州 | 香港、フィリピン、韓国、シンガポールおよび台湾 | 日本 | 南米 | オーストラリア | インド |
|---|---|---|---|---|---|---|
| $0.020 | $0.020 | $0.060 | $0.060 | $0.125 | $0.100 | $0.160 |
・HTTPメソッドのリクエスト料金 (1万件あたり)
| プロトコル | 米国 | 欧州 | 香港、フィリピン、韓国、シンガポールおよび台湾 | 日本 | 南米 | オーストラリア | インド |
|---|---|---|---|---|---|---|---|
| HTTP リクエスト | $0.0075 | $0.0090 | $0.0090 | $0.0090 | $0.0160 | $0.0090 | $0.0090 |
| HTTPS リクエスト | $0.0100 | $0.0120 | $0.0120 | $0.0120 | $0.0220 | $0.0125 | $0.0120 |
・エッジロケーションの制限に関して
次の3択でエッジロケーションのポイントを制限することができます。
価格帯が安い順に次のようになります。
- 価格クラス100(米国、欧州)
- 価格クラス200(米国、欧州、香港、フィリピン、韓国、シンガポールおよび台湾、日本、インド)
- 価格クラスAll(全ての地域)
価格クラス100の場合、例えば日本→アメリカor欧州のエッジロケーションアクセスとなるため
アクセス元によって通信が遅くなるというデメリットもあります。
CloudFrontのPrice classにて選択できます。
・独自SSL証明書(独自ドメイン)を使用する場合
独自ドメインをCloudFrontに割り当てる場合、1つのディストリビューションにつき600ドル/月かかります。
以上踏まえて、価格クラス100のAPI Gateway転送、100万HTTPSリクエスト(独自ドメインなし)のレスポンス累計100GB転送として計算してみます。
0.085[ドル/GB(米国)]×100[GB]+0.02[ドル/GB]×100[GB]+0.012[ドル/万リクエスト(欧州)]×100[万リクエスト]=11.7ドル=約1170円
WAFの料金
次の3項目に基づいて料金が決定されます。
- ウェブアクセスコントロールリストのWeb ACLあたり5ドル/月
- ルールあたり1ドル/月
- 100万ウェブリクエストあたり0.6ドル
WAFの適用はCloudFrontを利用するため、
CloudFrontのDistributionに対応するWeb ACLを1つ紐づけます、
また、Web ACLにルールを紐付けるという形になります。
1つのルールに複数のコンディション(SQLインジェクションフィルター、XSSフィルター等)を紐付けることができます。
そのため、最低1つのWAFに対応するCloudFront側で100万リクエストあった場合は次の計算になります。
5ドル(1Web ACL)+1ドル(1ルール)+0.6ドル(100万リクエスト)=6.6ドル=約660円
SNSの料金
モバイルプッシュ通知を使うのみの場合、ほぼお金はかからないです。
(emailをつかう場合、特にSMSをつかう場合は配信キャリア別にかかるので注意)
モバイルプッシュ通知は100 万件送信するたびに 1 ドル(100 万件発行あたり 0.5 ドル + 100 万件のモバイルプッシュ通知配信あたり 0.5 ドル)かかります。
注:配信されるデータの 64 KB のチャンクごとに 1 リクエストとして課金されます。例えば、256KB のペイロードを含む単一通知は、4 配信として課金されます。
1プッシュ通知あたりの送信ペイロード(プッシュ通知の送信内容)は大体256 KBとみていいでしょう
APNS / GCMのリクエスト制限
上記より100万件送信した際かかる料金は大体つぎのようになると考えられます。
100 万件発行あたり 0.5 ドル + 100 万件のモバイルプッシュ通知配信あたり 0.5 ドル × 4 = 2.5ドル = 約250円
CloudWatchの料金
下記の項目が課金対象項目です。
- ダッシュボード
- Amazon EC2 インスタンスの詳細モニタリング
- カスタムメトリックス
- アラーム
- CloudWatch APIリクエスト
- ログの取り込み、ログのアーカイブ
- カスタムイベント
・ダッシュボード
カスタムのダッシュボード(グラフ化)を作成1つにつき、3ドルかかります。
(必須ではないので作る必要はありません)
・Amazon EC2 インスタンスの詳細モニタリング
インスタンスあたり、1分間隔の詳細モニタリング作成に3.5ドル/月かかります
(EC2はサーバレスでは使いません)
・カスタムメトリックス
1メトリックスあたり0.5ドル/月
→Lambdaのエラーの検知をさせたい場合に必要になります。
・アラーム
1アラームあたり0.1ドル/月
→Lambdaのエラーの検知をさせたい場合に必要になります。
・CloudWatch APIリクエスト
GetMetricStatistics、ListMetrics、または PutMetricData のリクエスト1,000件あたり0.01ドル
(LambdaやEC2などからリクエストしない限りかかりません)
・ログ
取り込み1GBあたり0.5ドル
→受信したログのデータ量につき課金されます。
1GBあたりのアーカイブ0.03ドル/月
→Cloud Logsにアーカイブさせることができるのですが、必須ではありません
・カスタムイベント
カスタムイベントが100万回生成につき1ドルかかります。
※64kbのペイロードに対し、1イベント生成扱い
(VPC設定したLambdaのイベントコールなどに利用します)
・無料枠に関して
下記に関して無料期間を超えても課金料金から除外(減算)されます。
- 10メトリックス(Amazon EC2 インスタンスの詳細モニタリング、カスタムメトリックス、または CloudWatch Logsに適用)分の料金
- 10アラーム分の料金
- 100万回のAPI リクエスト分の料金
- 1か月あたり5GBのデータの取り込みおよび5GBのアーカイブされたストレージ
大規模にならないうちはほとんどが無料枠の範囲内になるため、あまり考えなくて良いでしょう。
ログの取り込み量だけは注意したほうが良いかもしれません。
トータル
次のようなスタートアップ開始想定で計算してみます。
- Cognito(MAU5万未満)→無料
- IAM→無料
- CloudWatch(10メトリックス、10アラート、ログ読み込み5GB以内)→無料
- SNS(10万件送信)→0.25ドル
- DynamoDB(読み込みキャパシティ1、書き込みキャパシティ1の最小テーブル×10)→5.916ドル
- CloudFront+WAF+API Gateway+Lambda
HTTPSの100万リクエスト(10GB)、レスポンスデータ(10GB)想定として
CloudFront:0.085[ドル/GB(米国)]×10[GB]+0.02[ドル/GB]×10[GB]+0.012[ドル/万リクエスト(欧州)]×100[万リクエスト]=2.7ドル
WAF:5ドル(1Web ACL)+1ドル(1ルール)+0.6ドル(100万リクエスト)=6.6ドル
API Gateway:3.5ドル+90ドル/TB×0.01TB=1.25ドル
Lambda(256MB、処理時間1秒、10関数):無料枠内
- CloudFront+S3
100万のHTTPSのGETリクエストにて100GBのレスポンスデータ(画像など)を転送想定とすると
CloudFront:0.085[ドル/GB(米国)]×100[GB]+0.012[ドル/万リクエスト(欧州)]×100[万リクエスト]=9.7ドル
S3:0.03[ドル/GB]×10[GB]+0.004[ドル/万リクエスト]×100[万リクエスト]=0.7ドル
合計:
0.25+5.916+2.7+6.6+1.25+9.7+0.7=27.116ドル=約2711円
皮算用ですがなかなか良い感じの数字が出ました^^;
まとめ
- Cognito:MAUが5万以内なら無料、超えたら一気に課金が発生するので規模が大きくなったら覚悟が必要
- API Gateway:基本安い
- Lambda:メモリ節約すれば基本安い
- DynamoDB:スループット節約すれば基本安い
- S3:保存データ、データ流量による
- CloudFront:配信リージョンを制限すれば値段を下げられるがスループットが落ちる
- WAF:ルール数による、基本安い、スケールにあまり依存しない
- SNS:モバイルプッシュ通知のみだったらとても安い
- CloudWatch:規模が小さいうちは基本無料、ログの取り込み量には注意