【AWS】AWS WAF と他リソースの紐づけ方が、紐づけ先リソースによって違うって話
はじめに
オンプレだと値段も高くて運用もたいへんな WAF が、 AWS だとお手軽に入れられるってんで重宝されている AWS WAF。リージョナルリソース (ALB/API Gateway) と CloudFront に紐づけて使うことができます。
WAF では、これら紐づけ先のリソースをリソースタイプとして区別しており、 WAF を扱う中で「どちらのタイプのリソースに紐づける WAF なのか」を意識しなければならない場面がたびたびあります。
また、ただ単に区別がされているだけでなく、タイプによって紐づける方法が異なります。これを説明するのが今回の趣旨です。
基本原則
- リージョナルリソースの場合は、 WAF(WebACL) 側から、紐づけるリソースを指定します。
- CloudFront の場合は、 CloudFront(Distribution) 側から、紐づける WebACL を指定します。
マネジメントコンソールの場合
リージョナルリソース
マネコンで WebACL を作るとき、「Associated AWS resources - optional」というセクションがあり、そこで指定できます(もちろん、作成した後も編集可能です)。
CloudFront
CloudFront の Distribution 作成/編集画面で WebACL を指定できます。
※不思議なのは、 WebACL 作成画面でリソースタイプとして CloudFront distributions を選択していても、 Associated resources が選択できるという点。私が試したときはディストリビューションを指定しても実際には紐づけられませんでした。
CloudFormation の場合
※新しい API である AWS::WAFv2
リソースを前提とします。
CloudFormation では、リソースタイプを AWS::WAFv2::WebACL
内で Type
として指定します。リージョナルリソースの場合は REGIONAL
、CloudFront の場合は CLOUDFRONT
です。
リージョナルリソース
AWS::WAFv2::WebACLAssociation
というリソースを使って、紐づける リソースと WebACL の ARN をそれぞれ指定します。
Type: AWS::WAFv2::WebACLAssociation Properties: ResourceArn: String WebACLArn: String
CloudFront
先ほどの WebACLAssociation のドキュメント中でも言及されていますが、CloudFrontでは AWS::CloudFront::Distribution
を使って、 Properties
の DistributionConfig
の中の、 WebACLId
で、ディストリビューションに紐づける WebACL の ID を指定します。
実運用での話
紐づけ先リソースによって、ベースとなるリソースが異なる(WAFv2 or CloudFront)こと、更に参照方法が異なる(ARN or WebACL ID)ことが、なんだか気持ち悪いし、実運用でも混乱しそうだなって感じです。
例えば、 CloudFormation のベストプラクティスとして「ライフサイクルに応じてテンプレートを分ける」というのがありあます。このべスプラに則ると、「使用する WebACL」は WebACL を紐づける先のリソースと一緒に管理すべきだと解釈していて、これに則ると「ALB を管理するテンプレートの中にしれっと AWS::WAFv2::WebACLAssociation
が混じってる」みたいなことになるわけです。気持ち悪くないですかこれ。 CloudFormation をゴリゴリ使う立場にはないんですが、CloudFormationist はこういう気持ち悪さを受け入れながら使っているんでしょうか?
おわりに
なんか愚痴っぽくなってしまいましたが……やってる中で気になったことなのでメモしてみました。 AWS WAF 自体は、従来の WAF をクラウドらしいシンプルなものに定義し直した面白いプロダクトだと思っていて、今後のアップデートを期待したいです。特に、リージョナルリソースでも独自エラーページを返せたり、ステータスコードを変更できるようになると嬉しいです。