Skip to main content

octorules-aws

AWS WAF v2 provider for octorules — manages AWS WAF Web ACL rules, Rule Groups, and IP Sets as YAML.

Installation

pip install octorules-aws

This installs octorules (core) and octorules-aws. The provider is auto-discovered — no class: needed in config.

Configuration

providers:
  aws:
    region: us-east-1
    waf_scope: REGIONAL
  rules:
    directory: ./rules

zones:
  my-web-acl:
    sources:
      - rules

Each zone name maps to an AWS WAF Web ACL name. The provider resolves Web ACL names to IDs at runtime.

Authentication

AWS credentials are resolved via the standard boto3 credential chain — no token is needed in the config file. Common options:

  • Environment variables: AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY
  • Shared credentials file: ~/.aws/credentials
  • IAM role (EC2, ECS, Lambda): automatic

Required IAM permissions:

  • wafv2:GetWebACL, wafv2:UpdateWebACL — for phase rule operations
  • wafv2:ListWebACLs — for zone ID resolution and zone discovery
  • wafv2:GetRuleGroup, wafv2:UpdateRuleGroup, wafv2:ListRuleGroups — for custom rulesets (Rule Groups)
  • wafv2:GetIPSet, wafv2:UpdateIPSet, wafv2:CreateIPSet, wafv2:DeleteIPSet, wafv2:ListIPSets — for lists (IP Sets)

Provider settings

All settings below go under the provider section (e.g. providers.aws).

Key Default Description
region AWS_DEFAULT_REGION or us-east-1 AWS region
waf_scope AWS_WAF_SCOPE or REGIONAL REGIONAL or CLOUDFRONT
max_retries 2 API retry count
timeout 30 API timeout in seconds
wcu_limit 1500 Web ACL WCU capacity for WA340 lint check. Override for accounts with custom limits (up to 5,000).

Safety thresholds are configured under safety: (framework-owned, not forwarded to the provider):

Key Default Description
safety.delete_threshold 30.0 Max % of rules that can be deleted
safety.update_threshold 30.0 Max % of rules that can be updated
safety.min_existing 3 Min rules before thresholds apply

Examples

The examples/ directory contains a working single-provider config.yaml plus rules/my-web-acl.yaml demonstrating every supported phase and key using the nested aws: format. Copy it as a starting point.

Zone files nest all AWS WAF sections under a single aws: block.

Supported features

Feature Status AWS concept
Phase rules (4 phases) Supported Web ACL rules
Custom rulesets Supported Rule Groups
Lists (IP) Supported IP Sets
Lists (regex) Supported Regex Pattern Sets
Web ACL settings Supported DefaultAction, ChallengeConfig, CaptchaConfig, TokenDomains, AssociationConfig, CustomResponseBodies
Page Shield Not supported —
Zone discovery (list_zones) Supported Lists Web ACLs
Account-level scopes Not supported —
Audit IP extraction (octorules audit) Supported IPSet reference resolution

Phase mapping

octorules phase AWS WAF concept
aws.waf_custom_rules Custom rules (IP match, geo match, byte match, etc.)
aws.waf_rate_rules Rate-based rules
aws.waf_managed_rules Managed rule group references
aws.waf_rule_group_rules Rule group references

All phases require action to be specified explicitly (no default action).

Rule-level metadata: All AWS WAF rules support the octorules: key for per-rule metadata — ignored: true to skip a rule during plan/sync, and included/excluded to restrict rules to specific providers. See octorules core docs for syntax and examples.

Custom rulesets (Rule Groups)

AWS WAF Rule Groups map to octorules custom rulesets. octorules manages the full lifecycle: create, update rules, and delete.

Managing an existing Rule Group

# rules/my-web-acl.yaml
aws:
  custom_rulesets:
    - id: abcd1234-5678-9012-3456-789012345678
      name: My Rule Group
      phase: aws_waf_custom
      rules:
        - ref: block-bad-ips
          Action:
            Block: {}
          Statement:
            IPSetReferenceStatement:
              ARN: arn:aws:wafv2:us-east-1:123456789012:regional/ipset/blocked/efgh5678
          VisibilityConfig:
            SampledRequestsEnabled: true
            CloudWatchMetricsEnabled: true
            MetricName: BlockBadIPs

Creating a new Rule Group

Omit the id field and add capacity to create a new Rule Group:

aws:
  custom_rulesets:
    - name: Block Bad Actors
      capacity: 100
      phase: aws_waf_custom
      rules:
        - ref: block-scanner
          Action:
            Block: {}
          Statement:
            ByteMatchStatement:
              SearchString: "BadBot"
              FieldToMatch:
                SingleHeader:
                  Name: user-agent
              PositionalConstraint: CONTAINS
              TextTransformations:
                - Priority: 0
                  Type: LOWERCASE
          VisibilityConfig:
            SampledRequestsEnabled: true
            CloudWatchMetricsEnabled: true
            MetricName: BlockScanner

