cloudformation-validate-rego-engine 1.12.0

AWS CloudFormation Validate
Documentation

rego-engine

Validates CloudFormation templates using Rego policies evaluated by the Regorus interpreter. Implements the ValidationEngine trait. Custom builtins bridge Rego policies to the SemanticModel for deep template introspection that pure Rego cannot express.

Architecture

Rules are organized into Rego packages by category:

Package Eval Path Category
structure data.structure.violation Template structure
intrinsics data.intrinsics.violation Intrinsic functions
references data.references.violation Cross-resource refs
best_practices data.best_practices.violation Best practices
resources data.resources.violation Resource-specific

Rules come from four sources: handwritten Rego policies embedded by this crate's build script, generated shared data embedded by data-source, user-provided custom Rego policies, and Guard DSL files. Guard files are not translated to Rego: they are evaluated by the shared Guard evaluator in validation-engine, which every engine calls, so the same Guard rule yields the same findings in every engine.

Custom Builtins

These builtins are registered with the Regorus interpreter and called as bare functions in Rego policies - there is no namespace prefix. For example, a policy calls resolve(name, "Properties.BucketName"), not cfn.resolve(...).

Template Resolution

Builtin Signature Purpose
resolve (resource_id, path) → value Resolve a property value through intrinsic functions; a reference is a {"__ref": target} marker, never a bare string
resolve_all (resource_id, path) → [values] Resolve all scenario values for a property
resolve_scenarios (resource_id, path) → [{value, conditions}] Resolve all (value, condition_map) pairs
resolve_ref_target (resource_id, path) → {resourceType, condition, properties} Resolve the target of a reference
resolve_type (resource_id, path) → type_string Get the resolved value type
is_dynamic (resource_id, path) → bool Check if a property contains unresolvable content
is_from_parameter (resource_id, path) → bool Check if a property originates from a parameter
is_from_intrinsic (resource_id, path) → bool Check if a property originates from an intrinsic
follow_ref (resource_id, path) → target_id Follow a Ref/GetAtt to its target resource
flatten_list (resource_id, path) → [{value, index}] Flatten nested arrays

Resource Queries

Builtin Signature Purpose
get_resource (resource_id) → resource_object Get full resolved resource data
has_property (resource_id, path) → bool Check if a property is authored, even when its value is only known at deployment
resources_of_type (type_name) → [resource_ids] Get all logical IDs of a resource type
has_transform (transform_name) → bool Check if a transform is declared

Graph Queries

Builtin Signature Purpose
ref_targets (resource_id) → [target_ids] Outgoing reference targets
ref_sources (resource_id) → [source_ids] Incoming reference sources
depends_on (resource_a, resource_b) → bool Transitive dependency check
edges_from (resource_id) → [edge_objects] Detailed outgoing edges
edges_to (resource_id) → [edge_objects] Detailed incoming edges
pipeline_artifacts (resource_id) → {issues: [{message}]} Extract CodePipeline artifact relationships

Condition Analysis

Builtin Signature Purpose
conditions_compatible (resource_a, resource_b) → bool Can both resources' conditions be true simultaneously?
condition_implies (cond_a, cond_b) → bool Does cond_a=true force cond_b=true?
conjunction_implies (guard1, guard2, target) → bool Does the conjunction of two guards imply target?
resource_condition (resource_id) → condition_name Get the Condition on a resource
is_satisfiable (assumptions) → bool Is a set of condition assumptions satisfiable?
unreachable_if_branches (resource_id) → [{resourceId, path, message}] Find unreachable Fn::If branches in a resource

Parameter / Mapping

Builtin Signature Purpose
param_allowed_values (param_name) → [values] Get AllowedValues for a parameter
param_type (param_name) → type_string Get the declared Type of a parameter
mapping_value (map, key1, key2) → value Look up a value in Mappings

Schema Introspection

Builtin Signature Purpose
schema_properties (resource_type) → [property_names] List schema-defined properties
schema_required (resource_type) → [required_names] List required properties
schema_type (resource_type, property) → type_string Primary schema type (first declared when several)
schema_enum (resource_type, property) → [values] Allowed values (incl. case-insensitive enums)
attribute_type (resource_type, property) → type_string Get schema attribute type
getatt_return_type (resource_type, attribute) → type_string Get GetAtt return type
schema_string_length (resource_type, property) → {min, max} Get string length constraints
schema_requires_unique_items (resource_type, property) → bool True when a property's schema sets uniqueItems

Diagnostic Construction

Builtin Signature Purpose
make_diag (rule_id, severity, resource_id, message) → diag Create a basic diagnostic
make_diag_at (rule_id, severity, resource_id, prop_path, message) → diag Diagnostic with property path
make_diag_full (rule_id, severity, resource_id, prop_path, message, fix, doc_url) → diag Full diagnostic with fix and URL
make_diag_related (rule_id, severity, resource_id, prop_path, message, related_locations) → diag Diagnostic with related locations
make_diag_conditional (rule_id, severity, resource_id, prop_path, message, conditions) → diag Diagnostic with condition context

Utilities

Builtin Signature Purpose
arn_matches (arn, pattern) → bool Match an ARN against a pattern with wildcards
ip_overlaps (cidr_a, cidr_b) → bool Check if two CIDR blocks overlap
ip_subnet_of (subnet, supernet) → bool Check if a CIDR is a subnet of another
is_valid_cidr_strict (cidr) → bool Validate CIDR notation
ensure_list (value) → [value] Wrap scalar in array, pass arrays through
input_region () → region_string Get the configured AWS region
region_flat_invalid (region_map, value) → message Diagnostic message when a flat instance/node-type value is invalid for the effective scope (configured region, or union of all regions when unset), else undefined
region_conditional_invalid (region_map, target_prop, normalize_engine_case, value, props) → message Diagnostic message when a conditional RDS instance-class value is invalid for the effective scope, else undefined
coerce_to_number (value) → number CloudFormation-style number coercion
coerce_to_string (value) → string CloudFormation-style string coercion
cfn_type_compatible (value, expected_type) → bool Check CFN type compatibility with coercion
estimated_string_length_bounds (resource_id, path) → {shortest, longest} Shortest and longest resolved string length; undefined when the length cannot be pinned for every possibility