はじめに
こんばんは、mirukyです。
ある日突然、AWSから $15,000(約200万円)の請求書 が届いたらどうしますか?
2026年3月、海外でまさにこの事態が発生しました。個人開発者のS3バケットがDDoS攻撃を受け、3日間で160TBのデータ転送が発生。結果として約200万円の請求が来たのです。AWS側に減額を申し出て一部減額は受けたものの、それでも到底払えない金額が残りました。
怖いのは、この事態は誰にでも起こりうるということです。S3バケットをパブリックに公開している、あるいはCloudFrontの背後に適切な保護を設定していない——それだけで、あなたのAWSアカウントも同じリスクを抱えています。
本記事では、AWS公式ドキュメントと料金体系に基づき、S3/CloudFrontのコスト爆発を防ぐための具体的な防止策をコンパクトにまとめます。
目次
- なぜS3のデータ転送で200万円になるのか
- 防止策①:S3バケットを直接公開しない
- 防止策②:CloudFront + OACで配信する
- 防止策③:AWS WAFでレート制限をかける
- 防止策④:AWS Budgetsでアラートを設定する
- 防止策⑤:CloudFront定額料金プランを使う
- 防止策⑥:AWS Shield を理解する
- 今すぐやるべき設定チェックリスト
1. なぜS3のデータ転送で200万円になるのか
1-1. S3のデータ転送料金の仕組み
S3の利用料金で最も高額になりがちなのは、データ転送(OUT) です。
| 項目 | 東京リージョン料金(2026年3月時点) |
|---|---|
| S3ストレージ | $0.025/GB/月(S3 Standard) |
| GET リクエスト | $0.00037/1,000リクエスト |
| データ転送 OUT(10TBまで) | $0.114/GB |
| データ転送 OUT(10TB〜50TB) | $0.089/GB |
| データ転送 OUT(50TB〜150TB) | $0.086/GB |
| データ転送 OUT(150TB超) | $0.084/GB |
1-2. 160TB転送の試算
実際に160TBが転送された場合の概算です。
最初の10TB: 10,000 GB × $0.114 = $1,140
次の40TB: 40,000 GB × $0.089 = $3,560
次の100TB: 100,000 GB × $0.086 = $8,600
残りの10TB: 10,000 GB × $0.084 = $840
合計: 約 $14,140(約200万円)
実際の請求にはリクエスト料金等も加算されるため、冒頭で紹介したケースでは約$15,000に達しました。つまり、コストのほぼ100%がデータ転送料金です。
1-3. なぜDDoSで転送が発生するのか
S3バケットが直接インターネットに公開されている場合、攻撃者はバケット内のオブジェクトに対して大量のGETリクエストを送信できます。
攻撃者 → S3バケット(パブリック)→ データ転送 OUT → 課金
↑
バケット名さえ分かれば攻撃可能
重要:S3にはレート制限がない
S3はデフォルトで毎秒5,500 GETリクエスト(プレフィックスあたり)をサポートしており、レート制限の仕組みがありません。つまり、パブリックバケットに対しては事実上無制限にリクエストを送り続けられます。
2. 防止策①:S3バケットを直接公開しない
2-1. S3 Block Public Access を有効にする
最も基本的かつ最重要の設定です。2023年4月以降、新規作成されたS3バケットはデフォルトでBlock Public Accessが有効になっていますが、古いバケットでは無効のままの場合があります。
// S3 Block Public Access の設定(すべてONにする)
{
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
AWS CLIで確認する方法:
aws s3api get-public-access-block --bucket YOUR_BUCKET_NAME
出典:Amazon S3 Block Public Access
2-2. S3の403エラーリクエストは課金されない
2024年5月、AWSは 「S3が返す403(Access Denied)および404(Not Found)のHTTPエラーコードについてはリクエスト料金を課金しない」 と発表しました。
つまり、Block Public Accessを有効にしていれば、不正なリクエストが大量に来ても リクエスト料金は発生しません。そしてアクセスが拒否されるため データ転送も発生しません。
これが最もコスパの良い防御策
Block Public Accessは無料です。設定するだけでS3が直接攻撃される経路を遮断でき、不正リクエストに対する課金も発生しません。
3. 防止策②:CloudFront + OACで配信する
3-1. なぜCloudFrontを前に置くべきか
S3のコンテンツをインターネットに配信する必要がある場合、S3を直接公開するのではなく、CloudFrontを前段に配置すべきです。
| 項目 | S3直接配信 | CloudFront経由 |
|---|---|---|
| データ転送料金 | $0.114/GB | $0.114/GB(日本向け) |
| S3→CloudFrontの転送 | — | 無料 |
| キャッシュヒット | なし | キャッシュされたリクエストはS3にアクセスしない |
| DDoS保護 | なし | AWS Shield Standard(自動・無料) |
| レート制限 | なし | AWS WAFと連携可能 |
| 地理的制限 | なし | Geo Restrictionで国単位でブロック可能 |
出典:Amazon CloudFront 料金表、Amazon S3 料金表
3-2. OAC(Origin Access Control)の設定
CloudFrontを前段に置く場合、S3への直接アクセスを完全にブロックし、CloudFront経由のみ許可する必要があります。これがOAC(Origin Access Control)です。
// S3バケットポリシー(CloudFront OAC用)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipalReadOnly",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::YOUR_ACCOUNT_ID:distribution/YOUR_DISTRIBUTION_ID"
}
}
}
]
}
これにより、構成は以下のようになります。
攻撃者 → S3バケット → ❌ アクセス拒否(課金なし)
攻撃者 → CloudFront → キャッシュヒット → レスポンス(S3へのリクエストなし)
攻撃者 → CloudFront → AWS WAF → ❌ レート制限でブロック
出典:Restricting access to an Amazon S3 origin
OAI(Origin Access Identity)は非推奨
以前使われていたOAI は現在はレガシーです。新規設定では必ずOACを使用してください。OACはSSE-KMS暗号化やすべてのS3リージョンをサポートしています。
4. 防止策③:AWS WAFでレート制限をかける
4-1. レートベースルールの設定
CloudFrontにAWS WAFを関連付けて、同一IPからの過剰なリクエストを自動ブロックできます。
| 設定項目 | 推奨値 |
|---|---|
| ルールタイプ | Rate-based rule |
| レート制限 | 5分間で2,000リクエスト(用途に応じて調整) |
| アクション | Block |
| 評価ウィンドウ | 5分 |
4-2. AWS WAFの料金
| 項目 | 料金 |
|---|---|
| Web ACL | $5.00/月 |
| ルール | $1.00/月/ルール |
| リクエスト処理 | $0.60/100万リクエスト |
出典:AWS WAF 料金表
月額の目安: Web ACL 1つ + レートベースルール1つ + マネージドルールグループ1つ = 約$7〜8/月
$7/月のコストで200万円の請求を防げると考えれば、費用対効果は圧倒的です。
AWS WAFマネージドルール
AWSが提供する無料のマネージドルールグループ「AWS IP Reputation List」を追加すると、既知の悪意あるIPアドレスからのリクエストを自動的にブロックできます。
5. 防止策④:AWS Budgetsでアラートを設定する
5-1. コスト異常の早期検知
すべての防御を突破された場合に備え、コストの異常を即座に検知する仕組みが必要です。
AWS Budgetsでは、以下のようなアラートを設定できます。
| アラート設定 | 内容 |
|---|---|
| 月次予算 | 例: $50を超えたらメール通知 |
| 予測アラート | 月末予測が$100を超えたら通知 |
| サービス別フィルタ | S3のデータ転送のみを監視 |
| アクション | 予算超過時にIAMポリシーを適用(S3へのアクセスを制限) |
出典:AWS Budgets
5-2. AWS Cost Anomaly Detection
AWS Budgetsに加えて、AWS Cost Anomaly Detectionを有効にすることで、機械学習ベースの異常検知が利用できます。
- 過去の利用パターンを学習し、異常な支出を自動検知
- 通知先としてメール、SNS、Slackなどを指定可能
- 追加料金なし
通常: S3データ転送 $5/日
異常: S3データ転送 $500/日 ← ここで即座にアラート
Budgetsだけでは不十分
AWS Budgetsのアラートは数時間の遅延があります。DDoS攻撃のように短時間で大量のコストが発生するケースでは、Budgetsだけでは間に合わない場合があります。CloudFrontの定額プランやWAFによる「攻撃そのものを防ぐ」対策と必ず併用してください。
6. 防止策⑤:CloudFront定額料金プランを使う
6-1. 超過料金なしの新料金体系
2024年にAWSは CloudFront定額料金プラン を発表しました。従来の従量課金に加えて、月額固定・超過料金なしのプランが選べます。
| プラン | 月額 | リクエスト | データ転送 | WAF・DDoS保護 |
|---|---|---|---|---|
| Free | $0 | 1M | 100 GB | 基本保護 |
| Starter | $15 | 10M | 50 TB | ユースケース保護 |
| Standard | $200 | 125M | 50 TB | 高度な保護 |
| Premium | $1,000 | 500M | 50 TB | 高度な保護 |
6-2. 定額プランの最大のメリット
| 従量課金の場合 | 定額プラン(Standard)の場合 |
|---|---|
| DDoSで160TB転送 → $14,140 | DDoSで160TB転送 → $200/月のまま |
| 使った分だけ無制限に課金される | 超過料金なし(※使用量超過時はスロットリング等の可能性あり) |
| 予算の見通しを立てにくい | 毎月の支出が確定している |
ブロックされたDDoS攻撃は使用許容量に含まれない
CloudFront定額プランでは、AWS Shield/WAFによってブロックされたDDoS攻撃やWAFでブロックしたリクエストは使用許容量にカウントされません。つまり、攻撃を受けても正当なトラフィックの枠を消費しません。
7. 防止策⑥:AWS Shield を理解する
7-1. Shield Standard vs Shield Advanced
| 項目 | Shield Standard | Shield Advanced |
|---|---|---|
| 料金 | 無料(自動有効) | $3,000/月 + データ転送料 |
| 保護レイヤー | L3/L4(ネットワーク・トランスポート層) | L3/L4 + L7(アプリケーション層) |
| 対象サービス | CloudFront, Route 53, ELB等 | 同左 + EC2, Global Accelerator |
| DDoSコスト保護 | なし | あり(DDoS起因のスケーリングコストを返金) |
| SRT(Shield Response Team) | なし | 24/7対応 |
| WAF費用 | 別途課金 | 保護対象リソースのWAFは含まれる |
7-2. 個人・小規模プロジェクトの場合
Shield Advancedは月額$3,000なので、個人開発や小規模プロジェクトには現実的ではありません。
しかし、Shield Standardは無料で自動的に有効です。CloudFrontを使用するだけで、SYN Flood、UDP Reflection等の一般的なL3/L4 DDoS攻撃からは自動保護されます。
アプリケーション層(L7)の保護はAWS WAFのレートベースルールで対応するのがコスパの良い選択です。
8. 今すぐやるべき設定チェックリスト
上記の防止策を優先度順にまとめました。
| 優先度 | 対策 | コスト | 効果 |
|---|---|---|---|
| 最優先 | S3 Block Public Accessを全バケットで有効化 | 無料 | S3への直接攻撃を遮断 |
| 最優先 | CloudFront + OACでコンテンツを配信 | CloudFront従量課金 or 定額$0〜 | S3を非公開にしつつ配信可能 |
| 強く推奨 | AWS WAFのレートベースルールを設定 | 約$7〜8/月 | L7 DDoS攻撃をブロック |
| 強く推奨 | AWS Budgets + Cost Anomaly Detectionを設定 | 無料 | コスト異常の早期検知 |
| 推奨 | CloudFront定額料金プランの検討 | $0〜$200/月 | 超過料金なしでコスト上限を確定 |
| 大規模向け | AWS Shield Advanced | $3,000/月 | DDoSコスト保護 + SRT |
最小構成(無料で今すぐできること):
・S3 Block Public Access を有効化
・CloudFront + OAC を設定(Freeプラン: $0/月)
・AWS Budgets でアラートを設定
・Cost Anomaly Detection を有効化
→ これだけで200万円の請求リスクをほぼゼロにできる
おわりに
ここまでお読みいただきありがとうございます。
今回のケースから学べる最も重要な教訓は、AWSのコスト爆発は「攻撃された後」ではなく「設定を怠った時点」で始まっているということです。
- S3バケットを直接公開しない(Block Public Access)
- CloudFront + OACで配信する
- AWS WAFでレート制限をかける
- AWS Budgetsで異常を検知する
これらはすべて数分〜数十分で設定でき、ほとんどが無料です。200万円の請求書が届いてからでは遅いので、この記事を読んだらすぐに自分のAWSアカウントを確認してみてください。
ではまた、お会いしましょう。
