CDK: 在部署了私有子网组之后,此 VPC 中没有“私有”子网组。

4

我已经在默认的VPC中部署了私有子网(Java):

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?

为什么我之前创建的所有私有子网现在被“标记”为公共并且无法选择?

2个回答

4

在我的情况下,我使用的是CDK自身创建的仅包含ISOLATED子网的VPC。

const vpc = new ec2.Vpc(this, 'private_vpc', {
    subnetConfiguration: [
        {
            name: 'application-subnet',
            subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
        }
    ]
});

当我尝试为ECS创建一个StepFunction任务时,出现了这个错误。

    const task = new sfnTasks.EcsRunTask(this, 'my_task', {
        integrationPattern: sfn.IntegrationPattern.WAIT_FOR_TASK_TOKEN,
        containerOverrides: [{
                containerDefinition: myContainerDefinition,
        }],
        cluster,mytextExtractionTaskDefinition,
        launchTarget: new sfnTasks.EcsFargateLaunchTarget(),
        securityGroups: [vpcSecurityGroup],
    });

修复方法是明确指定子网。
    const subnets = vpc.selectSubnets({
        subnetType: ec2.SubnetType.PRIVATE_ISOLATED
    }).subnets;

    const task = new sfnTasks.EcsRunTask(this, 'my_task', {
        integrationPattern: sfn.IntegrationPattern.WAIT_FOR_TASK_TOKEN,
        containerOverrides: [{
                containerDefinition: myContainerDefinition,
        }],
        cluster,mytextExtractionTaskDefinition,
        launchTarget: new sfnTasks.EcsFargateLaunchTarget(),
        subnets: subnets, // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ADDED
        securityGroups: [vpcSecurityGroup],
    });

1

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

请参阅文档:

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

仅需在CDK应用程序中使用未定义的VPC时才需要使用此函数。如果您想要在堆栈之间共享VPC,则可以在堆栈之间传递Vpc对象并像往常一样使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接