Subchapter 91.4
references/configuring-route53-profiles.mdMarkdown15 KBView on GitHub
Domain expertise for defining a DNS configuration once with a Route 53 Profile and applying it across many VPCs and accounts. Covers attaching DNS resources to a Profile, associating it with VPCs, sharing it cross-account through AWS Resource Access Manager (RAM), and the four things customers get wrong: the sharing prerequisite, the per-association cost, the admin-sharing injection risk, and the owner-side visibility gap.
Does not cover authoring DNS Firewall rules, the hybrid resolver setup, or the org-wide DNS Firewall fan-out. Those are separate skills.
Execute commands using the AWS MCP server when connected (sandboxed execution, audit logging, observability). Fall back to the AWS CLI otherwise.
To configure and share a Profile, follow the procedure exactly. See the Procedure section below.
The procedure covers:
The sharing prerequisite. Cross-account sharing requires a RAM resource share with the correct managed permission. If sharing outside the Organization, the recipient must also accept the RAM share invitation. These steps are frequently missed, and the recipient then cannot associate.
The admin-sharing injection risk. A recipient with admin on a shared Profile can associate
any resource, including its own private hosted zone, and that association applies to every other
account consuming the Profile. Default to read-only. When the recipient genuinely needs to
contribute resources, prefer a scoped IAM condition-key policy on the RAM share (for example,
only hosted zones whose name ends in test.com) over blanket admin.
The cost tradeoff. Profiles are billed per account, not per Profile: $0.75/hour covers up to 100 Profile-VPC associations across all Profiles the account owns in a Region, then $0.0014 per association per hour. The Profile owner pays for every association, including those created by RAM recipients in their own accounts. For a small, stable set of VPCs, manual associations can be cheaper. Surface this before rollout, not after.
The owner-side visibility gap. From the owner account, the agent cannot enumerate which consumer accounts associated their VPCs to a shared Profile. The owner sees the RAM share, not the resulting associations.
Constraints:
| Choice | Use when |
|---|---|
| Profile | The fleet is large or growing; a Profile scales to up to 1,000 VPCs per Region and avoids drift |
| Manual associations | The VPC set is small and stable, where the per-association charge makes a Profile more expensive |
| Choice | Use when |
|---|---|
| Read-only | Default. The recipient only needs to associate the shared Profile with its VPCs |
| Admin | The recipient must contribute its own resources (e.g., a distributed zone hierarchy), accepting that it can inject configuration into every consumer |
| Scoped contribution via IAM condition keys | The recipient must contribute resources but the owner wants to bound what it can add. RAM sharing supports IAM condition keys, so the policy can allow, for example, only private hosted zones whose name ends in test.com. Prefer this over blanket admin when contribution must be limited |
The RAM share is missing, the wrong permission was used, or the recipient has not accepted the share invitation. Verify the share exists with the correct managed permission and that the recipient accepted the invitation (automatic within an Organization with RAM sharing enabled).
Only VPC-association rights were granted. Grant the broader permission for two-way contribution, weighing the injection risk.
The owner account sees the share, not the associations. Use an org CloudTrail trail, a Config aggregator, or per-account roles.
Per-account Profile pricing: $0.75/hour covers the first 100 Profile-VPC associations across all the account’s Profiles in a Region, then $0.0014 per association per hour, and the owner pays for associations made by RAM recipients. Compare against manual associations for small, stable fleets.
Admin sharing let a recipient inject a resource. Default to read-only; reserve admin for genuine need.
This procedure defines a DNS configuration once with a Route 53 Profile and applies it across many VPCs and accounts. It attaches DNS resources to the Profile, associates the Profile with VPCs, shares it cross-account through AWS Resource Access Manager (RAM) with the correct managed permission, and sets expectations on cost and owner-side visibility.
us-east-1).read-only or admin.Constraints for parameter acquisition:
share_permission to read-only and confirm before using adminvpc_ids is small and stableConstraints:
aws sts get-caller-identityaws sts assume-role) rather than long-lived IAM user access keys.Constraints:
You MUST create one Profile and attach each resource to it:
aws route53profiles create-profile --name {profile_name} --region {region}
aws route53profiles associate-resource-to-profile \
--profile-id {profile_id} \
--resource-arn {resource_arn} \
--name {association_name} --region {region}When the resource is a DNS Firewall rule group, you MUST include a priority via
--resource-properties; the call fails for a rule group without it. The priority sets the rule
group’s processing order (allowed range 100-9900, lowest evaluated first):
aws route53profiles associate-resource-to-profile \
--profile-id {profile_id} \
--resource-arn {firewall_rule_group_arn} \
--resource-properties '{"priority": 101}' \
--name {association_name} --region {region}You SHOULD move query logging to the Profile level so the configuration propagates automatically rather than being re-done per VPC
Constraints:
You MUST associate the Profile with each target VPC. Each call binds one VPC; a Profile can be associated with up to 1,000 VPCs per Region (a default quota AWS can raise on request). A VPC can have only one Profile associated at a time, so this fails if the VPC already has one:
aws route53profiles associate-profile \
--profile-id {profile_id} \
--resource-id {vpc_id} \
--name {association_name} --region {region}The association returns UPDATING and is not in effect until it reaches COMPLETE. You MUST
poll get-profile-association until the status is COMPLETE before reporting success:
aws route53profiles get-profile-association \
--profile-association-id {association_id} --region {region}Constraints:
You MUST create the RAM resource share with the appropriate managed permission. The built-in
AWSRAMPermissionRoute53ProfileAllowAssociation grants association-only (read-only) access:
aws ram create-resource-share \
--name {share_name} \
--resource-arns {profile_arn} \
--principals {share_principals} \
--permission-arns {ram_permission_arn} \
--region {region}If sharing outside the AWS Organization (or if organizational sharing is not enabled), the recipient MUST accept the resource share invitation before they can use the shared Profile:
aws ram get-resource-share-invitations --region {region}
aws ram accept-resource-share-invitation \
--resource-share-invitation-arn {invitation_arn} --region {region}Shares within an Organization that has RAM sharing enabled are accepted automatically.
You MUST default to read-only. Before granting admin, you MUST explain that a recipient with admin can associate a resource that applies to every consumer of the Profile
You SHOULD use a custom RAM managed permission to scope what a contributing recipient may add
(for example, only private hosted zones whose name ends in test.com) rather than granting
blanket resource-association access
Constraints:
Constraints:
You MUST present the Profile detail console view, filling {region} and {profileId} from
the API response:
https://{region}.console.aws.amazon.com/route53profiles/home?region={region}#/profiles/{profileId}{
"region": "us-east-1",
"dns_resources": ["arn:aws:route53resolver:us-east-1:111122223333:firewall-rule-group/rslvr-frg-0123456789abcdef0"],
"vpc_ids": ["vpc-0abc123"],
"share_principals": ["ou-abcd-1234abcd"],
"share_permission": "read-only"
}Created Profile rp-0a1b2c3d4e5f, attached 1 resource, associated with vpc-0abc123.
- Shared read-only with ou-abcd-1234abcd via RAM (association-only permission)
Verify in the console:
https://us-east-1.console.aws.amazon.com/route53profiles/home?region=us-east-1#/profiles/rp-0a1b2c3d4e5fRAM share missing, wrong permission used, or the recipient has not accepted the share invitation. Re-check the share exists with the correct managed permission and that the recipient accepted (Step 4).
The owner account sees the share, not the associations. Use an org CloudTrail trail, a Config aggregator, or per-account roles (Step 5).
Per-account Profile pricing ($0.75/hour for the first 100 Profile-VPC associations in a Region, then $0.0014 each per hour; owner pays for RAM-recipient associations). Compare against manual associations for small, stable fleets.
Admin sharing let a recipient inject a resource. Default to read-only.
aws sts assume-role) rather than
long-lived IAM user access keys, and prefer read-only credentials for inspection steps.| Resource type | Default quota | Adjustable |
|---|---|---|
| DNS Firewall rule groups per Profile | 5 | No |
| Resolver rules per Profile | 1,000 | Yes |
| Private hosted zones per Profile | 5,000 | Yes |
| Resolver query logging configurations per Profile | 2 | No |
These are in addition to the 1,000 VPC associations per Profile (adjustable) and 5 Profiles per account per Region.