创建CloudFormation栈时遇Route53:GetHostedZone权限拒绝错误
我之前在配置CloudFormation Route53资源时也踩过类似的权限坑,结合你描述的场景——拥有AdministratorAccess权限却依然报错,其他资源正常创建,大概率不是IAM用户/角色的直接权限问题,而是以下几个容易忽略的点:
1. 检查Route53托管区的资源级权限策略
很多人会忽略Route53托管区本身自带的权限策略,它会优先于IAM用户/角色的权限生效。哪怕你有管理员权限,如果托管区的策略没有授权你的CloudFormation执行实体(你的用户或指定的IAM角色)进行记录集修改操作,就会触发权限拒绝。
- 操作步骤:
- 打开Route53控制台,找到目标托管区
- 切换到「权限」标签页,查看托管区的策略文档
- 确保策略中包含允许
route53:ChangeResourceRecordSets的语句,针对该托管区的ARN,并且允许你的IAM用户/CloudFormation角色作为主体。比如:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/your-user" // 或者CloudFormation角色的ARN }, "Action": "route53:ChangeResourceRecordSets", "Resource": "arn:aws:route53:::hostedzone/Z0123456789ABCDEF" } ] }
2. 验证CloudFormation执行角色的信任策略
如果你指定了IAM角色让CloudFormation使用,除了角色本身附加AdministratorAccess,还要确保角色的信任策略允许CloudFormation服务来扮演这个角色。否则CloudFormation无法获取该角色的权限来执行Route53操作。
- 检查信任关系:
- 进入IAM控制台,找到你给CloudFormation用的角色
- 切换到「信任关系」标签页,确认存在以下语句:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudformation.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
3. 避免HostedZoneName的解析歧义(隐性坑)
AWS有时候会对不带尾点的域名解析出现偏差,比如你的托管区名称是example.com.(带尾点),但你传入的参数是example.com(不带尾点),CloudFormation可能会错误地尝试访问不存在的托管区,这时候返回的错误也是「权限拒绝」(因为你对不存在的资源没有权限)。
- 优化方案:
把模板中的HostedZoneName替换为HostedZoneId,用托管区的唯一ID来指定目标,避免名称解析问题。修改后的模板片段:Parameters: HostedZoneId: Type: String Description: 现有Route53托管区的ID AliasTargetHostedZoneId: Type: String Description: ALB的托管区ID AliasTargetDNSName: Type: String Description: ALB的DNS名称 Resources: DNS: Type: AWS::Route53::RecordSetGroup Properties: HostedZoneId: !Ref HostedZoneId # 替换为托管区ID Comment: Zone apex alias targeted to myELB LoadBalancer. RecordSets: - Name: !Join [ ".", ["alb", !Ref HostedZoneName]] # 也可直接传入完整记录名称作为参数 Type: A AliasTarget: HostedZoneId: !Ref AliasTargetHostedZoneId DNSName: !Ref AliasTargetDNSName
4. 排查IAM用户的条件策略限制
如果你是用自己的用户权限创建栈,检查你的IAM用户是否有条件策略(比如要求MFA验证)。CloudFormation在调用Route53时无法自动传递MFA凭证,如果你的用户策略强制要求MFA,就会被拒绝。
- 检查方式:
进入IAM控制台,查看你的用户权限策略,确认没有类似"Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}的强制条件,或者确保创建栈时使用的是带MFA验证的会话凭证。
按照这个顺序排查,基本能解决大部分看似权限足够却报错的情况。
内容的提问来源于stack exchange,提问作者Robin-Hoodie

