新しいマネージドコンテナサービスAWS Fargateの価格は高いか安いか？ECS/Fargateのコスト最適化を考えてみよう

[AWS Fargate Advent Calendar 2017](https://qiita.com/advent-calendar/2017/aws-fargate) の10日目の記事です。昨日は [俺はSSHをしたくない ~ Fargate vs ECS+SpotFleet のPrice比較 ~](http://tech-blog.abeja.asia/entry/fargate-ecs-spotfleet) でした。 ~~ネタ被ったァ！~~

# Fargate の価格

> 1vCPU 1時間あたり\$0.0506、1GBメモリ 1時間あたり\$0.0127

From https://aws.amazon.com/jp/blogs/news/aws-fargate/

これだけです。高いか安いか考察してみましょう。

# EC2 インスタンスのオンデマンド価格との比較

[us-east-1(N.Virginia)の価格](https://aws.amazon.com/jp/ec2/pricing/on-demand/) を見てみましょう。 **Fargate価格** 欄は上記のFargateの価格で同じvCPUとメモリを確保した場合の価格です。

| インスタンスタイプ  |vCPU | メモリ(GB) | EC2価格 | Fargate価格 | 倍率 |
|:-----------------|:---:|:--------:|:---------|:----------|:-----:|
| m5.large         | 2   | 8        | $0.096/h | $0.2028/h | x2.11 |
| m4.large         | 2   | 8        | $0.100/h | $0.2028/h | x2.03 |
| m3.large         | 2   | 7.5      | $0.133/h | $0.1965/h | x1.48 |
| c5.large         | 2   | 4        | $0.085/h | $0.152/h  | x1.79 |
| c4.large         | 2   | 3.75     | $0.100/h | $0.1488/h | x1.49 |
| c3.large         | 2   | 3.75     | $0.105/h | $0.1488/h | x1.42 |
| r4.large         | 2   | 15.25    | $0.133/h | $0.2949/h | x2.22 |
| r3.large         | 2   | 15       | $0.166/h | $0.2917/h | x1.76 |
| x1e.xlarge       | 4   | 122      | $0.834/h | $1.7518/h | x2.10 |

m5シリーズであれば価格は性能と線形なので、たとえばm5.24xlargeでも倍率は同じx2.11になるためとりあえず比較しやすい上記に絞りました。

最新世代のm5やr4と比べて、おおむね２倍強の価格です。

**Fargate高くない！？** と思ったアナタ。ちょっと待ってください。

# ECS Cluster AutoScaling構成との比較

多くの場合、ECSではそのメリットを享受するためにAutoScaling構成を取ります。たとえば、

- MemoryReservation >= 60% で Scale-out
- MemoryReservation < 30% で Scale-in

と設定するとしましょう[^1]。この場合、実際に確保されるメモリ容量の割合は6割を超えません。
簡単のため、ECSでのリソース利用率はvCPU・メモリともに上記の中央値である45%程度であると仮定しましょう。
Fargateは **割り当てたvCPU・メモリに対する課金** ですので、それに対応するための計算です。

| インスタンスタイプ  |vCPU45% | メモリ45% | EC2価格 | Fargate価格 | 倍率 |
|:-----------------|:---:|:--------:|:---------|:----------|:-----:|
| m5.large         | 0.9 | 3.6      | $0.096/h | $0.0913/h | x0.95 |
| m4.large         | 0.9 | 3.6      | $0.100/h | $0.0913/h | x0.91 |
| m3.large         | 0.9 | 3.375    | $0.133/h | $0.0884/h | x0.66 |
| c5.large         | 0.9 | 1.8      | $0.085/h | $0.0684/h | x0.80 |
| c4.large         | 0.9 | 1.6875   | $0.100/h | $0.0670/h | x0.67 |
| c3.large         | 0.9 | 1.6875   | $0.105/h | $0.0670/h | x0.64 |
| r4.large         | 0.9 | 6.8625   | $0.133/h | $0.1327/h | x1.00 |
| r3.large         | 0.9 | 6.75     | $0.166/h | $0.1313/h | x0.79 |
| x1e.xlarge       | 1.8 | 54.9     | $0.834/h | $0.7883/h | x0.95 |

こうして見ると、 **Fargateは非常に妥当な値付け** であり、少なくとも高くないか **やや安い** 、と言えそうです。


# さいごに

~~m5/r4シリーズのインスタンスが元々コスパ高いからSpotFleetで使おう~~

ECS/Fargateを使うときのコスト最適化については、こんな感じになりそうです。

- SpotFleetを使っている場合にはそのままSpotFleetを使うのが良い
- オンデマンドインスタンスでAutoScaling Groupを作っているなら、Fargateに乗り換えると良い

オンデマンド価格でECSを使っているならFargateに乗り換えない理由はありませんね！また、エンジニアの稼働を減らすことでコストメリットが出るなら、SpotFleetからFargateに乗り換えるのも十分アリなのでは、と思います[^2]。

ECS/Fargateを利用する場合には、他に [ALBの利用料金](https://aws.amazon.com/jp/elasticloadbalancing/pricing/) も発生します。コストを計算する場合にはそちらの考慮もお忘れなく！ALBの数が増えるとその分コストも増えますので、パスベースルーティングやホストベースルーティングを活用してALBの数を抑えるのも効果がありますよ。


[^1]: なぜこの数値を採用したかというと、実際使っているからです。Scale-outの閾値をあまりに高くしてしまうと、追加のTaskが起動することができずMemoryReservationが上昇できなくてScale-outして欲しいときに正しくScale-outしない、ということが起こりえます。
[^2]: SpotFleetを使う場合、SpotFleetリクエストの期限などいくつか気にしないといけないことが増えます。