You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CDK v2自定义VPC创建失败:VPC ID不存在问题求助

解决CDK创建自定义VPC时的子网关联错误

错误原因

报错提示VPC ID 'TemplateVpc'不存在,核心问题是你在创建子网时,vpcId参数传的是CDK构造的逻辑ID(即new Vpc(this, 'TemplateVpc')里的第二个参数),而非AWS实际生成的VPC资源ID。CDK部署时,VPC的实际ID是动态生成的(格式如vpc-0abc123def456),硬编码逻辑ID会导致子网找不到对应的VPC资源。

另外你的代码中还存在子网CIDR重叠问题(多个子网使用了10.0.0.0/24或10.0.0.0/28),这也会导致后续部署失败,需要一并修正。

解决方案

方式一:推荐使用Vpc的subnetConfiguration定义自定义子网(最佳实践)

CDK的Vpc构造提供了subnetConfiguration参数,可以直接定义子网的类型、CIDR、可用区等,无需手动创建子网,CDK会自动处理VPC关联和路由配置,避免手动错误。

修改后的代码:

import { Stack, StackProps } from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { Construct } from 'constructs';

export class CdkVpcStack extends Stack {
  readonly vpc: ec2.Vpc;
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    const vpcName = "TempVpc";
    this.vpc = new ec2.Vpc(this, 'TemplateVpc', {
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
      vpcName: vpcName,
      maxAzs: 2,
      natGateways: 1,
      // 自定义子网配置,控制可用区、CIDR和类型
      subnetConfiguration: [
        {
          subnetType: ec2.SubnetType.PUBLIC,
          name: 'PublicSubnet',
          cidrMask: 24,
          availabilityZones: ['eu-west-1a']
        },
        {
          subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
          name: 'PrivateDatabaseSubnet',
          cidrMask: 28,
          availabilityZones: ['eu-west-1b']
        },
        {
          subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
          name: 'PrivateApiSubnet',
          cidrMask: 24,
          availabilityZones: ['eu-west-1a']
        }
      ]
    });
  }
}

关键说明:

  • subnetType分为三类:PUBLIC(带公网访问能力)、PRIVATE_WITH_EGRESS(通过NAT网关访问公网)、PRIVATE_ISOLATED(无公网访问,适合数据库类资源)
  • availabilityZones参数可以直接指定子网所在的可用区,满足你控制可用区的需求
  • 每个子网会自动关联到当前创建的VPC,无需手动设置vpcId

方式二:手动创建子网的修正方案(仅适用于特殊场景)

如果一定要手动创建子网,需要将vpcId参数改为引用已创建VPC对象的vpcId属性,同时修正CIDR重叠问题,并手动配置路由表:

修改后的代码片段:

import { Stack, StackProps } from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { Construct } from 'constructs';

export class CdkVpcStack extends Stack {
  readonly vpc : ec2.Vpc;
  readonly publicSubnet: ec2.Subnet;
  readonly privateDatabaseSubnet: ec2.Subnet;
  readonly privateApiSubnet: ec2.Subnet;
  
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    const vpcName= "TempVpc";
    
    // 创建VPC时禁用自动子网创建,避免生成默认子网
    this.vpc = new ec2.Vpc(this, 'TemplateVpc', {
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
      vpcName: vpcName,
      maxAzs: 2,
      createInternetGateway: true,
      natGateways: 1,
      subnetConfiguration: []
    });
    
    // 创建公网子网,使用this.vpc.vpcId关联VPC
    this.publicSubnet = new ec2.PublicSubnet(this, 'PublicSubnet', {
      availabilityZone: 'eu-west-1a',
      cidrBlock: '10.0.0.0/24',
      vpcId: this.vpc.vpcId,
      mapPublicIpOnLaunch: true,
    });
    
    // 创建数据库私有子网,修正CIDR避免重叠
    this.privateDatabaseSubnet = new ec2.PrivateSubnet(this, 'PrivateDatabaseSubnet', {
      availabilityZone: 'eu-west-1b',
      cidrBlock: '10.0.1.0/28',
      vpcId: this.vpc.vpcId,
    });
    
    // 创建API私有子网,修正CIDR避免重叠
    this.privateApiSubnet = new ec2.PrivateSubnet(this, 'PrivateApiSubnet', {
      availabilityZone: 'eu-west-1a',
      cidrBlock: '10.0.2.0/24',
      vpcId: this.vpc.vpcId,
    });
    
    // 手动给公网子网添加默认路由到IGW
    const igw = this.vpc.internetGateway!;
    this.publicSubnet.addRoute('DefaultPublicRoute', {
      routerId: igw.gatewayId,
      routerType: ec2.RouterType.GATEWAY,
      destinationCidrBlock: '0.0.0.0/0',
    });
    
    // 手动给私有API子网添加默认路由到NAT网关
    const natGateway = this.vpc.natGateways[0];
    this.privateApiSubnet.addRoute('DefaultPrivateRoute', {
      routerId: natGateway.gatewayId,
      routerType: ec2.RouterType.NAT_GATEWAY,
      destinationCidrBlock: '0.0.0.0/0',
    });
  }
}

关键说明:

  • 必须设置subnetConfiguration: []禁用VPC自动子网创建,否则会生成默认子网导致CIDR冲突
  • 修正所有子网的CIDR块,确保彼此不重叠
  • 手动创建子网后需要自行配置路由表,否则子网无法正常通信(公网子网关联IGW,需要公网访问的私有子网关联NAT网关)

内容的提问来源于stack exchange,提问作者Alex-Jay Beukes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:55:16