AWS CDK TypeScript创建CNAME报错已存在 如何实现前置存在性校验
错误原因
Route53 是 AWS 全局服务,同一个托管区域(HostedZone)下的 DNS 记录全局唯一,你在 eu-west-1 和 eu-central 两个区域的栈都尝试创建同名同类型的 CNAME 记录,第二个部署的栈自然会触发资源已存在的报错。
解决方案
以下三种方案可根据你的业务场景选择:
方案1:自动覆盖已存在的同名记录
如果允许覆盖旧记录,直接给 CnameRecord 新增 deleteExisting: true 参数即可,部署时如果发现同名称同类型的记录已存在,会先删除旧记录再创建新的:
const cName = new route53.CnameRecord(this, "cName", { zone: route53.HostedZone.fromLookup(this, "lowerHostedZone3", { domainName: topDomain, }), recordName: topFQDN, domainName: lowerFQDN, // 新增配置开启覆盖逻辑 deleteExisting: true });
注意:该方案会强制删除已存在的同名CNAME记录,若现有记录承载生产业务请谨慎使用。
方案2:仅当记录不存在时才创建
如果需要保留现有记录,仅在记录缺失时新建,可以先查询现有记录,判断不存在再执行创建逻辑:
import { CfnRecordSet } from 'aws-cdk-lib/aws-route53'; // 先查询目标托管区下是否存在对应CNAME记录 const existingRecord = CfnRecordSet.fromCfnRecordSetName( this, 'existingCname', `${topFQDN}.`, { hostedZoneName: `${topDomain}.`, type: 'CNAME' } ); // 仅查询不到现有记录时才创建新CNAME if (!existingRecord) { const cName = new route53.CnameRecord(this, "cName", { zone: route53.HostedZone.fromLookup(this, "lowerHostedZone3", { domainName: topDomain, }), recordName: topFQDN, domainName: lowerFQDN }); }
方案3:抽离全局DNS栈避免重复创建
因为你是跨区域部署业务栈,更合理的架构是将Route53 DNS记录的创建逻辑单独抽成一个无区域绑定的全局栈,两个区域的业务栈直接导入该全局栈输出的CNAME记录资源即可,从根源上避免重复创建的冲突。
内容的提问来源于stack exchange,提问作者Ashish Karpe
相关产品推荐
相关产品推荐

