AWS CDK:如何仅在NsRecord不存在时创建该记录?
问题
在AWS CDK堆栈中编写了以下代码创建PublicHostedZone并关联NsRecord:
const zone = new route53.PublicHostedZone(this, 'MyHostedZone', { zoneName: myCustomZone }); new route53.NsRecord(this, 'MyServiceNsRecord', { zone: zone, values: zone.hostedZoneNameServers || [] });
重新运行构建/发布管道(如对应用做其他修改后)时,报错:
Tried to create resource record set [name='my.domain.name.', type='NS'] but it already exists
请问能否配置HostedZone或NsRecord构造函数实现“upsert”(不存在则创建,存在则更新),或仅在记录不存在时创建、存在则不操作?(已知NsRecordProps有deleteExisting属性,但因存在风险不想使用)
解决方案
- 根本原因:创建PublicHostedZone时,Route53会自动在该托管区下生成一条与域名同名的NS记录,记录托管区的权威域名服务器。你手动创建的NsRecord和这条自动生成的记录冲突,导致重复创建报错。
- 核心解决方法:不需要手动创建这条主域名的NS记录。PublicHostedZone创建后,Route53会自动维护这条记录,当托管区的域名服务器发生变更时,Route53会自动更新该NS记录的值。
- 如果是为子域名配置NS记录:若你的需求是给子域名(如
sub.my.domain.name)添加NS记录指向其他托管区,需修改NsRecord的recordName属性指定子域名前缀,避免与主域名的自动NS记录冲突,示例代码:
new route53.NsRecord(this, 'MySubdomainNsRecord', { zone: zone, recordName: 'sub', // 指定子域名前缀 values: [/* 目标托管区的域名服务器地址 */] });
- 关于upsert或存在则跳过的需求:CDK本身没有直接提供“存在则跳过”的配置,但对于主域名NS记录,依赖Route53自动生成即可;对于其他类型的记录,只要确保CDK堆栈中每个记录的构造函数ID唯一,CDK会自动管理记录的创建与更新(天然支持upsert),仅当出现同一域名、同一类型的重复记录时才会报错,这种情况一般是因为手动创建了CDK未管控的记录,或代码中重复定义了同一条记录。
内容的提问来源于stack exchange,提问作者CB_at_Sw
相关产品推荐
相关产品推荐

