問題の概要
Google Cloud Run FunctionからPATCHリクエストを送信した際、AWS WAFによってリクエストがブロックされ、403 Forbiddenエラーが発生する問題が発生しました。
発生した症状
- エラー: 403 Forbidden
- 環境: GCP Cloud Run Function → AWS ALB + WAF + Rails API
-
リクエスト:
PATCH /api/admin/sg_pos_reports/{id}
-
User-Agent:
python-requests/2.32.3
調査プロセス
1. ALBログの確認
ALBログを有効化して調査したところ、以下のログが確認できました:
https 2025-07-01T02:04:37.515827Z xxxx 34.34.226.58:25929 - -1 -1 -1 403 - 612 271 "PATCH https://xxxxxx:443/api/admin/sg_pos_reports/34 HTTP/1.1" "python-requests/2.32.3" ..... -1 2025-07-01T02:04:37.508000Z "waf" "-" "-" "-" "-" "-" "-" TID_270745a72b66de4bb1695e593fe663e4bb1695e593fe663e4
ログの最後に"waf"
という文字があることから、WAFによってリクエストがブロックされていることが判明しました。
2. WAFログの調査
WAFログを有効化して調査しましたが、該当するリクエストのログが見つかりませんでした。これは、リクエストがWAFレベルでブロックされ、詳細なログが残らなかったためと推測されます。
3. 原因の特定
AWS Managed Rulesの以下のルールがGCPからのリクエストをブロックしている可能性が高いと判断:
- AWSManagedIPReputationList: 悪意のあるIPアドレスのリスト
- AWSManagedRulesAnonymousIpList: 匿名IPアドレスのリスト
GCPのCloud Run FunctionのIPアドレスがこれらのリストに含まれている可能性があります。
解決方法
WAFにホワイトリストルールを追加
AWS WAFに新しいルールを作成して、特定の条件下でGCPからのリクエストを許可するようにしました。
ルール設定内容
-
ルール名:
Allow-CloudRun-SgPosReport-API
- アクション: Allow
- 優先度: 最優先(4)
条件設定
-
リクエストパス:
/api/admin/sg_pos_reports*
-
HTTPメソッド:
PATCH
,GET
-
Content-Type:
application/json
- 送信元IP: GCPのCloud Run FunctionのIPアドレス範囲
具体的な設定手順
- AWS WAF & Shieldコンソールにアクセス
- 該当するWeb ACLを選択
- 「Add rules」→「Add my own rules and rule groups」
- ルール詳細を設定:
まとめ
GCPからAWSへのクロスクラウド通信において、AWS WAFのManaged Rulesによるブロックは起こりうる問題です。この問題を解決するには:
- 適切なログを有効化して問題を特定
- ホワイトリストルールを慎重に設計
- セキュリティを維持しながら必要な通信を許可
このような問題に遭遇した場合は、ログを詳細に調査し、段階的にルールを調整することが重要です。