Fargateの料金は月に何円ぐらいかかるのか

先週に[Fargateの大胆な料金改定](https://aws.amazon.com/jp/blogs/compute/aws-fargate-price-reduction-up-to-50/)が発表されたので、趣味で作っている[AWSの概算を出すサイト](https://aws.noplan.cc)にFargateを追加しようと思い立ち、その準備として計算方法を整理しました。インフラには詳しくないので、Fargateの詳しい内容は他を当たっていただくとして、お金の計算に集中します。

[AWS Fargate Price Reduction – Up to 50%](https://aws.amazon.com/jp/blogs/compute/aws-fargate-price-reduction-up-to-50/)

# Fargateとはいったい
インフラの管理が不要なコンテナの実行環境です。
[ECS](https://aws.amazon.com/jp/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時間 

# 手軽に料金を知りたいときに
[![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/89103/3d69aa68-994e-6049-5652-395a3353fb99.gif)](https://aws.noplan.cc/fargate/)
[Fargate | ざっくりAWS](https://aws.noplan.cc/fargate/)

細かい計算方法はいいから料金を知りたいという方は、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%](https://aws.amazon.com/jp/blogs/compute/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円
```

[データ転送の料金表](https://aws.amazon.com/jp/ec2/pricing/on-demand/#Data_Transfer)

# Webサイトで手軽に計算できるように
あとは、上記の計算をWebサイトで手軽にできるように、バックエンドとフロントエンドの実装をしていきます。

## Price List APIで料金を取得
[AWS Price List API](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/price-changes.html)という、料金を取得するAPIが用意されているので、FargateのvCPU/メモリの単価を、東京リージョンに絞って取得しました。vCPUに対して割り当てられるメモリが決まっているので、そのリストもあったら欲しかったのですが、見当たらなかったので手動で指定しています。(更新が辛いけど、スクレイピングしてもWebサイトの構成が変わったりしたら結局辛い)

データは[Lambda](https://aws.amazon.com/jp/lambda/)と[CloudWatchのイベント](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html)を使用して毎日更新しています。
取得方法やデータの整形は長くなるので省略しますが、最終的にはこんな感じのJSONになります。

```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]
    }
  }
}
```

https://github.com/noplan1989/aws-rough-functions/blob/master/functions/batch/price/services/fargate.js

## フロントエンドの実装
あとは価格の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

## できました
[![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/89103/3d69aa68-994e-6049-5652-395a3353fb99.gif)](https://aws.noplan.cc/fargate/)
[Fargate | ざっくりAWS](https://aws.noplan.cc/fargate/)

こんな感じで手軽に計算できるので、料金が気になる方は使ってみてください。
料金は東京リージョンのものになるので、他のリージョンの料金が知りたい方の役には立たないです、すみません。

計算とは関係ないですが、[公式で提供しているアイコン](https://aws.amazon.com/jp/architecture/icons/)に、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/