サイトの動作テスト中にエラーが出てしまい、アプリ側なのか、サーバー側なのか、WAF側なのか、エラーの切り分けを行う際のメモです。
切り分けステップ
1. 構成を確認する
現在の環境を確認する
- CloudFront? ALB? EC?
- AWS WAF は CloudFront、ELB どちらに紐づいているか?
2. Google Chrome などのデベロッパーツールでエラーの再現を取得
- Chrome のデベロッパーツールで Network タブを開きながら、エラーを再現
- エラーが発生した際の HAR ファイルの保存
- エラーが発生した際のレスポンスヘッダーを確認。エラーが、CloudFront なのか、ELB なのか、EC2 (Nginx や Apache) なのかを確認
- エラーが発生した時刻を確認
- エラーが発生している URI パスを確認
3. AWS WAF 管理画面から、WAF でブロックしていないか確認
テストアクセスから数分待ってから行う
- AWS WAF の管理画面にログイン
- Web ACL に入る (利用リージョンを確認)
- Overview タブの中の「Sampled request」を見つける
- 「Find sampled requests」よりエラーが発生した URI パスをドメイン抜きで入れる
- 絞り込み結果からアクセスの日時を確認し対象のリクエストを見つける
- BLOCK, COUNT, ALLOW なのかを確認
- BLOCK の場合
- Managed Rule の場合、対象ルールの絞り込みができるのであれば、COUNT 設定を追加し、再度、STEP 2 のエラーを再現に戻って、リクエストがブロックされないかを確認
- COUNT & ALLOW の場合
- 実は他のルールが BLOCK していないか STEP 2 に戻り、Chrome のヘッダーレスポンスを確認して再度 WAF がブロックしていないかも確認する
- それでも WAF は通過しているのであれば、次の原因調査に向かう。
4. ELB のアクセスログを確認
ELB のアクセスログをとっているのであれば、S3 バケットから該当の日時を確認して、どのようなエラーかを確認。
- アクセスログに
waf, forwaded
が記録されているかを確認。forwarded とは WAF を通過したということ。
ELB でアクセスが止まっている場合は、ターゲットグループやALBのルールの問題なので、それらを見直す。
- ターゲットグループのヘルスチェックが失敗していないか
- ALB ルールがきちんと意図したターゲットグループに飛んでいないか
5. EC2 や Lambda などのエラーを確認
- EC2, Lambda 内の Apache or Nginx ログを確認し、アクセスがきちんと届いているかを確認。
- 届いている場合はアプリ側の問題
- 届いていなかったら、前面の部分でトラフィックをブロックしているかもなので、STEP2 エラーの再現を取得からやり直し
以上