创建AWS WAFv2 RuleGroup遇WAFInvalidParameterException错误求助
问题分析与解决
错误根源
报错信息明确指出:OR statement with only one nested statement,AWS WAF的OR语句要求至少包含2个及以上的子语句,你当前仅在or_statement里放了一个IP集引用,不符合规则,这才是报错的核心原因,和capacity参数无关。
同时你的规则逻辑也与需求相悖:当前配置是匹配白名单IP时执行block动作,这和"仅允许列表内IP请求"的需求完全相反。
修正方案
要实现"仅允许白名单IP访问",正确逻辑是:当请求IP不在白名单IP集中时,拦截请求。需要将or_statement替换为not_statement,具体修正后的代码如下:
resource "aws_wafv2_ip_set" "ip_whitelist" { name = "${var.waf_type}-${var.team_name}-${var.environment}-ipset" scope = "CLOUDFRONT" ip_address_version = "IPV4" addresses = var.micro_frontend_ip_address_whitelist } resource "aws_wafv2_rule_group" "ip_whitelist" { name = "${var.waf_type}-${var.team_name}-${var.environment}-waf-rule-group" description = "This rule group contains whitelist rules for the micro-frontends." scope = "CLOUDFRONT" capacity = 1 # 单个IP集规则的容量需求足够,无需调整 rule { name = "${var.waf_type}-${var.team_name}-${var.environment}-whitelist-rule" priority = 0 action { block {} } statement { # 使用NOT语句反转匹配逻辑:拦截不在白名单内的请求 not_statement { statement { ip_set_reference_statement { arn = aws_wafv2_ip_set.ip_whitelist.arn } } } } visibility_config { cloudwatch_metrics_enabled = true metric_name = "${var.waf_type}-${var.team_name}-${var.environment}-waf-rule-group" sampled_requests_enabled = false } } visibility_config { cloudwatch_metrics_enabled = true metric_name = "${var.waf_type}-${var.team_name}-${var.environment}-waf-rule-group" sampled_requests_enabled = false } }
关键说明
not_statement用于反转嵌套语句的匹配结果,正好满足"拦截非白名单IP"的需求- AWS WAF的
OR语句强制要求至少2个子语句,单条件场景下不能使用 capacity = 1对于单个IP集引用规则完全足够,无需调整为500
内容的提问来源于stack exchange,提问作者sd-gallowaystorm
相关产品推荐
相关产品推荐

