特定のIPセットが登録されたWebACLを抽出したいときはAWS Configの高度なクエリを使おう
こんにちは、岩城です。
AWS WAFのIPセットを削除しようとした際、WebACLに関連付けられているため削除できないことを示す以下メッセージが出力されました。
AWS WAF couldn’t perform the operation because your resource is being used by another resource or it’s associated with another resource.
これを解決するには、当該IPセットを利用したルールが関連付けられたWebACLを特定し、そのルールを削除する必要があります。WebACLやそれに関連するルールの数が少なければ、マネジメントコンソールで1つずつ確認すれば良いかも知れません。ところが、数が多いと手動で確認するのは辛いです。
マネジメントコンソールやCLIなど調べましたが、現状AWS WAF独自の機能でIPセットをキーに検索はできません。それではどうするか、AWS Configの高度なクエリ機能を使いましょう。
本エントリでは、手動で総当りするのは避けるため、Configの高度なクエリ機能を利用して手軽に抽出する方法を紹介します。
やってみた
前提として、Configの記録が有効であることと、WAFv2 IPSet
とWAFv2 WebACL
が記録するリソースタイプに含まれている必要があります。
Configの高度なクエリで以下のクエリを実行すれば、IPセットのARNをキーに関連付けられたWebACLを検索することができます。 表示するカラムはConfig JSONのKeyを指定しています。カスタマイズしたい場合は、ドキュメントやマネジメントコンソールから各リソースのConfig情報を確認して変更してみてください。
SELECT resourceId, resourceName, relationships WHERE resourceType = 'AWS::WAFv2::WebACL' AND relationships.resourceId = '<IPセットのARN>'
実際に実行すると以下のような感じで表示されます。
IPセットのARNを確認する方法はいくつかあります。
- WebACLのコンソールから関連づいたIPセットのARNを確認する
- IPセットのコンソールからは確認できません
- IPセットが関連づいたWebACLが分かっている必要がある
- CLIを使ってARNを確認する
- ConfigのリソースからIPセットを検索してARNを確認する
本エントリではConfigのリソースからIPセットのARN(Amazon Resource Name)を確認する方法を紹介します。
Configのリソース
を開き、リソースタイプにAWS WAFv2 IPSet
を選択すると、Configを実行したリージョンに存在するIPセットのリストが表示されます。
Configはリージョナルサービスであるため、リージョンを横断的に確認することができません。調べたいリソースを作成したリージョンやConfigの実行リージョンを確認してください。
たとえば、CloudFrontに関連するWAFの場合、一律バージニアリージョンでWebACLやIPセットが作られているはずです。
IPセットを選択すると詳細ページに遷移しARNを確認できます。
おまけ
今回紹介したクエリはリソースタイプにAWS::WAFv2::WebACL
を指定しました。
これはIPセットのrelationships
には、IPセットに関連付けられたWebACLが含まれないからです。
WebACLのConfig情報には、関連付けられたIPセットが含まれるため、WebACLに対してIPセットのARNをキーにクエリしました。
おわりに
実は当初、全WebACLの情報をCLIで出力した後、IPセット名でgrepしようとしてました。
もっと他に良い方法があるはずと思い社内で相談したところ、AWS Configでいけるかもとコメントいただき、素早く簡単に調べることができました。
丸毛さんありがとうございます!
今回はIPセットを調べるためにConfigの高度なクエリを使用しましたが、あるセキュリティグループに関連付けられたEC2インスタンスを調べるなど、応用の幅は広いと思います。
Configの高度なクエリは便利なので活用しましょう!
できればIPセットのコンソールからARNや関連付けられたWebACLを調べられると嬉しいですね!
本エントリがどなたかのお役に立てれば幸いです。