You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建CloudFormation栈时遇Route53:GetHostedZone权限拒绝错误

解决CloudFormation创建Route53 RecordSetGroup时的权限拒绝问题

我之前在配置CloudFormation Route53资源时也踩过类似的权限坑,结合你描述的场景——拥有AdministratorAccess权限却依然报错,其他资源正常创建,大概率不是IAM用户/角色的直接权限问题,而是以下几个容易忽略的点:

1. 检查Route53托管区的资源级权限策略

很多人会忽略Route53托管区本身自带的权限策略,它会优先于IAM用户/角色的权限生效。哪怕你有管理员权限,如果托管区的策略没有授权你的CloudFormation执行实体(你的用户或指定的IAM角色)进行记录集修改操作,就会触发权限拒绝。

  • 操作步骤:
    1. 打开Route53控制台,找到目标托管区
    2. 切换到「权限」标签页,查看托管区的策略文档
    3. 确保策略中包含允许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操作。

  • 检查信任关系:
    1. 进入IAM控制台,找到你给CloudFormation用的角色
    2. 切换到「信任关系」标签页,确认存在以下语句:
      {
        "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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:54:42