Web ACL に関連づいているリソースの洗い出しの際に異なるリソースタイプをどのように取得できるのか調べてみた
いわさです。
先日、Kiro CLI を使って AWS 環境の Web ACL に関連づいているリソースの洗い出しを行っていたところ、Application Load Balancer しか検出してくれないことが起きました。
例えば API Gateway や Cognito だけ関連づいている Web ACL を調べてもらうと、「関連づけがない」と言われるのです。
> WebACL hoge1228tokyo には以下のリソースが関連付けられています:
- **Application Load Balancer**: hoge1228alb
- ARN: arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/hoge1228alb/2e68f032f656b564
このWebACLは1つのALB(Application Load Balancer)に関連付けられています。
▸ Time: 18s
> Cognitoなども関連づいているはずですが...
「そんなはずはないだろう」と詰め始めると、API Gateway の API 側から逆引きして Web ACL が関連づいていることを調べてくれたのですが、非常に非効率な気がします。
Web ACL 側から調べれないはずだろうと思い、API の仕様とマネジメントコンソール表示時の挙動などを確認してみましたので紹介します。
Web ACL へリソースを関連付ける
Web ACL はリージョナルとグローバルで関連付けできるリソースが異なります。
リージョナルの場合は次のように Application Load Balancer、API Gateway、App Runner、AppSync、Cognito ユーザープール、Verified Access が関連付けできます。

グローバルの場合は CloudFront ディストリビューションと、Amplify です。

今回は次のようにリージョナル Web ACL に6つの適当なリソースを全部関連付けました。

AWS CLI で調べる
Web ACL に関連づいているリソースを取得するためのコマンドが用意されています。
WAF V2 API のListResourcesForWebACLです。
こちらを使ってみましょう。
% aws wafv2 list-resources-for-web-acl --web-acl-arn arn:aws:wafv2:ap-northeast-1:123456789012:regional/webacl/hoge1228tokyo/6eda3ec8-6dba-400d-a66b-7ebfc911808f
{
"ResourceArns": [
"arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/hoge1228alb/2e68f032f656b564"
]
}
たしかに、ロードバランサーしか取得されないですね。そうなのか...
ResourceType の明示的な指定が必要
こちらリファレンスをよく見てみると、resource-typeというオプションがあります。
こちらのパラメータオプションなのですが、仕様によると省略時はAPPLICATION_LOAD_BALANCERが使われるみたいです。ALLとかないのか。
個別に指定してみましょう。
% aws wafv2 list-resources-for-web-acl --web-acl-arn arn:aws:wafv2:ap-northeast-1:123456789012:regional/webacl/hoge1228tokyo/6eda3ec8-6dba-400d-a66b-7ebfc911808f --resource-type APPLICATION_LOAD_BALANCER
{
"ResourceArns": [
"arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/hoge1228alb/2e68f032f656b564"
]
}
% aws wafv2 list-resources-for-web-acl --web-acl-arn arn:aws:wafv2:ap-northeast-1:123456789012:regional/webacl/hoge1228tokyo/6eda3ec8-6dba-400d-a66b-7ebfc911808f --resource-type API_GATEWAY
{
"ResourceArns": [
"arn:aws:apigateway:ap-northeast-1::/restapis/4x8wz4v1q7/stages/hoge-stage"
]
}
% aws wafv2 list-resources-for-web-acl --web-acl-arn arn:aws:wafv2:ap-northeast-1:123456789012:regional/webacl/hoge1228tokyo/6eda3ec8-6dba-400d-a66b-7ebfc911808f --resource-type APPSYNC
{
"ResourceArns": [
"arn:aws:appsync:ap-northeast-1:123456789012:apis/6jxjomrzxbgrdp3mh7t7swhf4i"
]
}
% aws wafv2 list-resources-for-web-acl --web-acl-arn arn:aws:wafv2:ap-northeast-1:123456789012:regional/webacl/hoge1228tokyo/6eda3ec8-6dba-400d-a66b-7ebfc911808f --resource-type COGNITO_USER_POOL
{
"ResourceArns": [
"arn:aws:cognito-idp:ap-northeast-1:123456789012:userpool/ap-northeast-1_5sUsXC9GY"
]
}
% aws wafv2 list-resources-for-web-acl --web-acl-arn arn:aws:wafv2:ap-northeast-1:123456789012:regional/webacl/hoge1228tokyo/6eda3ec8-6dba-400d-a66b-7ebfc911808f --resource-type APP_RUNNER_SERVICE
{
"ResourceArns": [
"arn:aws:apprunner:ap-northeast-1:123456789012:service/hoge0107dotnetenv/3c6546695fbc48f8930ff4cf481db181"
]
}
% aws wafv2 list-resources-for-web-acl --web-acl-arn arn:aws:wafv2:ap-northeast-1:123456789012:regional/webacl/hoge1228tokyo/6eda3ec8-6dba-400d-a66b-7ebfc911808f --resource-type VERIFIED_ACCESS_INSTANCE
{
"ResourceArns": [
"arn:aws:ec2:ap-northeast-1:123456789012:verified-access-instance/vai-04555809d1dbd0769"
]
}
%
それぞれ関連リソースが取得出来ましたね。
Kiro CLI などを使う時もリソースタイプの指定を明示することで取得してくれました。
> WebACL hoge1228tokyo に関連付けられている全リソース:
APPLICATION_LOAD_BALANCER
- hoge1228alb (arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/hoge1228alb/2e68f032f656b564)
API_GATEWAY
- REST API 4x8wz4v1q7 のステージ hoge-stage
COGNITO_USER_POOL
- User Pool ap-northeast-1_5sUsXC9GY
APPSYNC
- GraphQL API 6jxjomrzxbgrdp3mh7t7swhf4i
APP_RUNNER_SERVICE
- Service hoge0107dotnetenv
VERIFIED_ACCESS_INSTANCE
- Instance vai-04555809d1dbd0769
AMPLIFY
- 東京リージョンではサポートされていません
合計6つのリソースがこのWebACLで保護されています。
▸ Time: 26s
マネジメントコンソールで表示した際の挙動
マネジメントコンソールだと一発でパッと表示してくれるので何かコマンドあるだろうと思っていたのですが、マネジメントコンソール表示後の CloudTrail ログを確認してみると次のように6回 API がコールされていますね。(上がマネコン、下が Kiro CLI による API 呼び出し履歴)

リソースタイプ何がサポートされているのかを把握しつつ、複数回 API を呼び出して異なるリソースタイプを指定しなきゃいけないみたいです。
さいごに
本日は Web ACL に関連づいているリソースの洗い出しの際に異なるリソースタイプをどのように取得できるのか調べてみました。
できれば一括で取得する API がほしかったのですが無さそうですね。リソースタイプを指定して何度か API を呼び出しする必要がありそうでした。







