如何使用 Cloud Formation 创建子域托管区域

How to create a subdomain Hosted Zone using Cloud Formation

我想为子域创建一个 Route53 托管区域并 NS 记录到父域。

假设我有:

example.com

我想要一个子域的托管区域:

build.example.com

托管区创建成功:

ClusterHostedZone:
  Type: "AWS::Route53::HostedZone"
  Properties:
    Name: !Ref DomainName
    HostedZoneConfig:
      Comment: Managed by Cloud Formation
    HostedZoneTags:
      - Key: KubernetesCluster
        Value: !Ref KubernetesCluster

委派子域的责任不要:

ParentHostedZoneClusterRecord:
  Type: "AWS::Route53::RecordSet"
  Properties:
    Name: !Ref DomainName
    Comment: Managed by Cloud Formation
    HostedZoneId: !Ref ParentHostedZoneID
    TTL: 30
    Type: NS
    ResourceRecords: !GetAtt ClusterHostedZone.NameServers

这还没有实现,我不知道如何获取这些信息:

ResourceRecords: !GetAtt ClusterHostedZone.NameServers

Cloud Formation 中缺少这个简单的功能吗?

要为子域添加托管区域,您应该能够像描述的现有托管区域一样创建它,只需将 Name 属性 更改为子域。

但是,根据您的问题,听起来您实际上是在尝试为子域添加记录集(因此 build.[DomainName] 解析到您的集群),而不是单独的托管区域。

要为子域添加记录集,您需要指定 'build.[DomainName]' 作为子域记录集的名称,并使用 A record specifying the target IP address for your subdomain (or a CNAME specifying the 'canonical' domain name), not an NS record:

ParentHostedZoneClusterRecord:
  Type: "AWS::Route53::RecordSet"
  Properties:
    Name:
      Fn::Join: [".", ["build", !Ref DomainName]]
    Comment: Managed by Cloud Formation
    HostedZoneId: !Ref ParentHostedZoneID
    TTL: 30
    Type: A
    ResourceRecords: [!Ref KubernetesClusterIp]

我与 AWS 员工确认,2017 年 1 月左右不可能。

即使使用自定义 lambda it was not possible until April 由于:

In AWS CloudFormation, you can't create records of type NS or SOA.

现在看起来像 behavior is different:

Specifically, you can't create or delete NS or SOA records for the root domain of your hosted zone, but you can create them for subdomains to delegate.

[现在可以]从托管区域获取名称服务器, 我已经测试过了。(http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-hostedzone.html#w2ab2c21c10d825c11)

我无法克服的唯一限制是 cross-account 托管区域 relations/modifications,但它应该可以通过足够的 CF/Lambda 魔法来实现。

这对我有用,也许您的模板不起作用,因为您没有指定 DependsOn 并且资源未按顺序创建。

stagingHostedZone:
    Type: 'AWS::Route53::HostedZone'
    Properties:
        HostedZoneConfig:
            Comment: Hosted zone for staging environment
        Name: staging.example.com

nsRootHostedZoneRecordSet:
    Type: 'AWS::Route53::RecordSet'
    Properties:
        HostedZoneId: Z25*********
        Name: staging.example.com.
        Type: NS
        TTL: '900'
        ResourceRecords: !GetAtt stagingHostedZone.NameServers
    DependsOn:
        stagingHostedZone