Class WebAclRule


  • public class WebAclRule
    extends com.pulumi.resources.CustomResource
    Manages an individual rule within a WAFv2 Web ACL. This resource creates proper Terraform dependencies for safe deletion of referenced resources like IP sets, solving the `WAFAssociatedItemException` error that occurs when deleting IP sets that are still referenced by Web ACL rules. > **NOTE:** When using this resource, you must add `lifecycle { ignoreChanges = [rule] }` to your `aws.wafv2.WebAcl` resource to prevent conflicts. See the `aws.wafv2.WebAcl` documentation for a full description of the limitations of inline rules that this resource addresses. ## Example Usage ### Migrating from Inline Rules This resource supports a "create-or-adopt" pattern that allows seamless migration from inline Web ACL rules to separate `aws.wafv2.WebAclRule` resources without infrastructure changes. When you create an `aws.wafv2.WebAclRule` resource with the same name as an existing inline rule in the Web ACL, the resource will automatically adopt the existing rule instead of creating a duplicate. This enables zero-downtime migration from inline rules to separate resources. Starting with inline rules, update your configuration to use separate rule resources and apply:
     
     package generated_program;
     
     import com.pulumi.Context;
     import com.pulumi.Pulumi;
     import com.pulumi.core.Output;
     import com.pulumi.aws.wafv2.WebAcl;
     import com.pulumi.aws.wafv2.WebAclArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclDefaultActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclDefaultActionAllowArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclVisibilityConfigArgs;
     import com.pulumi.aws.wafv2.WebAclRule;
     import com.pulumi.aws.wafv2.WebAclRuleArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionBlockArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementGeoMatchStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleVisibilityConfigArgs;
     import com.pulumi.resources.CustomResourceOptions;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Map;
     import java.io.File;
     import java.nio.file.Files;
     import java.nio.file.Paths;
     
     public class App {
         public static void main(String[] args) {
             Pulumi.run(App::stack);
         }
     
         public static void stack(Context ctx) {
             var example = new WebAcl("example", WebAclArgs.builder()
                 .defaultAction(WebAclDefaultActionArgs.builder()
                     .allow(WebAclDefaultActionAllowArgs.builder()
                         .build())
                     .build())
                 .visibilityConfig(WebAclVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(false)
                     .metricName("example")
                     .sampledRequestsEnabled(false)
                     .build())
                 .name("example")
                 .scope("REGIONAL")
                 .build(), CustomResourceOptions.builder()
                     .ignoreChanges("rules")
                     .build());
     
             // Separate rule resource with identical configuration
             var blockCountries = new WebAclRule("blockCountries", WebAclRuleArgs.builder()
                 .action(WebAclRuleActionArgs.builder()
                     .block(WebAclRuleActionBlockArgs.builder()
                         .build())
                     .build())
                 .statement(WebAclRuleStatementArgs.builder()
                     .geoMatchStatement(WebAclRuleStatementGeoMatchStatementArgs.builder()
                         .countryCodes(                    
                             "CN",
                             "RU")
                         .build())
                     .build())
                 .visibilityConfig(WebAclRuleVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(false)
                     .metricName("block-countries")
                     .sampledRequestsEnabled(false)
                     .build())
                 .name("block-countries")
                 .priority(1)
                 .webAclArn(example.arn())
                 .build());
     
         }
     }
     
     
    Apply the configuration: The `aws.wafv2.WebAclRule` resource will adopt the existing inline rule without making any changes to the actual Web ACL infrastructure. The rule continues to function identically, but is now managed as a separate Terraform resource. - The rule name in the `aws.wafv2.WebAclRule` resource must exactly match the existing inline rule name - Add `lifecycle { ignoreChanges = [rule] }` to your Web ACL resource to prevent conflicts - The create-or-adopt behavior only applies when a rule with the same name already exists in the Web ACL ### Basic Geo Match Rule
     
     package generated_program;
     
     import com.pulumi.Context;
     import com.pulumi.Pulumi;
     import com.pulumi.core.Output;
     import com.pulumi.aws.wafv2.WebAcl;
     import com.pulumi.aws.wafv2.WebAclArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclDefaultActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclDefaultActionAllowArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclVisibilityConfigArgs;
     import com.pulumi.aws.wafv2.WebAclRule;
     import com.pulumi.aws.wafv2.WebAclRuleArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionBlockArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementGeoMatchStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleVisibilityConfigArgs;
     import com.pulumi.resources.CustomResourceOptions;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Map;
     import java.io.File;
     import java.nio.file.Files;
     import java.nio.file.Paths;
     
     public class App {
         public static void main(String[] args) {
             Pulumi.run(App::stack);
         }
     
         public static void stack(Context ctx) {
             var example = new WebAcl("example", WebAclArgs.builder()
                 .defaultAction(WebAclDefaultActionArgs.builder()
                     .allow(WebAclDefaultActionAllowArgs.builder()
                         .build())
                     .build())
                 .visibilityConfig(WebAclVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(false)
                     .metricName("example")
                     .sampledRequestsEnabled(false)
                     .build())
                 .name("example")
                 .scope("REGIONAL")
                 .build(), CustomResourceOptions.builder()
                     .ignoreChanges("rules")
                     .build());
     
             var blockCountries = new WebAclRule("blockCountries", WebAclRuleArgs.builder()
                 .action(WebAclRuleActionArgs.builder()
                     .block(WebAclRuleActionBlockArgs.builder()
                         .build())
                     .build())
                 .statement(WebAclRuleStatementArgs.builder()
                     .geoMatchStatement(WebAclRuleStatementGeoMatchStatementArgs.builder()
                         .countryCodes(                    
                             "CN",
                             "RU")
                         .build())
                     .build())
                 .visibilityConfig(WebAclRuleVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(false)
                     .metricName("block-countries")
                     .sampledRequestsEnabled(false)
                     .build())
                 .name("block-countries")
                 .priority(1)
                 .webAclArn(example.arn())
                 .build());
     
         }
     }
     
     
    ### IP Set Reference (Solves Deletion Ordering) This example demonstrates the primary use case: referencing an IP set in a way that allows safe deletion.
     
     package generated_program;
     
     import com.pulumi.Context;
     import com.pulumi.Pulumi;
     import com.pulumi.core.Output;
     import com.pulumi.aws.wafv2.IpSet;
     import com.pulumi.aws.wafv2.IpSetArgs;
     import com.pulumi.aws.wafv2.WebAcl;
     import com.pulumi.aws.wafv2.WebAclArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclDefaultActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclDefaultActionAllowArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclVisibilityConfigArgs;
     import com.pulumi.aws.wafv2.WebAclRule;
     import com.pulumi.aws.wafv2.WebAclRuleArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionBlockArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementIpSetReferenceStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleVisibilityConfigArgs;
     import com.pulumi.resources.CustomResourceOptions;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Map;
     import java.io.File;
     import java.nio.file.Files;
     import java.nio.file.Paths;
     
     public class App {
         public static void main(String[] args) {
             Pulumi.run(App::stack);
         }
     
         public static void stack(Context ctx) {
             var blockedIps = new IpSet("blockedIps", IpSetArgs.builder()
                 .name("blocked-ips")
                 .scope("REGIONAL")
                 .ipAddressVersion("IPV4")
                 .addresses(            
                     "1.2.3.4/32",
                     "5.6.7.8/32")
                 .build());
     
             var example = new WebAcl("example", WebAclArgs.builder()
                 .defaultAction(WebAclDefaultActionArgs.builder()
                     .allow(WebAclDefaultActionAllowArgs.builder()
                         .build())
                     .build())
                 .visibilityConfig(WebAclVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(true)
                     .metricName("example")
                     .sampledRequestsEnabled(true)
                     .build())
                 .name("example")
                 .scope("REGIONAL")
                 .build(), CustomResourceOptions.builder()
                     .ignoreChanges("rules")
                     .build());
     
             var blockIps = new WebAclRule("blockIps", WebAclRuleArgs.builder()
                 .action(WebAclRuleActionArgs.builder()
                     .block(WebAclRuleActionBlockArgs.builder()
                         .build())
                     .build())
                 .statement(WebAclRuleStatementArgs.builder()
                     .ipSetReferenceStatement(WebAclRuleStatementIpSetReferenceStatementArgs.builder()
                         .arn(blockedIps.arn())
                         .build())
                     .build())
                 .visibilityConfig(WebAclRuleVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(true)
                     .metricName("block-bad-ips")
                     .sampledRequestsEnabled(true)
                     .build())
                 .name("block-bad-ips")
                 .priority(1)
                 .webAclArn(example.arn())
                 .build());
     
         }
     }
     
     
    ### Rate-Based Rule
     
     package generated_program;
     
     import com.pulumi.Context;
     import com.pulumi.Pulumi;
     import com.pulumi.core.Output;
     import com.pulumi.aws.wafv2.WebAclRule;
     import com.pulumi.aws.wafv2.WebAclRuleArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionBlockArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementRateBasedStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleVisibilityConfigArgs;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Map;
     import java.io.File;
     import java.nio.file.Files;
     import java.nio.file.Paths;
     
     public class App {
         public static void main(String[] args) {
             Pulumi.run(App::stack);
         }
     
         public static void stack(Context ctx) {
             var rateLimit = new WebAclRule("rateLimit", WebAclRuleArgs.builder()
                 .action(WebAclRuleActionArgs.builder()
                     .block(WebAclRuleActionBlockArgs.builder()
                         .build())
                     .build())
                 .statement(WebAclRuleStatementArgs.builder()
                     .rateBasedStatement(WebAclRuleStatementRateBasedStatementArgs.builder()
                         .limit(2000)
                         .aggregateKeyType("IP")
                         .build())
                     .build())
                 .visibilityConfig(WebAclRuleVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(true)
                     .metricName("rate-limit")
                     .sampledRequestsEnabled(true)
                     .build())
                 .name("rate-limit")
                 .priority(2)
                 .webAclArn(example.arn())
                 .build());
     
         }
     }
     
     
    ### Managed Rule Group with Override Action
     
     package generated_program;
     
     import com.pulumi.Context;
     import com.pulumi.Pulumi;
     import com.pulumi.core.Output;
     import com.pulumi.aws.wafv2.WebAclRule;
     import com.pulumi.aws.wafv2.WebAclRuleArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleOverrideActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleOverrideActionNoneArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementManagedRuleGroupStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleVisibilityConfigArgs;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Map;
     import java.io.File;
     import java.nio.file.Files;
     import java.nio.file.Paths;
     
     public class App {
         public static void main(String[] args) {
             Pulumi.run(App::stack);
         }
     
         public static void stack(Context ctx) {
             var awsManagedRules = new WebAclRule("awsManagedRules", WebAclRuleArgs.builder()
                 .overrideAction(WebAclRuleOverrideActionArgs.builder()
                     .none(WebAclRuleOverrideActionNoneArgs.builder()
                         .build())
                     .build())
                 .statement(WebAclRuleStatementArgs.builder()
                     .managedRuleGroupStatement(WebAclRuleStatementManagedRuleGroupStatementArgs.builder()
                         .name("AWSManagedRulesCommonRuleSet")
                         .vendorName("AWS")
                         .build())
                     .build())
                 .visibilityConfig(WebAclRuleVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(true)
                     .metricName("aws-managed-rules")
                     .sampledRequestsEnabled(true)
                     .build())
                 .name("aws-managed-rules")
                 .priority(3)
                 .webAclArn(example.arn())
                 .build());
     
         }
     }
     
     
    ### Custom Request Handling
     
     package generated_program;
     
     import com.pulumi.Context;
     import com.pulumi.Pulumi;
     import com.pulumi.core.Output;
     import com.pulumi.aws.wafv2.WebAclRule;
     import com.pulumi.aws.wafv2.WebAclRuleArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionCaptchaArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionCaptchaCustomRequestHandlingArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionCaptchaCustomRequestHandlingInsertHeaderArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementGeoMatchStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleVisibilityConfigArgs;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Map;
     import java.io.File;
     import java.nio.file.Files;
     import java.nio.file.Paths;
     
     public class App {
         public static void main(String[] args) {
             Pulumi.run(App::stack);
         }
     
         public static void stack(Context ctx) {
             var captchaWithHeaders = new WebAclRule("captchaWithHeaders", WebAclRuleArgs.builder()
                 .action(WebAclRuleActionArgs.builder()
                     .captcha(WebAclRuleActionCaptchaArgs.builder()
                         .customRequestHandling(WebAclRuleActionCaptchaCustomRequestHandlingArgs.builder()
                             .insertHeaders(WebAclRuleActionCaptchaCustomRequestHandlingInsertHeaderArgs.builder()
                                 .name("x-captcha-rule")
                                 .value("triggered")
                                 .build())
                             .build())
                         .build())
                     .build())
                 .statement(WebAclRuleStatementArgs.builder()
                     .geoMatchStatement(WebAclRuleStatementGeoMatchStatementArgs.builder()
                         .countryCodes("US")
                         .build())
                     .build())
                 .visibilityConfig(WebAclRuleVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(true)
                     .metricName("captcha-with-headers")
                     .sampledRequestsEnabled(true)
                     .build())
                 .name("captcha-with-headers")
                 .priority(4)
                 .webAclArn(example.arn())
                 .build());
     
         }
     }
     
     
    ### IP Set Reference
     
     package generated_program;
     
     import com.pulumi.Context;
     import com.pulumi.Pulumi;
     import com.pulumi.core.Output;
     import com.pulumi.aws.wafv2.WebAclRule;
     import com.pulumi.aws.wafv2.WebAclRuleArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionBlockArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementIpSetReferenceStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleVisibilityConfigArgs;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Map;
     import java.io.File;
     import java.nio.file.Files;
     import java.nio.file.Paths;
     
     public class App {
         public static void main(String[] args) {
             Pulumi.run(App::stack);
         }
     
         public static void stack(Context ctx) {
             var blockedIps = new WebAclRule("blockedIps", WebAclRuleArgs.builder()
                 .action(WebAclRuleActionArgs.builder()
                     .block(WebAclRuleActionBlockArgs.builder()
                         .build())
                     .build())
                 .statement(WebAclRuleStatementArgs.builder()
                     .ipSetReferenceStatement(WebAclRuleStatementIpSetReferenceStatementArgs.builder()
                         .arn(blockedIpsAwsWafv2IpSet.arn())
                         .build())
                     .build())
                 .visibilityConfig(WebAclRuleVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(true)
                     .metricName("block-bad-ips")
                     .sampledRequestsEnabled(true)
                     .build())
                 .name("blocked-ips")
                 .priority(1)
                 .webAclArn(example.arn())
                 .build());
     
         }
     }
     
     
    With this configuration, when you remove both the `aws.wafv2.WebAclRule` and `aws.wafv2.IpSet` resources, Terraform will: 1. Delete the rule first (removing the reference from the Web ACL) 2. Delete the IP set second (now safe because it's no longer referenced) This prevents the `WAFAssociatedItemException` error. ### Logical AND Statement Block requests that match multiple conditions (e.g., from a specific country AND containing a specific string):
     
     package generated_program;
     
     import com.pulumi.Context;
     import com.pulumi.Pulumi;
     import com.pulumi.core.Output;
     import com.pulumi.aws.wafv2.WebAclRule;
     import com.pulumi.aws.wafv2.WebAclRuleArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionBlockArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementAndStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementGeoMatchStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementByteMatchStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementByteMatchStatementFieldToMatchArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementByteMatchStatementFieldToMatchUriPathArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementByteMatchStatementTextTransformationArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleVisibilityConfigArgs;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Map;
     import java.io.File;
     import java.nio.file.Files;
     import java.nio.file.Paths;
     
     public class App {
         public static void main(String[] args) {
             Pulumi.run(App::stack);
         }
     
         public static void stack(Context ctx) {
             var blockSuspicious = new WebAclRule("blockSuspicious", WebAclRuleArgs.builder()
                 .action(WebAclRuleActionArgs.builder()
                     .block(WebAclRuleActionBlockArgs.builder()
                         .build())
                     .build())
                 .statement(WebAclRuleStatementArgs.builder()
                     .andStatement(Map.of("statements", Arrays.asList(                
                         WebAclRuleStatementArgs.builder()
                             .geoMatchStatement(WebAclRuleStatementGeoMatchStatementArgs.builder()
                                 .countryCodes("CN")
                                 .build())
                             .build(),
                         WebAclRuleStatementArgs.builder()
                             .byteMatchStatement(WebAclRuleStatementByteMatchStatementArgs.builder()
                                 .fieldToMatch(WebAclRuleStatementByteMatchStatementFieldToMatchArgs.builder()
                                     .uriPath(WebAclRuleStatementByteMatchStatementFieldToMatchUriPathArgs.builder()
                                         .build())
                                     .build())
                                 .textTransformations(WebAclRuleStatementByteMatchStatementTextTransformationArgs.builder()
                                     .priority(0)
                                     .type("LOWERCASE")
                                     .build())
                                 .searchString("admin")
                                 .positionalConstraint("CONTAINS")
                                 .build())
                             .build())))
                     .build())
                 .visibilityConfig(WebAclRuleVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(true)
                     .metricName("block-suspicious")
                     .sampledRequestsEnabled(true)
                     .build())
                 .name("block-suspicious")
                 .priority(1)
                 .webAclArn(example.arn())
                 .build());
     
         }
     }
     
     
    ### Logical OR Statement Block requests that match any of multiple conditions:
     
     package generated_program;
     
     import com.pulumi.Context;
     import com.pulumi.Pulumi;
     import com.pulumi.core.Output;
     import com.pulumi.aws.wafv2.WebAclRule;
     import com.pulumi.aws.wafv2.WebAclRuleArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionBlockArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementOrStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementGeoMatchStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleVisibilityConfigArgs;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Map;
     import java.io.File;
     import java.nio.file.Files;
     import java.nio.file.Paths;
     
     public class App {
         public static void main(String[] args) {
             Pulumi.run(App::stack);
         }
     
         public static void stack(Context ctx) {
             var blockCountries = new WebAclRule("blockCountries", WebAclRuleArgs.builder()
                 .action(WebAclRuleActionArgs.builder()
                     .block(WebAclRuleActionBlockArgs.builder()
                         .build())
                     .build())
                 .statement(WebAclRuleStatementArgs.builder()
                     .orStatement(Map.of("statements", Arrays.asList(                
                         WebAclRuleStatementArgs.builder()
                             .geoMatchStatement(WebAclRuleStatementGeoMatchStatementArgs.builder()
                                 .countryCodes("CN")
                                 .build())
                             .build(),
                         WebAclRuleStatementArgs.builder()
                             .geoMatchStatement(WebAclRuleStatementGeoMatchStatementArgs.builder()
                                 .countryCodes("RU")
                                 .build())
                             .build())))
                     .build())
                 .visibilityConfig(WebAclRuleVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(true)
                     .metricName("block-countries")
                     .sampledRequestsEnabled(true)
                     .build())
                 .name("block-countries")
                 .priority(2)
                 .webAclArn(example.arn())
                 .build());
     
         }
     }
     
     
    ### Logical NOT Statement Allow requests only from specific countries by negating a geo match:
     
     package generated_program;
     
     import com.pulumi.Context;
     import com.pulumi.Pulumi;
     import com.pulumi.core.Output;
     import com.pulumi.aws.wafv2.WebAclRule;
     import com.pulumi.aws.wafv2.WebAclRuleArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleActionBlockArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementNotStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleStatementGeoMatchStatementArgs;
     import com.pulumi.aws.wafv2.inputs.WebAclRuleVisibilityConfigArgs;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Map;
     import java.io.File;
     import java.nio.file.Files;
     import java.nio.file.Paths;
     
     public class App {
         public static void main(String[] args) {
             Pulumi.run(App::stack);
         }
     
         public static void stack(Context ctx) {
             var allowOnlyUs = new WebAclRule("allowOnlyUs", WebAclRuleArgs.builder()
                 .action(WebAclRuleActionArgs.builder()
                     .block(WebAclRuleActionBlockArgs.builder()
                         .build())
                     .build())
                 .statement(WebAclRuleStatementArgs.builder()
                     .notStatement(Map.of("statement", WebAclRuleStatementArgs.builder()
                         .geoMatchStatement(WebAclRuleStatementGeoMatchStatementArgs.builder()
                             .countryCodes(                        
                                 "US",
                                 "CA")
                             .build())
                         .build()))
                     .build())
                 .visibilityConfig(WebAclRuleVisibilityConfigArgs.builder()
                     .cloudwatchMetricsEnabled(true)
                     .metricName("allow-only-us")
                     .sampledRequestsEnabled(true)
                     .build())
                 .name("allow-only-us")
                 .priority(3)
                 .webAclArn(example.arn())
                 .build());
     
         }
     }
     
     
    ## Import ### Identity Schema #### Required * `name` (String) Rule name, unique within the Web ACL. * `webAclArn` (String) ARN of the Web ACL. #### Optional * `accountId` (String) Account ID where this resource is managed. * `region` (String) Region where this resource is managed. Using `pulumi import`, import WAFv2 Web ACL Rules using the `webAclArn` and `name` separated by a comma (`,`). For example: ```sh $ pulumi import aws:wafv2/webAclRule:WebAclRule example arn:aws:wafv2:us-east-1:123456789012:regional/webacl/example/abc123def456,my-rule ```
    • Nested Class Summary

      • Nested classes/interfaces inherited from class com.pulumi.resources.CustomResource

        com.pulumi.resources.CustomResource.CustomResourceInternal
      • Nested classes/interfaces inherited from class com.pulumi.resources.Resource

        com.pulumi.resources.Resource.LazyField<T extends java.lang.Object>, com.pulumi.resources.Resource.LazyFields, com.pulumi.resources.Resource.ResourceInternal
    • Field Summary

      • Fields inherited from class com.pulumi.resources.Resource

        childResources, remote
    • Constructor Detail

      • WebAclRule

        public WebAclRule​(java.lang.String name)
        Parameters:
        name - The _unique_ name of the resulting resource.
      • WebAclRule

        public WebAclRule​(java.lang.String name,
                          WebAclRuleArgs args)
        Parameters:
        name - The _unique_ name of the resulting resource.
        args - The arguments to use to populate this resource's properties.
      • WebAclRule

        public WebAclRule​(java.lang.String name,
                          WebAclRuleArgs args,
                          @Nullable
                          com.pulumi.resources.CustomResourceOptions options)
        Parameters:
        name - The _unique_ name of the resulting resource.
        args - The arguments to use to populate this resource's properties.
        options - A bag of options that control this resource's behavior.
    • Method Detail

      • action

        public com.pulumi.core.Output<java.util.Optional<WebAclRuleAction>> action()
        Returns:
        Action to take when the rule matches. See Action below. Conflicts with `overrideAction`.
      • captchaConfig

        public com.pulumi.core.Output<java.util.Optional<WebAclRuleCaptchaConfig>> captchaConfig()
        Returns:
        CAPTCHA configuration that overrides the web ACL level setting. See Captcha Config below.
      • challengeConfig

        public com.pulumi.core.Output<java.util.Optional<WebAclRuleChallengeConfig>> challengeConfig()
        Returns:
        Challenge configuration that overrides the web ACL level setting. See Challenge Config below.
      • name

        public com.pulumi.core.Output<java.lang.String> name()
        Returns:
        Name of the rule. Must be unique within the Web ACL.
      • overrideAction

        public com.pulumi.core.Output<java.util.Optional<WebAclRuleOverrideAction>> overrideAction()
        Returns:
        Override action for managed rule groups. See Override Action below. Conflicts with `action`.
      • priority

        public com.pulumi.core.Output<java.lang.Integer> priority()
        Returns:
        Rule priority. Rules with lower priority are evaluated first.
      • region

        public com.pulumi.core.Output<java.lang.String> region()
        Returns:
        Region where this resource will be [managed](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints). Defaults to the Region set in the provider configuration.
      • ruleLabels

        public com.pulumi.core.Output<java.util.Optional<java.util.List<WebAclRuleRuleLabel>>> ruleLabels()
        Returns:
        Labels to apply to matching web requests. See Rule Label below.
      • statement

        public com.pulumi.core.Output<java.util.Optional<WebAclRuleStatement>> statement()
        Returns:
        Rule statement. See Statement below.
      • timeouts

        public com.pulumi.core.Output<java.util.Optional<WebAclRuleTimeouts>> timeouts()
      • visibilityConfig

        public com.pulumi.core.Output<java.util.Optional<WebAclRuleVisibilityConfig>> visibilityConfig()
        Returns:
        CloudWatch metrics configuration. See Visibility Config below.
      • webAclArn

        public com.pulumi.core.Output<java.lang.String> webAclArn()
        Returns:
        ARN of the Web ACL to add the rule to. The following arguments are optional:
      • get

        public static WebAclRule get​(java.lang.String name,
                                     com.pulumi.core.Output<java.lang.String> id,
                                     @Nullable
                                     WebAclRuleState state,
                                     @Nullable
                                     com.pulumi.resources.CustomResourceOptions options)
        Get an existing Host resource's state with the given name, ID, and optional extra properties used to qualify the lookup.
        Parameters:
        name - The _unique_ name of the resulting resource.
        id - The _unique_ provider ID of the resource to lookup.
        state -
        options - Optional settings to control the behavior of the CustomResource.