使用aws-cdk创建VPC时有没有办法不分配弹性IP(EIP)

Is there a way to not allocate an elastic IP (EIP) when creating a VPC using aws-cdk

我正在使用以下代码创建将由另一个堆栈导入并用于专用 EFS VPC 的子网。如果我不创建 PUBLIC 子网,我会在创建时遇到错误。然而副作用是这段代码分配了一个弹性 IP 地址,我不想分配一个,它们是宝贵的资源。

如何去掉弹性IP地址? None 的方法允许您获得任何具有 EIP 属性或方法的东西:

const fileSystemVpc = new ec2.Vpc(this, 'vpcForEfs', {
  subnetConfiguration: [
    { 
      cidrMask: 20,
      name: 'nfsisolated',
      subnetType: ec2.SubnetType.ISOLATED,
    },
    { 
      cidrMask: 20,
      name: 'nfsprivate',
      subnetType: ec2.SubnetType.PRIVATE,
    },
    { 
      cidrMask: 20,
      name: 'nfspublic',
      subnetType: ec2.SubnetType.PUBLIC,
    },
  ],
});

如果我注释掉 PUBLIC 部分,我会在创建时收到以下错误:

If you configure PRIVATE subnets in 'subnetConfiguration', you must also
configure PUBLIC subnets to put the NAT gateways into (got 
[{"cidrMask":20,"name":"nfsisolated","subnetType":"Isolated"},
{"cidrMask":20,"name":"nfsprivate","subnetType":"Private"}].

没有解决问题但类似的相关问题:

https://github.com/aws/aws-cdk/issues/1305 https://github.com/aws/aws-cdk/issues/3704

这是添加该检查的提交:https://github.com/aws/aws-cdk/commit/9a96c37b225b135c9afbf523ed3fbc67cba5ca50

基本上,如果 CDK 没有用该消息阻止您,它会在 CloudFormation 尝试部署堆栈时失败。

这里还有来自 AWS 的更多信息:https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html

你可以看到其中引用的票证的描述和 AWS 文档,如果你想放在 PRIVATE 子网中的任何内容不需要互联网访问,你应该使用 ISOLATED 代替。这是因为 PRIVATE 子网需要 NatGateway,并且 NatGateway 需要存在于具有弹性 IP 的 PUBLIC 子网中。同样,如果您不需要从您的 PRIVATE 子网出站访问互联网,只需使用 ISOLATED