【保存版】AWS＋Next.jsのホスティングパターンと料金概算

# はじめに
AWS上にNext.jsをホスティングしようと考えた時にいくつかのパターンが考えられます。
AWSの料金体系も複雑で、自分メモがてら誰かの役に立てばと纏めました。

比較するサイトの規模として３パターン計算しています。
料金は2022/11/08時点の料金ですので変わる可能性があるので注意が必要です。
# 前提条件
サイトはブログを想定（２４時間起動）
<dl>
  <dt>サイトA</dt>
  <dd>月間１００万PV　毎日更新（月３０件）</dd>
  <dt>サイトB</dt>
  <dd>月間１０万PV　２日に１回更新（月１５件）</dd>
  <dt>サイトC</dt>
  <dd>月間１万PV　１週間に１回更新（月５件）</dd>
</dl>
全コンテンツのサイズは１GB

１か月は３０日　＝　７２０時間

:::note info
情報
無料枠は考慮せず、ボリュームディスカウントは一番高い料金で計算
:::

## 事前:データ量の計算
１ページは1MBとする
<dl>
  <dt>サイトA</dt>
  <dd>１００万PV ×１MB＝１TB</dd>
  <dt>サイトB</dt>
  <dd>１０万PV ×１MB＝100GB</dd>
  <dt>サイトC</dt>
  <dd>１万PV ×１MB＝10GB</dd>
</dl>

## 事前:CloudFrontの計算
無料枠内に収まる想定
・1 TB のデータ転送 (アウト)
・1,000 万件の HTTP または HTTPS リクエスト

