首页 > 解决方案 > CDK:部署私有组后,此 VPC 中没有“私有”子网组

问题描述

我已经在默认 vpc (java) 中部署了 rivate 子网:

var stack = new Stack(app, "system-resource", StackProps.builder().env(env).build());
final IVpc vpc = Vpc.fromLookup(stack, "default-vpc", VpcLookupOptions.builder().isDefault(true).build());
final AtomicInteger index = new AtomicInteger();
var zones = stack.getAvailabilityZones();
var subnets = zones.stream().map(z -> {
  var subnet = new PrivateSubnet(stack, "priavte-subnet-" + index.getAndIncrement(), PrivateSubnetProps.builder()
      .vpcId(vpc.getVpcId())
      .cidrBlock(String.format(cidrTemplate, start.get()))
      .availabilityZone(z)
      .build());
  start.addAndGet(increment);
  return subnet;
}).collect(Collectors.toList());

然后我尝试使用 SubnetSelection:

final IVpc vpc = Vpc.fromLookup(this, "default-vpc", VpcLookupOptions.builder().isDefault(true).build());
final SubnetSelection vpcSubnets = SubnetSelection.builder().subnetType(SubnetType.PRIVATE).build();

并得到了例外:

An exception occured while executing the Java class. There are no 'Private' subnet groups in this VPC. Available types: Public

[错误] 错误:此 VPC 中没有“私有”子网组。可用类型:公共

它如何确定可供选择的 VPC?

为什么我之前创建的所有 PrivateSubnets 都被“营销”为公共并且无法选择?

标签: javaamazon-vpcaws-cdk

解决方案


fromLookup 方法用于在您的账户中查找现有(已部署)VPC,当您在 CDK 代码中定义 VPC 时,您需要使用刚刚创建的对象。

见文档

static fromLookup(scope, id, options)通过查询此堆栈部署到的 AWS 环境来导入现有 VPC。

此功能仅需要用于使用未在您的 CDK 应用程序中定义的 VPC。如果您希望在堆栈之间共享 VPC,则可以在堆栈之间传递 Vpc 对象并正常使用它。


推荐阅读