先週にFargateの大胆な料金改定が発表されたので、趣味で作っているAWSの概算を出すサイトにFargateを追加しようと思い立ち、その準備として計算方法を整理しました。インフラには詳しくないので、Fargateの詳しい内容は他を当たっていただくとして、お金の計算に集中します。
AWS Fargate Price Reduction – Up to 50%
Fargateとはいったい
インフラの管理が不要なコンテナの実行環境です。
ECSの起動タイプとして選択できます。
ざっくり料金のまとめ
vCPU | メモリ(GB) | 料金 |
---|---|---|
0.25 | 0.5 | 1,240円 |
0.5 | 1 | 2,480円 |
1 | 2 | 4,961円 |
2 | 4 | 9,923円 |
4 | 16 | 23,408円 |
4 | 30 | 29,642円 |
※ 東京リージョン - 110円/ドル - 30.5日 × 24時間
手軽に料金を知りたいときに
細かい計算方法はいいから料金を知りたいという方は、Webサイトで手軽に算出できるようにしたので使ってみてください。東京リージョン限定ですが、サクッと料金を算出できます。
計算するときに考慮すべき変数
タスクに割り当てたリソースと、タスク数、稼働時間と外部へのデータ転送量で料金が決まります。
他のサービスと連携した場合はそちらでも課金されますが、本筋から外れるので無視します。
vCPU/メモリ
Pricing is based on requested vCPU and memory resources for the Task
割り当てるvCPU/メモリのリソースによって料金が変わります。ひとつ注意が必要なのが、vCPUに対するメモリの選択肢が決まっているので、1vCPU
でメモリが30GB
のようなアンバランスな組み合わせは指定できません。
タスク数
タスクの数だけお金がかかります。
稼働時間
For Amazon ECS, AWS Fargate pricing is calculated based on the vCPU and memory resources used from the time you start to download your container image (docker pull) until the Amazon ECS Task* terminates, rounded up to the nearest second. A minimum charge of 1 minute applies.
コンテナをプルし始めた時からタスクが終了するまでの時間に対して料金が発生するようです。概算を出す際には、秒で考えるのが面倒くさかったので、細かいことは気にせずに時間単位にしました。
データ転送量
Data Transfer: You are billed at standard AWS data transfer rates.
忘れられがちですが、外部へデータを転送する場合にはお金がかかります。考え方はEC2と同じです。
計算方法
vCPU = タスク数 * vCPU数 * 料金単価 * 稼働時間
メモリ = タスク数 * メモリ(GB) * 料金単価 * 稼働時間
合計 = vCPU + メモリ
データの転送がある場合は、上記の合計にデータ転送料金が加算されます。
具体例
個人的に、ドル円の脳内変換に500msぐらいかかるので、最終的にはすべて日本円で出しました。
計算の前提
- ドル円 : 110円
- ひと月 : 30.5日
- 東京リージョン
- 2019年1月12日時点の料金
vCPU : $0.05056/hour
メモリ : $0.00553/hour
AWS Fargate Price Reduction – Up to 50%のニュース後の料金です。
最小限のリソース - 0.25vCPU/0.5GB - 1,240円
とりあえず最安でFargateを使いたいときの料金です。
vCPU = 0.25 * 0.05056 * (30.5 * 24) = $9.25248
メモリ = 0.5 * 0.00553 * (30.5 * 24) = $2.02398
合計 = 9.25248 + 2.02398 = $11.27646 // 1,240円
現実的なリソース - 2vCPU/4GB - 9,923円
最小限のリソースでは心もとないので、現実的に使いそうなリソースで計算してみます。
vCPU = 2 * 0.05056 * (30.5 * 24) = $74.01984
メモリ = 4 * 0.00553 * (30.5 * 24) = $16.19184
合計 = $74.01984 + $16.19184 = $90.21168 // 9,923円
潤沢なリソース - 4vCPU/30GB - 29,642円
ここまでのリソースを使うことは少ないと思いますが、現状できる最大の組み合わせで計算してみました。
vCPU = 4 * 0.05056 * (30.5 * 24) = $148.03968
メモリ = 30 * 0.00553 * (30.5 * 24) = $121.4388
合計 = 148.03968 + 121.4388 = $269.47848 // 29,642円
タスクが複数ある場合
複数のタスクを稼働させる場合は、上記の料金にタスク数を掛けます。
- リソース : 2vCPU/4GB
- タスク数 : 4
合計 = 90.21168 * 4 = $360.84672 // 39,693円
バッチ処理に使う場合
毎日1時間のバッチ処理に使うような場合には、かなり安くなります。
- リソース : 2vCPU/4GB
- タスク数 : 1
- 稼働時間 : 毎日1時間
vCPU = 2 * 0.05056 * (30.5 * 1) = $3.08416
メモリ = 4 * 0.00553 * (30.5 * 1) = $0.67466
合計 = 3.08416 + 0.67466 = $3.75882 // 413円
データ転送がある場合
APIでJSONを返すような場合には、外部へのデータ転送が発生するので、転送量に応じた料金が発生します。毎月 100GB
のデータ転送がある場合はこんな感じです。(最初の1GBは無料)
データ転送料金 = (100 - 1) * 0.114 = 11.286 // 1,241円
Webサイトで手軽に計算できるように
あとは、上記の計算をWebサイトで手軽にできるように、バックエンドとフロントエンドの実装をしていきます。
Price List APIで料金を取得
AWS Price List APIという、料金を取得するAPIが用意されているので、FargateのvCPU/メモリの単価を、東京リージョンに絞って取得しました。vCPUに対して割り当てられるメモリが決まっているので、そのリストもあったら欲しかったのですが、見当たらなかったので手動で指定しています。(更新が辛いけど、スクレイピングしてもWebサイトの構成が変わったりしたら結局辛い)
データはLambdaとCloudWatchのイベントを使用して毎日更新しています。
取得方法やデータの整形は長くなるので省略しますが、最終的にはこんな感じのJSONになります。
{
"fargate": {
"cpu": {
"price": 0.05056
},
"memory": {
"price": 0.00553
},
"pair": {
"0.25": [0.5, 1, 2],
"0.5": [1, 2, 3, 4],
"1": [2, 3, 4, 5, 6, 7, 8],
"2": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
"4": [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
}
}
}
フロントエンドの実装
あとは価格のJSONをもとにフロントエンドで計算できるようにしたら完成です。
基本的に足し算と掛け算だけなので、ここも省略します。
https://github.com/noplan1989/aws-rough/blob/master/lib/calc/fargate.js
https://github.com/noplan1989/aws-rough/blob/master/test/unit/lib/calc/fargate.spec.js
できました
こんな感じで手軽に計算できるので、料金が気になる方は使ってみてください。
料金は東京リージョンのものになるので、他のリージョンの料金が知りたい方の役には立たないです、すみません。
計算とは関係ないですが、公式で提供しているアイコンに、FargateのSVGが見当たらなかったので、ECSのアイコンを使っています。(適当)
2vCPU/4GBの計算例
https://aws.noplan.cc/fargate/?z=8643574868cf532bcfce
ソース
フロントエンド
https://github.com/noplan1989/aws-rough
バックエンド
https://github.com/noplan1989/aws-rough-functions
参考
AWS Fargateの料金
https://aws.amazon.com/jp/fargate/pricing/