ある朝、AWS Cost Explorerを開いたら前日のデータ転送費用が18万円になっていた。通常は1日3,000円程度のサービスだ。CloudFrontのアクセスログを見ると、特定のエンドポイントに対して秒間8,000リクエスト以上のトラフィックが流れていた。結果、月末の請求額は約210万円。この記事では、同じ状況に陥った時に何を最優先で実行すべきか、そして事前に設定しておくべき防御策6つを具体的な手順と共に記載する。
気づいた時にはもう遅い ─ DDoSコストの恐怖
DDoS攻撃の厄介な点は、AWSのインフラが攻撃トラフィックを「正常に処理してしまう」ことにある。オートスケーリングは忠実にインスタンスを増やし、CloudFrontはデータ転送量に応じて課金する。攻撃を受けている間、AWSから見れば「アクセスが増えた正常なサービス」にすぎない。
緊急対応: 最初の30分でやること
1. 攻撃元IPのブロック
# WAF IPセットを作成してブロック
aws wafv2 create-ip-set \
--name "DDoS-Block-List" \
--scope CLOUDFRONT \
--ip-address-version IPV4 \
--addresses "203.0.113.0/24" "198.51.100.0/24"
# 既存のWeb ACLにIPブロックルールを追加
aws wafv2 update-web-acl \
--name "my-web-acl" \
--scope CLOUDFRONT \
--default-action '{"Allow":{}}' \
--rules '[{"Name":"BlockDDoS","Priority":0,"Statement":{"IPSetReferenceStatement":{"ARN":"arn:aws:wafv2:..."}},"Action":{"Block":{}},"VisibilityConfig":{"SampledRequestsEnabled":true,"CloudWatchMetricsEnabled":true,"MetricName":"BlockDDoS"}}]'
2. CloudFrontのGeo制限(国外からの攻撃の場合)
aws cloudfront update-distribution \
--id E1234567890 \
--distribution-config '...' # Restrictionsで国コードをWhitelist指定
3. AWSサポートへの連絡
Business以上のサポートプランであれば、DDoS攻撃に起因するコスト増の免除申請(DDoS cost protection)が可能。Shield Advancedを契約している場合はSRTチーム(Shield Response Team)に直接エスカレーションできる。
事前に設定しておくべき防御策6選
防御1: AWS Budget Alertsの設定
最も基本的かつ見落とされがちな設定。日次予算アラートを設定し、通常の3倍を超えた時点で通知する。
aws budgets create-budget \
--account-id 123456789012 \
--budget '{
"BudgetName": "DailySpendAlert",
"BudgetLimit": {"Amount": "10000", "Unit": "USD"},
"TimeUnit": "DAILY",
"BudgetType": "COST"
}' \
--notifications-with-subscribers '[{
"Notification": {"NotificationType":"ACTUAL","ComparisonOperator":"GREATER_THAN","Threshold":300,"ThresholdType":"PERCENTAGE"},
"Subscribers": [{"SubscriptionType":"EMAIL","Address":"ops@example.com"}]
}]'
防御2: WAFレートベースルール
同一IPからの過剰リクエストを自動ブロックする。5分間で2,000リクエストを超えたIPを自動遮断するルールが現実的な閾値。
# WAFルール内にレートベースステートメントを作成
aws wafv2 create-web-acl \
--name "rate-limit-acl" \
--scope CLOUDFRONT \
--default-action '{"Allow":{}}' \
--rules '[{"Name":"RateLimit","Priority":1,"Statement":{"RateBasedStatement":{"Limit":2000,"AggregateKeyType":"IP"}},"Action":{"Block":{}},"VisibilityConfig":{"SampledRequestsEnabled":true,"CloudWatchMetricsEnabled":true,"MetricName":"RateLimit"}}]'
防御3: CloudFrontのOrigin Shield有効化
Origin Shieldを有効にすると、キャッシュレイヤーが1つ増え、オリジンサーバーへのリクエスト数を劇的に減らせる。これだけでDDoS時のバックエンド負荷とコストが大幅に下がる。
防御4: AWS Shield Advanced
月額3,000ドルと高額だが、DDoSによるコスト増加分の補填を受けられるDDoS cost protectionが付く。本番サービスを運用しているなら投資対効果は十分にある。
防御5: CloudFront Function でのボットフィルタリング
// CloudFront Functionでブラウザ以外のUser-Agentをブロック
function handler(event) {
var ua = event.request.headers['user-agent']
? event.request.headers['user-agent'].value : '';
if (!ua || ua.length < 10) {
return { statusCode: 403, statusDescription: 'Forbidden' };
}
return event.request;
}
防御6: オートスケーリングの上限設定
EC2やECSのオートスケーリングに上限を設定していないと、DDoS時に無限にスケールしてコストが爆発する。最大インスタンス数を明示的に制限する。
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name my-asg \
--max-size 10
請求の免除交渉
Shield AdvancedのDDoS cost protectionを使えば、DDoS攻撃に起因するスケーリングコストの免除が可能だ。Shield Advancedを契約していなくても、AWSサポートに状況を説明し、CloudTrailとVPCフローログを証拠として提出することで一部免除が認められたケースもある。ただし確約はされていないため、事前の防御設定が最重要であることに変わりはない。
まとめ
DDoS対策は「攻撃を防ぐ」ことよりも「コストを制御する」ことが本質だ。AWSは攻撃トラフィックも正常トラフィックとして課金する。Budget Alerts、WAFレートリミット、オートスケーリング上限の3つは最低限今日中に設定してほしい。200万円の請求書を受け取ってからでは遅い。