結論
単純に大容量ファイルをアップロードできるようにする場合は
AWS-AWSManagedRulesCommonRuleSet
に設定されているSizeRestrictions_BODY
をOverride to Count
にする。(これで大容量ファイルを上げ放題になる)
特定のパスでのみ許可したい場合は
以下二つのルールを追加する。
①特定のパスへのアクセスを許可
②8KBリクエストボディを超えるアクセスをブロック
ルールのPriorityをデフォルトで設定されているものの下に上記①、②の順で設定する。
原因
先に結論から言うと
AWS-AWSManagedRulesCommonRuleSetに設定されているSizeRestrictions_BODYがアクセスをブロックしている
ということです。
ALB作成時にAWS Web Application Firewall(WAF)
で事前定義済みのウェブACLを自動生成
を選択して作成するとWeb ACL(アクセスコントロールリスト)が作成され、その中に3つのルールがデフォルトで用意されます。
そのルールの一つ、AWS-AWSManagedRulesCommonRuleSet
でSizeRestrictions_BODY
が設定されており、8KBを超えるリクエストボディを検知すると通信をブロックするという内容になっています。
とにかく大きいファイルをアップロードできるようにしたい場合
AWS-AWSManagedRulesCommonRuleSet
に設定されているSizeRestrictions_BODY
をOverride to Count
にすることでファイルアップロードできるようになります。
Override to Allow
にしてしまうとこの条件に一致した時点でアクセスを許可してしまい、このルールよりも優先度が低いルールのフィルタをすり抜けてしまうので、アクセス数を数えるだけのCountにしておきます。
しかし、この設定は大容量ファイルをリクエストボディに設定しアクセスされることでサーバーに高負荷がかかることを許すことになります。
特定の操作でのみ大型ファイルアップロードのアクセスを許したい場合
上記では大容量ファイルを誰でもどのパスでも上げ放題になってしまいます。
私なりに2つの方法でこの上げ放題を抑制する方法を考えました。
どの方法もとにかく大きいファイルをアップロードできるようにしたい場合の内容を設定していることが前提です。
特定のIPアドレスからのアクセスの場合に許可する
ファイルのアップロード機能がサービスの管理ページにのみある
のであれば管理者が大容量ファイルをアップロードすることになるので管理者が特定のIPからのみ操作する場合にこの手法が利用できます。
設定手順は以下です。(UI変更などが多発するため詳細は割愛)
①対象のIPアドレスのIP set
を作成
②対象のWeb ACL
でIP set
を利用して対象のIPからのアクセスを許可するルールを追加
③追加したルールの優先度を最上位にする
これで特定のIPアドレスからのアクセスの場合のみファイルをアップロードできるようになりました。
特定のURLのみ許可する
特定のURLを利用したファイルアップロードのみ大容量ファイルアップロードアクセスを許可する設定ができます。
設定手順は以下です。(UI変更などが多発するため詳細は割愛)
①対象のWeb ACL
でRule Builder
を利用し、URI path
が対象のURLに正規表現でマッチする場合に許可するルールを追加
②対象のWeb ACL
でRule Builder
を利用し、Body
が8KB以上の場合にブロックするルールを追加する
③上記で追加したルールのPriorityをデフォルトで設定されているものの下に①、②の順で設定する
これで特定のURLでのみ大容量ファイルをアップロードできるようになりました。
デフォルトのSizeRestrictions_BODYが機能しなくなっているので手順③でサイズを確認するフィルタを自前で作成しています。
③のルールでブロックされる前に②のルールでアクセスを許可するようにしています。
参考