AWS CDK -- 如何通过 AWS CDK 从我新创建的托管区域检索我的 NS 记录

问题描述 投票:0回答:6

假设我创建了一个公共托管区域或从查找中获取托管区域,并且我想检索 NS 记录以供其他用途

const zone = new route53.PublicHostedZone(this, domain + 'HostedZone', {
    zoneName: '' + domain
})
const zone = HostedZone.fromLookup(this, 'HostedZone', { domainName: config.zoneName });

当前的CDK有什么方法可以做到这一点吗?我查看了 API doco,但没有找到。有什么建议吗?


更新

我确实尝试过

hostedZoneNameServers
属性。然而,它似乎没有返回任何东西。

const zone = route53.HostedZone.fromLookup(this, 'DotnetHostedZone', {
      domainName: <myDomain>,
    });

    new CfnOutput(this, `output1`, {
      value: zone.zoneName
    });

    new CfnOutput(this, `output2`, {
      value: zone.hostedZoneId
    });

    new CfnOutput(this, 'output3', {
      value: zone.hostedZoneNameServers?.toString() || 'No NameServer'
    });   
 ✅  test-ops

Outputs:
test-ops.output1 = <myDomain>
test-ops.output2 = <myZoneId>
test-ops.output3 = No NameServer

我与我的区域确认并用于进行记录导出,我可以检索我的所有记录。

最终目标是自动化子域配置。但我目前正在为这条路线摸不着头脑。

amazon-web-services amazon-route53 aws-cdk
6个回答
2
投票

区域对象上有一个

hostedZoneNameServers
属性。

const zone = HostedZone.fromLookup(this, 'HostedZone', { domainName: config.zoneName });
const nsRecords = zone.hostedZoneNameServers;

但是,这不适用于跨 cdk 堆栈或私有托管区域。它必须在同一个堆栈中定义。

参考:


1
投票

我能够使用以下代码自动配置子域。 请注意,这些托管区域共享相同的堆栈,这可能不适用于您的用例。

export const hostedZone = new HostedZone(stack, `${env}-hosted-zone`, {
  zoneName: host,
})

// API
const apiHost = `api.${host}`
export const apiHostedZone = new HostedZone(stack, `${env}-hosted-zone-api`, {
  zoneName: apiHost,
})
// note that this record is actually on the parent zone, 
export const apiHostedZoneNsRecord = new NsRecord(stack, `${env}-hosted-zone-ns-api`, {authoritatively pointing to its sub-subdomain
  recordName: apiHost,
  values: apiHostedZone.hostedZoneNameServers as string[],
  zone: hostedZone,
})

这导致了以下 CFT 片段(当然,${env} 和 ${rnd} 替换为具体值):

"ResourceRecords": {
 "Fn::GetAtt": [
  "${env}hostedzoneapi${rnd}",
  "NameServers"
 ]
},

如果您可以接受相同的堆栈约束,您应该能够完成此任务。 请注意,虽然我可以接受此堆栈的约束,但更广泛地说,我有一个多帐户结构,并且必须手动将子帐户的子域 NS 记录添加到父帐户的根域。 此设置摘要:

root account:
  example.com
    NS child.example.com // manually added
child account:
  child.example.com // contents of `host` below 
    NS api.child.example.com
  api.child.example.com //  automatic subdomain created with code above

0
投票

我不相信你可以直接从脚本中做到这一点。这些值只是“令牌”,将在部署之后/期间被 CloudFormation 替换,但不会在综合期间替换。因此,在合成过程中输出会让您盲目。我猜你需要在

post-process
中获取它们..

我遇到了同样的问题,这就是我找到你的帖子的原因:D


0
投票

hostedZoneNameServers
没有为文档中提到的私有或导入区域定义。仅当您在 CDK 中创建区域时才可以使用(例如
new PublicHostedZone(...).hostedZoneNameServers
)。

如果您在其他地方创建区域,请尝试使用 AWS Route53 GetHostedZone API


0
投票

这对我有用

    const nsRecords = hostedZone.hostedZoneNameServers;

    if (nsRecords) {
      for (let i=0; i<4; i++) {
        context.cfnOutput(this, `NS Record${i+1}`, Fn.select(i, nsRecords));
      }
    }


0
投票

正如 @JD D 所提到的,托管区域上有一个

hostedZoneNameServers
属性,但它们在跨堆栈中不可用。文档已更新(或者第一次回答时遗漏了)以反映这一点。

CDK V1 / CDK V2

hostedZoneNameServers? 类型:字符串[](可选)

返回特定托管区域的名称服务器集。例如:ns1.example.com。

对于私有托管区域或从其他堆栈导入的托管区域,此属性将未定义。

因此,为了完成您想要的任务,您需要将 NS 值设置为创建托管区域的堆栈上的输出,并通过引用提供 NS 输出的堆栈来使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.