我的 VPC 有一个 CFN 堆栈,我首先在其中仅创建公共和私有子网,并为其分配默认 CIDR 块。现在,过了一段时间,我还需要将隔离子网添加到 VPC。当我尝试更新 CFN 堆栈时,出现异常 -
"The CIDR '10.0.0.0/25' conflicts with another subnet
在 CFN 堆栈更新中添加更多子网后,是否可以将 CIDR 块重新分配给子网?
这是示例代码:
if (<some condition>){
this.createVpcWithIsolatedSubnets();
} else {
this.createVpc()
}
createVpc() {
const vpc = new ec2.Vpc(this, `VPC`, {
maxAzs: MAX_AZ,
subnetConfiguration: [
{
name: 'Public',
subnetType: ec2.SubnetType.PUBLIC
},
{
name: 'Private',
subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS
}
]
});
}
createVpcWithIsolatedSubnets() {
const vpc = new ec2.Vpc(this, `VPC`, {
maxAzs: MAX_AZ,
subnetConfiguration: [
{
name: 'Public',
subnetType: ec2.SubnetType.PUBLIC
},
{
name: 'Private',
subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS
},
{
name: 'Isolated',
subnetType: ec2.SubnetType.PRIVATE_ISOLATED
}
]
});
}
该错误表明您正在尝试添加一个 CIDR 与已存在的子网重叠的新子网。 在 CloudFormation 模板中,创建子网时,您可以指定要使用的 CIDR 范围。
如果您更新此属性,我们将创建一个新子网,然后删除 现有的。
因此,您很可能会尝试采用现有子网 CIDR 并将其缩小到更小的值,同时添加使用部分相同范围的新子网。 这将导致重叠,因为 CloudFormation 将尝试首先创建新子网,并且仅在清理阶段删除旧子网。 您需要在堆栈更新中删除现有子网,然后在后续堆栈更新中创建两个具有较小 CIDR 范围的新子网,该堆栈更新将在第一次更新完成后运行。
不可能“将 CIDR 块重新分配给子网”,因为更新实际上意味着删除现有的 CIDR 块并重新创建一个新的。 另请参阅子网大小调整。 如果您可以发布原始 CFN 模板和新模板的相关部分,则可以更轻松地比较您为子网使用的 CIDR。