[CloudFront料金表](https://aws.amazon.com/jp/cloudfront/pricing/?nc=sn&loc=3)

:::note info
情報
2021/11月の改定で無料枠が50 GBから1 TBに拡充されました。
古いブログ等では、50 GBで計算されていて高い場合があります。
:::

## 事前:DB使用料金（記事の保存先として利用）
Amazon RDS for MySQL/PostgreSQL
　db.t4g.micro（スタンダード）0.025USD/時 × 720時間
　合計 18 USD

:::note info
情報
負荷は高くないと想定されるため、CPUクレジットは考慮しない
Aurora、Oracleなどは使わないだろうと想定
:::

DynamoDB
　書き込み要求ユニット 100 万あたり 1.4269USD
　読み出し要求ユニット 100 万あたり 0.285USD
　データストレージは25 GBの無料枠内
　合計 1.7119 USD
# S3ホスティング
データ転送：0.114USD/GB(データ転送量100 GB無料)
リクエスト（Get）：0.00037USD/1000リクエスト
リクエスト（Put）：0.0047USD/1000リクエスト
ストレージ：0.025USD/GB

| サイト|データ転送 |リクエスト（Get）|リクエスト（Put）|ストレージ|合計|
|:--|:--|:--|:--|:--|:--|
| A|102.6 (900 GB)|0.37|0.0047|0.025|102.9997 USD|
| B|0 |0.037|0.0047|0.025|0.0667 USD|
| C|0 |0.0037|0.0047|0.025|0.0334 USD|

[S3料金表](https://aws.amazon.com/jp/s3/pricing/)

:::note warn
注意
HTTPSをサポートしていません
:::
# CloudFront+S3
| サイト|CloudFront |S3からCloudFront|ストレージ|合計|
|:--|:--|:--|:--|:--|
| A|0 |0|0.025|0.025 USD|
| B|0 |0|0.025|0.025 USD|
| C|0 |0|0.025|0.025 USD|


# EC2
データ転送：0.114USD/GB(データ転送量100 GB無料)
インスタンス：t3.micro 0.0136 USD/時 × 720時間 = 9.72 USD
EBS：汎用 SSD (gp3) 0.096USD/GB 月 × 20 GB（想定） = 1.92 USD

| サイト|データ転送 |EC2|EBS|合計|
|:--|:--|:--|:--|:--|
| A|102.6 (900 GB)|9.72|1.92|114.24 USD|
| B|0 |9.72|1.92|11.64 USD|
| C|0 |9.72|1.92|11.64 USD|

:::note warn
注意
インスタンスタイプで料金は大きく変わります。
t3.medium	0.0544 USD/時 × 720時間 = 39.168 USD
:::

また、SSRやISRの選択肢があるため、記事の管理方法にもバリエーションが生まれます。
・SSG（追加コスト不要）
・記事をRDSで管理 18 USD
・記事をDynamoDBで管理 1.7119 USD
・Headless CMSを利用（各サービスの料金体系に依存するが無料枠でなんとかなりそう）
・OSSのHeadless CMS（Strapiなど）を利用（別途、サーバーを用意する必要がある）

# CloudFront+EC2
| サイト|CloudFront |EC2からCloudFront|EC2|EBS|合計|
|:--|:--|:--|:--|:--|:--|
| A|0 |0|9.72|1.92|11.64 USD|
| B|0 |0|9.72|1.92|11.64 USD|
| C|0 |0|9.72|1.92|11.64 USD|

:::note warn
注意
インスタンスタイプや記事の管理はEC2単体と同じです。
:::

# AWS Fargate
CPU：0.5 vCPU（想定） ×　0.05056USD/時 × 720時間 = 18.2016 USD
メモリ：1 GB（想定） ×　0.00553USD/時 × 720時間 = 3.9816 USD
データ転送:EC2と同じ※CloudFrontの選択肢もあり

| サイト|データ転送 |CPU|メモリ|合計|
|:--|:--|:--|:--|:--|
| A|102.6 (900 GB)|18.2016|3.9816|124.7832 USD|
| B|0 |18.2016|3.9816|22.1832 USD|
| C|0 |18.2016|3.9816|22.1832 USD|


:::note warn
注意
CPUやメモリでコスト増大
:::

# AWS ECS（EC2起動タイプ）
:::note info
情報
EC2と同じため、省略
:::


# AWS App Runner
CPU：1 vCPU（想定） ×　0.064 USD/時 × 720時間 = 46.08 USD
メモリ：2 GB（想定） ×　0.007 USD/時 × 720時間 = 10.08 USD
データ転送:EC2と同じ※CloudFrontの選択肢もあり

| サイト|データ転送 |CPU|メモリ|合計|
|:--|:--|:--|:--|:--|
| A|102.6 (900 GB)|46.08|10.08|158.76 USD|
| B|0 |46.08|10.08|56.16 USD|
| C|0 |46.08|10.08|56.16 USD|

:::note warn
注意
AWS Fargateに比べて、CPUやメモリの下限が高い。
ビルド時間に応じて追加コストが発生するが、SSGのサイトでこのサービスは使用しないだろうと想定して見積もっていない。
:::

# Amazon Lightsail
:::note info
情報
月額 3.5 USD
データ転送は1TBまで無料
:::
| サイト|データ転送 |月額料金|合計|
|:--|:--|:--|:--|
| A|0 |3.5|3.5 USD|
| B|0 |3.5|3.5 USD|
| C|0 |3.5|3.5 USD|

Node.jsインスタンスでセルフホスティングでも、Nginxインスタンスでリバースプロキシでもどちらでも大丈夫。
Headless CMSと組み合わせてOn-demand ISRも可能です。

# AWS Amplify
データ転送：0.15 USD/GB
ストレージ：0.023 USD/GB
ビルド & デプロイ：0.01 USD/1 分 * １回5分（想定） = 0.05 USD

:::note info
情報
SSGで記事追加ごとにビルドするのを想定（SSRやISRだと初回ビルドだけで良いが別途記事管理の費用が必要）
:::

| サイト|データ転送 |ストレージ|ビルド & デプロイ|合計|
|:--|:--|:--|:--|:--|
| A|150|0.023|1.5|151.523 USD|
| B|15 |0.023|0.75|15.773 USD|
| C|1.5 |0.023|0.25|1.773 USD|

（追記）Next.js 13まで対応しました

https://aws.amazon.com/jp/blogs/news/amplify-next-js-13/

:::note warn
注意
 ~~対応しているNext.jsのバージョンが古い~~
2022/11/21 Next.js 13まで対応
:::

# その他費用がかかるもの
・Route53独自ドメイン（１ホストゾーン 0.5USD/月）
・東京リージョンから海外（米国・カナダ・欧州）へ配信した場合、料金が変わる
・Serverless Next.js Componentを利用した場合、Lambda@Edgeなどのサービス料金が追加で掛かる
・ISRの場合、revalidateの設定に応じてDB等へのリクエストが増える
・AWS WAFでEDos攻撃の対策は導入したい
・next/imageで画像を最適化したいがCloudFrontに対応できないので、別途仕組みを作る必要がある

# 個人的な思い
私的には、Amazon Lightsailのnode.jsインスタンスでセルフホスティングするのが良いかなと思っています。
next/imageも使えますし、On-demand ISRもできますし。

Headless CMSは[NEWT](https://www.newt.so/)さんですね。
無料でできる事が多いですし、画像のS３保存もできます。
imgixでの画像最適化もできますので、next/imageの代替にできるんじゃないでしょうか。