假设我创建了一个公共托管区域或从查找中获取托管区域,并且我想检索 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
我与我的区域确认并用于进行记录导出,我可以检索我的所有记录。
最终目标是自动化子域配置。但我目前正在为这条路线摸不着头脑。
区域对象上有一个
hostedZoneNameServers
属性。
const zone = HostedZone.fromLookup(this, 'HostedZone', { domainName: config.zoneName });
const nsRecords = zone.hostedZoneNameServers;
但是,这不适用于跨 cdk 堆栈或私有托管区域。它必须在同一个堆栈中定义。
参考:
我能够使用以下代码自动配置子域。 请注意,这些托管区域共享相同的堆栈,这可能不适用于您的用例。
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
我不相信你可以直接从脚本中做到这一点。这些值只是“令牌”,将在部署之后/期间被 CloudFormation 替换,但不会在综合期间替换。因此,在合成过程中输出会让您盲目。我猜你需要在
post-process
中获取它们..
我遇到了同样的问题,这就是我找到你的帖子的原因:D
hostedZoneNameServers
没有为文档中提到的私有或导入区域定义。仅当您在 CDK 中创建区域时才可以使用(例如 new PublicHostedZone(...).hostedZoneNameServers
)。
如果您在其他地方创建区域,请尝试使用 AWS Route53 GetHostedZone API。
这对我有用
const nsRecords = hostedZone.hostedZoneNameServers;
if (nsRecords) {
for (let i=0; i<4; i++) {
context.cfnOutput(this, `NS Record${i+1}`, Fn.select(i, nsRecords));
}
}