はじめに
AWS上にNext.jsをホスティングしようと考えた時にいくつかのパターンが考えられます。
AWSの料金体系も複雑で、自分メモがてら誰かの役に立てばと纏めました。
比較するサイトの規模として3パターン計算しています。
料金は2022/11/08時点の料金ですので変わる可能性があるので注意が必要です。
前提条件
サイトはブログを想定(24時間起動)
- サイトA
- 月間100万PV 毎日更新(月30件)
- サイトB
- 月間10万PV 2日に1回更新(月15件)
- サイトC
- 月間1万PV 1週間に1回更新(月5件)
1か月は30日 = 720時間
情報
無料枠は考慮せず、ボリュームディスカウントは一番高い料金で計算
事前:データ量の計算
1ページは1MBとする
- サイトA
- 100万PV ×1MB=1TB
- サイトB
- 10万PV ×1MB=100GB
- サイトC
- 1万PV ×1MB=10GB
事前:CloudFrontの計算
無料枠内に収まる想定
・1 TB のデータ転送 (アウト)
・1,000 万件の HTTP または HTTPS リクエスト
情報
2021/11月の改定で無料枠が50 GBから1 TBに拡充されました。
古いブログ等では、50 GBで計算されていて高い場合があります。
事前:DB使用料金(記事の保存先として利用)
Amazon RDS for MySQL/PostgreSQL
db.t4g.micro(スタンダード)0.025USD/時 × 720時間
合計 18 USD
情報
負荷は高くないと想定されるため、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 |
注意
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 |
注意
インスタンスタイプで料金は大きく変わります。
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 |
注意
インスタンスタイプや記事の管理は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 |
注意
CPUやメモリでコスト増大
AWS ECS(EC2起動タイプ)
情報
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 |
注意
AWS Fargateに比べて、CPUやメモリの下限が高い。
ビルド時間に応じて追加コストが発生するが、SSGのサイトでこのサービスは使用しないだろうと想定して見積もっていない。
Amazon Lightsail
情報
月額 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 分 * 1回5分(想定) = 0.05 USD
情報
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まで対応しました
注意
対応しているNext.jsのバージョンが古い
2022/11/21 Next.js 13まで対応
その他費用がかかるもの
・Route53独自ドメイン(1ホストゾーン 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さんですね。
無料でできる事が多いですし、画像のS3保存もできます。
imgixでの画像最適化もできますので、next/imageの代替にできるんじゃないでしょうか。