如何使用 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
我想为子域创建一个 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