Route 53 Resolver
Supported Actions
| Action | Description |
|---|---|
ListFirewallDomainLists |
Lists all DNS Firewall domain lists, including the four AWS-managed lists computed per region. |
GetFirewallDomainList |
Returns a single DNS Firewall domain list by id, whether AWS-managed or custom. |
CreateFirewallDomainList |
Creates a custom DNS Firewall domain list with a random-suffix rslvr-fdl- id. |
DeleteFirewallDomainList |
Deletes a custom DNS Firewall domain list; AWS-managed lists cannot be deleted. |
CreateResolverEndpoint |
Creates an inbound (rslvr-in-) or outbound (rslvr-out-) resolver endpoint, returned immediately as OPERATIONAL. |
DeleteResolverEndpoint |
Deletes a resolver endpoint and returns its final description. |
GetResolverEndpoint |
Returns a resolver endpoint by id. |
ListResolverEndpoints |
Lists all resolver endpoints. |
UpdateResolverEndpoint |
Updates a resolver endpoint's Name and ResolverEndpointType; IpAddresses changes are not modelled. |
CreateResolverRule |
Creates a resolver rule, returned immediately as COMPLETE; ResolverEndpointId is not validated against an existing endpoint. |
DeleteResolverRule |
Deletes a resolver rule and returns its final description. |
GetResolverRule |
Returns a resolver rule by id. |
ListResolverRules |
Lists all resolver rules. |
UpdateResolverRule |
Updates a resolver rule's mutable configuration. |
AssociateResolverRule |
Associates a resolver rule with a VPC, returned immediately as COMPLETE. |
DisassociateResolverRule |
Removes the association between a resolver rule and a VPC. |
GetResolverRuleAssociation |
Returns a resolver rule association by id. |
ListResolverRuleAssociations |
Lists all resolver rule associations. |
Design notes
The four AWS-managed DNS Firewall domain lists (AWSManagedDomainsAggregateThreatList
and friends) are computed on every call from a fixed name list, with ids derived
deterministically from region+name (SHA-256 based) rather than stored — LZA's
Custom::ResolverManagedDomainList Lambda resolves a managed list's Id by Name and
needs it present and stable without any create call. This logic predates the rest of
this service and is untouched.
Everything else (custom firewall domain lists, resolver endpoints, resolver rules,
rule associations) is backed by real per-service storage, added this session. Ids use
the project's standard random-suffix convention (rslvr-fdl-..., rslvr-in-... /
rslvr-out-..., rslvr-rr-..., rslvr-rrassoc-...), distinct from the deterministic
managed-list ids. Resolver endpoint ids are direction-aware as in AWS: rslvr-in- for
INBOUND (and INBOUND_DELEGATION), rslvr-out- for OUTBOUND. Any other Direction
is rejected with InvalidParameterException.
Parameter rejections use the error code the operation actually models, which differs by
family: the resolver endpoint, rule and association operations model the singular
InvalidParameterException, while the DNS Firewall operations model ValidationException
and do not list InvalidParameterException at all.
CreateFirewallDomainList, CreateResolverEndpoint and CreateResolverRule are
idempotent on CreatorRequestId, as they are in real AWS: replaying a token returns the
resource it originally created instead of allocating a second one. The check runs after
the request's own validation, so a replayed token never excuses a malformed body. A
request without a CreatorRequestId opts out and always allocates a new resource.
Idempotency is scoped per account and per region, matching this regional service: the same
token replayed in another region creates that region's own resource rather than handing
back the first region's.
A token replayed with different parameters is a conflict, not a retry:
CreateResolverEndpoint and CreateResolverRule compare the retry against the stored
resource and raise ResourceExistsException, which both operations model.
CreateFirewallDomainList is the deliberate exception — it models no conflict error at
all, so a mismatched retry still returns the original list rather than an invented error
code. See issues/route53resolver-firewall-domain-list-retry-conflict.md.
For CreateResolverEndpoint the comparison covers the actual IpAddressRequests entries,
not just how many there are, so a retry that keeps the count but changes a subnet or
address is a conflict. Order is not significant. The modelled ResolverEndpoint shape has
IpAddressCount and no IP list, so the addresses are recorded in a side store rather than
on the resource and never reach the response. If that record is ever missing for a stored
endpoint, the retry is reported as a conflict rather than compared on count alone — with
nothing to compare against, sameness cannot be established, and a loud error is preferable
to a success that may not match the request.
Limitations
- All create/update operations complete synchronously. Real AWS transitions a
resolver endpoint through
CREATING, a resolver rule through its own provisioning states, before reaching a terminal status. This emulator returns the terminal state (OPERATIONALfor endpoints,COMPLETEfor rules and associations) immediately — matching the "validate-and-echo" convention used elsewhere in this codebase (seeServiceCatalogService.copyProduct,CS-021). UpdateResolverEndpointonly appliesNameandResolverEndpointType. Real AWS additionally allows updatingIpAddresses(adding/removing resolver IPs); that is not modelled.CreateResolverRule/UpdateResolverRuledo not validateResolverEndpointIdagainst an existing endpoint. Any non-blank string is accepted.- No VPC-scoping or region-scoping is enforced for custom resources. The four
stores go through
StorageFactory, so every key is prefixed with the calling credential's account id and custom resources are isolated per account: one account cannot read, update or delete another's endpoints, rules, associations or domain lists. Neither region nor VPC is part of the key, though, so a custom resource created in one region is visible from every other, andVPCIdon an association is stored but never used to filter. The AWS-managed domain lists are the deliberate exception: they are derived per region from the name list rather than stored, so they are region-scoped and visible to every caller, as they are in AWS.