capacity is an AWS WAF concept — an immutable budget (1-5000) that limits rule complexity within the Rule Group. It cannot be changed after creation. If you need more capacity, delete and recreate the Rule Group with a higher value.

How it works:

  • The name field is the identity key. Rule Groups are matched between YAML and AWS by name.
  • The presence of a custom_rulesets: key means ALL Rule Groups are managed — Rule Groups in AWS not in YAML are planned for deletion.
  • If the custom_rulesets: key is absent, Rule Groups are ignored entirely.
  • id is optional: present for existing Rule Groups, absent for new ones.
  • After creation, use octorules dump to export the assigned id back to YAML.

Lists (IP Sets & Regex Pattern Sets)

AWS WAF IP Sets and Regex Pattern Sets map to octorules lists. Add a lists section under aws::

# rules/my-web-acl.yaml
aws:
  lists:
    - name: blocked-ips
      kind: ip
      description: "Known bad IPs"
      items:
        - ip: "1.2.3.4/32"
        - ip: "10.0.0.0/8"

    - name: bad-ua-patterns
      kind: regex
      description: "Bad user-agent patterns"
      items:
        - pattern: "BadBot.*"
        - pattern: "EvilCrawler/\\d+"

IP lists (kind: ip) map to AWS WAF IP Sets. Regex lists (kind: regex) map to AWS WAF Regex Pattern Sets and are referenced via RegexPatternSetReferenceStatement.

Note: ASN, hostname, and redirect list kinds are not available for AWS WAF.

Linting

99 AWS-specific lint rules (WA prefix) covering structure, actions, statements, and cross-rule analysis:

Prefix Category Rules
WA001–WA003, WA006, WA010, WA020–WA024, WA154 Structure 11
WA025 Style 1
WA100–WA102 Priority 3
WA004–WA005, WA200–WA201, WA350–WA359 Action 14
WA400–WA402, WA500–WA501 Visibility 5
WA156–WA157, WA159–WA161, WA300–WA325, WA328, WA330–WA332, WA334–WA339, WA341–WA348 Statement 49
WA158, WA162–WA168, WA326–WA327, WA340, WA520, WA603 Cross-rule 13
WA600–WA602 Best practice 3
octorules lint --config config.yaml

Lint rules are registered automatically when octorules-aws is installed. See docs/lint.md for the full rule reference with examples.

Note: WA500 checks for duplicate MetricName within a single phase. WA501 checks across phases — AWS WAF requires MetricName to be unique across all rules in a Web ACL.

Known limitations

  • Web ACL creation/deletion: octorules-aws manages rules and Rule Groups within existing Web ACLs. Creating or deleting Web ACLs must be done via the AWS console, CLI, or Terraform.
  • Concurrent updates: Rule updates use AWS WAF optimistic locking (LockToken). Stale lock errors are retried automatically (up to 3 attempts with linear backoff). If the same Web ACL is updated by multiple writers targeting the same phase simultaneously, the last writer wins.
  • Rule Group capacity is immutable: AWS WAF sets Rule Group capacity at creation time. To change capacity, delete and recreate the Rule Group with the new value.

Development

git clone git@github.com:doctena-org/octorules-aws.git
cd octorules-aws
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pre-commit install

License

octorules-aws is licensed under the Apache License 2.0.

Metadata

Release files for octorules-aws 0.14.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for octorules-aws 0.14.0
File Size Uploaded Provenance
octorules_aws-0.14.0.tar.gz 97.2 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for octorules-aws 0.14.0
File Interpreter ABI Platform
octorules_aws-0.14.0-py3-none-any.whl Python 3 none any Details

Total release size: 152.2 kB

Release files / octorules_aws-0.14.0.tar.gz

Download URL octorules_aws-0.14.0.tar.gz
Size 97.2 kB
Tags Source
SHA-256 checksum
How to use checksums
a5f60df541228ed5956490d070d3a382f4d8848ce1d9cc1a410d1c54065bfe3b
BLAKE2b-256 checksum
How to use checksums
7a55badc100fe5075d0fdf641e0d837fb1d3b72e7e41e2859e17bcc5faacab94
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.

Transparency log

Release files / octorules_aws-0.14.0-py3-none-any.whl

Download URL octorules_aws-0.14.0-py3-none-any.whl
Size 54.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2a766c2eb2fa8cdb707e7430c9c5bbe1a1271ca6b757bc56730cec4d4f3ef8be
BLAKE2b-256 checksum
How to use checksums
b1532364aecd5fe97623c04bf2f86f58e39af210a5a07638a070e313417517b5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.

Transparency log

Security for octorules-aws 0.14.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for octorules_aws-0.14.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.14.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page