AWS Copilot で Phoenix Framework の本番環境を構築する コスト・料金編

## はじめに

以前、 Phoenix Framework を AWS Copilot によって AWS 上にデプロイしました

https://qiita.com/RyoWakabayashi/items/b831516ca9f012fb56b5

これを本番運用するとなると、以下の点を考慮する必要があります

- コスト・料金 <- 今ここ
- [リリース用ビルド](https://qiita.com/RyoWakabayashi/private/21baa60f9fcf64835a49)
- [クラスタリング](https://qiita.com/RyoWakabayashi/private/b6888b510b20bb7579e8)
- [データベース](https://qiita.com/RyoWakabayashi/private/660b87f9deaaa179545d)
- [認証](https://qiita.com/RyoWakabayashi/private/9ea90df3970ec6e9d272)

というわけで、数回に分けて検証、実装した内容を紹介していきます

今回は コスト・料金編 です

## AWS Copilot で作られるもの

今回は Workload type に Load Balanced Web Service を選択した場合です

- ECR
- ECS
- ELB
- Route53
- CloudFormation　(AWS 内でのみ動作するため無償)
- IAM Role （無償）
- VPC （NATゲートウェイなどは作らないためノーコスト、のはず）

### ECR

デプロイするコンテナイメージは ECR に保存されます

https://aws.amazon.com/jp/ecr/pricing/

コンテナイメージのプッシュ時（ECRから見たデータ受信）は無料です

また、 AWS 内であればプル（ECRから見たデータ送信）も無料になります

したがって、ストレージにかかる料金だけが対象になります

ストレージ料金: 1 GB/月あたり 0.10 USD

コンテナイメージが 1GB なら 1月 0.10 USD なので、ほぼ無視していい金額です

### ECS

デプロイしたコンテナイメージは ECS の Fargate で動作します

https://aws.amazon.com/jp/fargate/pricing/

東京リージョンで Linux/X86 の場合

| 単位 | 料金 |
| :-- | --: |
| 1 時間あたりの vCPU 単位 | 0.05056 USD |
| 1 時間あたりの GB 単位 | 0.00553 USD |

EC2 の m6g.xlarge 相当と仮定すると、

- vCPU = 4
- メモリ = 16GB

1ヶ月を 730 時間、2台でクラスタリングするとしたとき、 1ヶ月で 60.83 タスク

ストレージの追加はなしとする

- vCPU にかかる費用

  60.83 タスク x 4 vCPU x 24 時間 x 0.05056 1 時間あたり USD = 295.25 USD vCPU 時間用

- メモリにかかる費用

  60.83 タスク x 16.00 GB x 24 時間 x 0.00553 USD/GB/時間 = 129.17 USD GB 時間用

- 合計

  295.25 USD + 129.17 USD = 424.42 USD

開発環境用などで性能を抑えればかなり安くできます

性能を以下のようにした場合

- 台数 = 1
- vCPU = 0.5
- メモリ = 2GB

vCPU もメモリも 1/16 になるので、 26.53 USD / 月 になります

起動時間を平日の業務時間中のみに制限すれば更に安くできます

また、 Fargate Spot を利用することでも安くすることが可能です

| 単位 | 料金 | 通常との比 |
| :-- | --: | --: |
| 1 時間あたりの vCPU 単位 | 0.01554869 USD | 30.75 % |
| 1 時間あたりの GB 単位 | 0.00170064 USD | 30.75 % |

通常に対して 30.75 % の費用まで抑えられます 

Fargate Spot を利用する場合、 `manifest.yml` の `count` を以下のように設定します

- 通常の Fargate

  ```yml
  count: 1
  ```

- Fargate Spot

  ```yml
  count:
    spot: 1
  ```

以下のように指定することで Auto Scaling も可能です

```yml
count:  
  range:
    min: 1
    max: 5
    spot_from: 2
  cpu_percentage: 70
  memory_percentage: 80
  requests: 10000
  response_time: 2s
```

更に Linux/ARM を使えば 20% 安くなります

```yml
platform: linux/arm64
```

### ELB

1 台の Application Load Balancer が作成されます

https://aws.amazon.com/jp/elasticloadbalancing/pricing/?nc=sn&loc=3

1 時間で 1GB のデータを処理する = 1 LCU と仮定します

- ロードバランサーの固定費用

  1 ロードバランサー x 0.0243 USD/時間 x 730 時間 (1 か月) = 17.74 USD

- 1 LCU にかかる費用

  1 ロードバランサー x 1 LCU x 0.008 LCU 料金/時間 x 730 時間/月 = 5.84 USD

- 合計

  17.74 USD + 5.84 USD = 23.58 USD

### Route53

`<環境名>.<アプリケーション名>.local` のプライベートホストゾーンが1つ作成されます

https://aws.amazon.com/jp/route53/pricing/

ホストゾーン1つなので、 0.50 USD 費用が発生します

### 合計費用

| サービス | 費用 |
| :-- | --: |
| ECR | 0.10 USD |
| ECS | 424.42 USD |
| ELB | 23.58 USD |
| Route53 | 0.50 USD |
| 合計 | 448.6 USD |

合計でおおよそ 500 USD になりました

実際にはここにドメイン費用やデータベース、 CloudFront の料金が追加されます

## EC2 の場合との比較

費用のほとんどは ECS であり、 EC2 で構成した場合もそれ以外の要素はほぼ同じになるはずなので、
EC2 で同程度の性能にした場合の費用と比較してみましょう

参考: ECS で指定できる vCPU とメモリの値の組み合わせ

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-cpu-memory-error.html

EC2 インスタンス m6g.xlarge = ECS 4vCPU、メモリ 16GB とする

東京リージョン、1時間、1台当たりの費用

| サービス | 費用 |
| :-- | --: |
| ECS Fargate | 0.281 USD |
| ECS Fargate Spot | 0.086 USD |
| EC2 オンデマンド | 0.198 USD |
| EC2 3年前払い | 0.075 USD |

普通に Fargate だけで使うと ECS の方が EC2 のオンデマンドより 42 % ほど高くなります

Fargate Spot を使えば EC2 の 50% で動かせるので、
オートスケーリングとうまく組み合わせると良さそうですね

開発環境用として EC2 、 ECS のそれぞれ最低コストの場合も見てみましょう

- EC2: t2.nano = 1vCPU、 0.5GB （ECS だと、この組み合わせは指定できない）
- ECS: 0.25 vCPU、 0.5GB (EC2 だと、 vCPU を 1 未満にはできない)

東京リージョン、1時間、1台当たりの費用

| サービス | 費用 |
| :-- | --: |
| ECS Fargate | 0.0154 USD |
| ECS Fargate Spot | 0.0047 USD |
| EC2 オンデマンド | 0.0076 USD |
| EC2 3年前払い | 0.0050 USD |

最安値は ECS で Fargate Spot を使う場合でした

開発環境など、簡易的に立ち上げるだけなら ECS がお得です

## まとめ

Copilot から Auto Scaling や Fargate Spot の指定をすることで、
EC2 よりもコストを抑えられることがわかりました

EC2 で Phoenix を動かす場合、 Terraform や Ansible などで環境構築する必要があり、
リリースにも色々気を遣う必要がありました

Copilot の場合は環境構築、リリースが圧倒的に楽なので、
コストが十分に抑えられるのであれば積極的に使いたいですね