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

时间:2016-12-09 11:27:41

标签: amazon-web-services amazon-route53 amazon-cloudformation

我想为子域创建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中是否缺少这个简单的功能?

3 个答案:

答案 0 :(得分:3)

这对我来说很有用,也许你的模板不起作用,因为你没有指定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

答案 1 :(得分:2)

我向AWS员工证实,2017年1月左右无法实现。

即使使用自定义lambda it was not possible until April,原因如下:

  

在AWS CloudFormation中,您无法创建NS或SOA类型的记录。

现在看起来像behavior is different

  

具体而言,您无法为托管区域的根域创建或删除NS或SOA记录,但您可以为子域创建它们以进行委派。

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

我无法克服的唯一限制是跨帐户托管区域关系/修改,但它应该可以使用足够的CF / Lambda魔法。

答案 2 :(得分:0)

要为子域添加托管区域,您应该能够创建类似于所描述的现有托管区域,只需将Name属性更改为子域。

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

要为子域添加记录集,您需要将'build.[DomainName]'指定为子域名RecordSet的名称,并使用A record指定子域的目标IP地址(或指定'规范域名的CNAME,而不是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]