Subchapter 91.10
references/setting-up-route53-global-resolver.mdMarkdown26 KBView on GitHub
Domain expertise for setting up a Route 53 Global Resolver instance: an anycast DNS endpoint that on-premises and remote clients use to resolve both public domains and Route 53 private hosted zones, without per-location DNS infrastructure. Covers the resource hierarchy and ordering, the multi-Region requirement, the per-DNS-view authentication choice, optional DNS firewall, and private hosted zone access.
Does not cover integration with resolver endpoints for hybrid networks (a separate skill) or hosted zone and record management.
All Global Resolver API calls are made in us-east-2 regardless of which Regions the resolver
itself is deployed to. The control plane runs in US East (Ohio); calls without --region us-east-2
fail with a confusing endpoint or authorization error.
Execute commands using the AWS MCP server when connected (sandboxed execution, audit logging, observability). Fall back to the AWS CLI otherwise.
To build a Global Resolver instance, follow the procedure exactly. See the Procedure section below.
The procedure covers:
Global Resolver resources are nested. Create them outside-in:
Global Resolver
+-- DNS View
| +-- Access Source (IP-based access; one CIDR + protocol per source)
| +-- Access Token (token-based access; DoT/DoH only, not Do53)
| +-- Firewall Rule (priority-ordered on this view; references a domain list
| below, or uses an advanced threat detector)
| +-- Hosted Zone Association (private hosted zone reachable through this view)
+-- Firewall Domain List (custom list, scoped to the resolver, referenced by rules
on any DNS view; AWS-managed lists are pre-existing)Firewall domain lists live at the Global Resolver level, not on a DNS view. One custom list can be referenced from rules on multiple views. AWS-managed lists are pre-existing and do not need to be created; reference them by ID directly from a rule. Two types are available:
THREAT: Malware, Botnet command-and-control, Spam, Phishing, Amazon GuardDuty threat
intelligenceCONTENT: content categories such as social media and gamblingConstraints:
create-global-resolver returns two anycast IPv4 addresses (and two IPv6 addresses if
--ip-address-type DUAL_STACK was set). You MUST configure clients with both, not just onestatus: CREATING. You MUST poll the corresponding get-* call
until status is OPERATIONAL before using the resource downstream| Choice | Use when |
|---|---|
| 2-3 Regions close to the client population | Default. Survives a Region-level outage with the smallest footprint |
| Broader Region set (4+) | Globally distributed clients with strict latency targets, or compliance reasons to keep traffic in-Region |
| Single Region | Not recommended. A single-Region resolver loses availability during a Regional event |
Constraints:
--observability-region at create time. It names the Region that query logs are
delivered from, and is needed even if logging is not configured yet, so the customer can
enable it later without recreating the resolverupdate-global-resolver accepts a new --regions set, but adding a Region is a time-consuming
operation because the new Region has to provision and replicate state before serving traffic.
Pick the initial set deliberatelyAuthentication is configured on the DNS view, not on the resolver as a whole. A view can have access sources, access tokens, or both, so a single resolver can serve roaming clients (token) on one view and branch offices (IP) on another, or mix both kinds on the same view.
| Choice | Use when |
|---|---|
| Access source (IP-based) | Fixed-location clients (branch offices, data centers) where the source IP is stable |
| Access token | Roaming clients (laptops, remote workers) where the source IP is not stable |
| Both on the same view | A population that includes some fixed-location and some roaming clients |
Constraints:
--protocol is DO53, DOT, or DOH (uppercase). For multiple CIDRs or
multiple protocols on one view, create one access source per (CIDR, protocol) pairTwo access-token traps surface as silent or partial failures.
Constraints:
--expires-at within that window. The token value returned in the create response is the
secret the client uses and is not retrievable later, so capture it at create time| Choice | Use when |
|---|---|
| Multiple DNS views | Client groups need different resolution behavior, different firewall policy, or different private hosted zone access |
| One DNS view | Every client group should resolve identically and see the same private hosted zones |
Constraints:
A firewall rule on a DNS view is one of two shapes. The shape decides what the rule matches and which actions are valid.
| Shape | Use when |
|---|---|
| Domain-list rule | The threat is a known set of bad domains. Match against a custom or AWS-managed firewall domain list. Action is ALLOW, BLOCK, or ALERT |
| Advanced threat protection rule | The threat is algorithmic: short-lived DGA names or DNS tunneling for data exfiltration. Match against DGA, DNS_TUNNELING, or DICTIONARY_DGA. Action is ALERT or BLOCK only |
Constraints:
ALLOW. The API enforces this; algorithmic detection
cannot definitively classify benign traffic--confidence-threshold (LOW, MEDIUM, HIGH). You SHOULD start at
HIGH in ALERT mode, measure false positives, then lower or move to BLOCK from thereA blocked query can be answered three ways. The wrong choice creates support cases that look like generic resolution failures.
| Mode | Use when |
|---|---|
NXDOMAIN (the client is told the domain does not exist) | The application should fail fast |
NODATA (the client gets an empty answer) | The failure should be quiet (can resemble a network issue) |
OVERRIDE (the client gets a chosen CNAME target) | Traffic should be redirected to a sinkhole or inspection host |
Constraints:
OVERRIDE, you MUST also supply --block-override-domain, --block-override-dns-type
(the API only supports CNAME), and --block-override-ttl. The API rejects an OVERRIDE rule
without all threeMissing --region us-east-2. Every Global Resolver API call goes to US East (Ohio) regardless
of where the resolver is deployed.
No access source and no access token on the view. A view authorizes nothing until at least one of either is created.
Tokens authenticate DoT and DoH only, not Do53. Add an IP-based access source for the Do53 population, or move them to DoT or DoH.
IP-based access source used for clients with changing IPs. Switch the roaming population to a token-based access token; IP and token can coexist on the same view for a mixed population.
The access source’s --protocol does not match the client operating system. Update with
update-access-source --protocol DO53|DOT|DOH, or recreate if you also need to change the CIDR
or IP address type. For DoT and DoH clients, also check the SNI entry below; a TLS handshake
failure surfaces here too.
No hosted zone association on the DNS view. Associate the hosted zone to the view’s ARN and
wait for status OPERATIONAL.
A higher-priority rule on the same view halted inspection first, the rule references the wrong domain list, or the rule is on a different DNS view than the queries are coming through. Read the rule and the list contents to confirm:
aws route53globalresolver get-firewall-rule --region us-east-2 --firewall-rule-id {rule_id}
aws route53globalresolver list-firewall-domains --region us-east-2 \
--firewall-domain-list-id {list_id}The client is connecting to the anycast IP without setting the resolver’s dnsName as TLS
server name indication (SNI). The certificate is bound to dnsName, not to the anycast IP.
Set the SNI to the value of dnsName returned by get-global-resolver.
Block mode does not match how the application should fail. Recreate with NXDOMAIN,
NODATA, or OVERRIDE per the block-mode decision.
The resolver was created without --ip-address-type DUAL_STACK. Update via
update-global-resolver --ip-address-type DUAL_STACK to add the IPv6 anycast addresses.
This procedure sets up a Route 53 Global Resolver instance: an anycast DNS endpoint for on-premises and remote clients. It creates the resolver, selects Regions and the observability Region, creates one or more DNS views, adds access sources and access tokens per view, optionally adds firewall rules and private hosted zone associations, points clients at the two anycast IPs, and surfaces the console link to verify.
regions.IPV4): IPV4 or DUAL_STACK. DUAL_STACK adds
two anycast IPv6 addresses alongside the two IPv4 addresses.namednssec_validation: ENABLED or DISABLEDedns_client_subnet: ENABLED or DISABLEDfirewall_rules_fail_open: ENABLED or DISABLEDaccess_sources: zero or more {cidr, protocol} pairstokens: zero or more {name, expires_at}firewall_rules (optional): domain-list or advanced-threat rules, each with a priorityhosted_zone_associations (optional): private hosted zone IDsConstraints for parameter acquisition:
Constraints:
aws sts get-caller-identityaws sts assume-role) rather than long-lived IAM user access keys.--region us-east-2 for every Global Resolver call in this procedure, or
configure it for the session (aws configure set region us-east-2)Constraints:
You MUST set --regions, --observability-region, and --ip-address-type. The observability
Region must be one of the Regions in --regions:
aws route53globalresolver create-global-resolver \
--region us-east-2 \
--name {resolver_name} \
--regions {region_1} {region_2} \
--observability-region {observability_region} \
--ip-address-type {IPV4|DUAL_STACK}You MUST capture both ipv4Addresses (and ipv6Addresses if dual-stack) from the response;
clients are configured with all of them
You MUST poll get-global-resolver until status is OPERATIONAL before creating
downstream resources
Each view has three options that have to be set explicitly:
--dnssec-validation: when ENABLED, the resolver verifies DNSSEC signatures. Use ENABLED
unless the customer has a known broken signer they cannot avoid.--edns-client-subnet: when ENABLED, the resolver forwards (or injects, if absent) the
client subnet to authoritative nameservers. Improves geographic CDN routing at the cost of
leaking subnet info; the customer’s privacy posture decides this.--firewall-rules-fail-open: when ENABLED, queries are allowed through if the firewall
cannot be evaluated. DISABLED (fail closed) is safer for security-critical setups;
ENABLED (fail open) avoids broad outages if the firewall has a problem.Constraints:
You MUST create at least one DNS view; a Global Resolver with no view authorizes nothing
You MUST set all three options per view based on customer requirements:
aws route53globalresolver create-dns-view \
--region us-east-2 \
--global-resolver-id {global_resolver_id} \
--name {view_name} \
--dnssec-validation {ENABLED|DISABLED} \
--edns-client-subnet {ENABLED|DISABLED} \
--firewall-rules-fail-open {ENABLED|DISABLED}Constraints:
For each fixed-location population on the view, you MUST create one access source per (CIDR, protocol) pair:
aws route53globalresolver create-access-source \
--region us-east-2 \
--dns-view-id {dns_view_id} \
--cidr {cidr} \
--protocol {DO53|DOT|DOH} \
--name {access_source_name}For each roaming population on the view, you MUST create an access token:
aws route53globalresolver create-access-token \
--region us-east-2 \
--dns-view-id {dns_view_id} \
--name {token_name} \
--expires-at {iso8601_timestamp}You MUST store the token value from the create response in AWS Secrets Manager rather than in
plaintext configuration; it is the client secret and is not retrievable after creation
A domain-list rule references a firewall domain list; an advanced rule uses an algorithmic detector and skips the list. Custom domain lists are scoped to the resolver and reusable across views; AWS-managed lists do not need to be created.
Constraints:
For a custom domain list, create at the resolver level and add domains. update-firewall-domains
accepts up to 1000 domains per call (ADD, REMOVE, or REPLACE); for larger lists use
import-firewall-domains with a domain file in S3:
aws route53globalresolver create-firewall-domain-list \
--region us-east-2 \
--global-resolver-id {global_resolver_id} \
--name {list_name}
aws route53globalresolver update-firewall-domains \
--region us-east-2 \
--firewall-domain-list-id {list_id} \
--operation ADD --domains {domain_1} {domain_2}
aws route53globalresolver import-firewall-domains \
--region us-east-2 \
--firewall-domain-list-id {list_id} \
--operation ADD \
--domain-file-url s3://{bucket}/{key}To find AWS-managed list IDs, list by type. The type is THREAT or CONTENT:
aws route53globalresolver list-managed-firewall-domain-lists \
--region us-east-2 \
--managed-firewall-domain-list-type {THREAT|CONTENT}Create a domain-list rule on the view. For BLOCK, set --block-response; for OVERRIDE,
also supply the override target fields (see the block-mode decision):
aws route53globalresolver create-firewall-rule \
--region us-east-2 \
--dns-view-id {dns_view_id} \
--firewall-domain-list-id {list_id} \
--priority {priority} \
--action {ALLOW|BLOCK|ALERT} \
--block-response {NXDOMAIN|NODATA|OVERRIDE} \
--name {rule_name}For an advanced threat protection rule, omit the domain list and set the detector and
threshold. Action is ALERT or BLOCK only:
aws route53globalresolver create-firewall-rule \
--region us-east-2 \
--dns-view-id {dns_view_id} \
--priority {priority} \
--action {ALERT|BLOCK} \
--dns-advanced-protection {DGA|DNS_TUNNELING|DICTIONARY_DGA} \
--confidence-threshold HIGH \
--name {rule_name}The hosted zone is associated to a specific DNS view through the view’s ARN, not to the resolver as a whole.
Constraints:
For each private hosted zone the view should resolve, you MUST associate it explicitly and
wait for status: OPERATIONAL:
aws route53globalresolver associate-hosted-zone \
--region us-east-2 \
--hosted-zone-id {hosted_zone_id} \
--resource-arn {dns_view_arn} \
--name {association_name}Configure clients with both anycast IPv4 addresses (and both IPv6 addresses if dual-stack) returned in Step 2. Anycast routes each client to the nearest available Region in the resolver’s Region set automatically.
Constraints:
For DoT and DoH clients, you MUST configure the resolver’s dnsName (returned by
get-global-resolver) as the TLS server name indication (SNI) value, since anycast IPs alone
do not name a certificate
You MUST verify the resolver answers queries from authorized clients over the configured protocols
You MUST enable query logging to an encrypted destination for security monitoring and firewall rule validation. Query log delivery is configured separately, through the Global Resolver console. Supported destinations are Amazon S3, Amazon CloudWatch Logs, and Amazon Data Firehose. Logs are delivered in Open Cybersecurity Schema Framework (OCSF) format
You MUST present the Global Resolver console view:
https://console.aws.amazon.com/route53globalresolver/home/resolvers{
"resolver_name": "corp-global-resolver",
"regions": ["us-east-1", "us-west-2", "eu-west-1"],
"observability_region": "us-east-1",
"ip_address_type": "DUAL_STACK",
"dns_views": [
{
"name": "branch-offices",
"dnssec_validation": "ENABLED",
"edns_client_subnet": "ENABLED",
"firewall_rules_fail_open": "DISABLED",
"access_sources": [
{"cidr": "203.0.113.0/24", "protocol": "DOT"}
],
"firewall_rules": [
{"name": "block-aws-threats", "priority": 100, "action": "BLOCK",
"block_response": "NXDOMAIN", "managed_list_type": "THREAT"}
]
},
{
"name": "remote-workers",
"dnssec_validation": "ENABLED",
"edns_client_subnet": "DISABLED",
"firewall_rules_fail_open": "DISABLED",
"tokens": [
{"name": "remote-workers-q4", "expires_at": "2026-12-12T00:00:00Z"}
]
}
]
}Created Global Resolver corp-global-resolver in us-east-1, us-west-2, eu-west-1 (dual-stack).
Two DNS views configured: branch-offices (DoT, AWS-managed THREAT block) and remote-workers
(token, expires 2026-12-12; capture the value field, not retrievable later).
Verify in the console:
https://console.aws.amazon.com/route53globalresolver/home/resolversMissing --region us-east-2 (Step 1). Set the region on the session or on each call.
No access source and no access token on the view. Add at least one (Step 4).
Tokens authenticate DoT and DoH only, not Do53. Add an IP-based access source for Do53 clients or move them to DoT/DoH (Step 4).
IP-based access source used for clients with changing IPs. Add a token for the roaming population (Step 4); IP and token coexist on the same view.
No association on the DNS view. Associate the hosted zone to the view’s ARN and wait for
OPERATIONAL (Step 6).
Wrong domain list, a higher-priority rule on the same view halted inspection first, or the rule is on a different DNS view than the queries are coming through. Read the rule and the list contents to confirm (Step 5).
Created with --action ALLOW. Advanced rules support ALERT and BLOCK only (Step 5).
SNI is not set to the resolver’s dnsName. Configure the client SNI to dnsName returned by
get-global-resolver (Step 7).
Block mode does not match how the application should fail. Recreate with the right mode per the block-mode decision (Step 5).
aws sts assume-role) rather than
long-lived IAM user access keys, and prefer read-only credentials for inspection steps.value returned at create time as a client secret: store it in
AWS Secrets Manager rather than in plaintext configuration, since it is not retrievable later.This file