使用 AWS CDK 将自定义弹性 IP 关联到 NAT 网关
associate custom Elastic IP to NAT Gateway with AWS CDK
经过几个小时的努力,这是我的问题。目前我用CDK创建VPC的形式最简单:
let vpc = new Vpc(this, "myVpc", {maxAzs: 1});
这为我提供了一个 public 子网和一个包含所有网关(互联网和 NAT)的私有子网。我的 NAT 网关从 AWS 池中获得了一个 public EIP。当然,当我销毁堆栈并重新创建它时,我将从 AWS 获得一个新的 EIP,但是 这个 我不想要。
我想要的是:
在我的 CDK 项目之外创建弹性 IP(通过 CLI 或 AWS 控制台手动)并将其附加到我的 NAT GW,这样即使在破坏堆栈之后,我也可以将我的(外部)EIP 重新附加到“新”NAT GW .
所以必须有一种方法 不是 让 AWS::EC2::NatGateway 由 VPC 自动创建,而是手动使用正确的 EIP 关联,然后将其附加到 VPC / Public 子网。几乎与我可以显式定义子网并将它们与 VPC 相关联而不是 CDK 构造魔术的方式相同。
最后post可以参考这里https://github.com/aws/aws-cdk/issues/4067。
您可以定义 EIP 分配,然后在部署 CDK 时将其分配到 Nat Gateway。
当然要先手动创建EIP
对于 Java CDK,您可以使用 natGatewayProvider(NatProvider.gateway(NatGatewayProps.builder().eipAllocationIds(Collections.singletonList("eipalloc-id")).build()))
使用手动配置的 EIP 为 NAT 创建 VPC 的完整示例:
Vpc.Builder.create(this, "vpc")
.natGateways(1)
.natGatewayProvider(NatProvider.gateway(NatGatewayProps.builder().eipAllocationIds(Collections.singletonList("eipalloc-id")).build()))
.maxAzs(3)
.subnetConfiguration(
Arrays.asList(
SubnetConfiguration.builder()
.subnetType(SubnetType.PRIVATE)
.cidrMask(24)
.name("mc")
.build(),
SubnetConfiguration.builder()
.subnetType(SubnetType.PUBLIC)
.cidrMask(24)
.name("Ingress")
.build(),
SubnetConfiguration.builder()
.subnetType(SubnetType.ISOLATED)
.cidrMask(24)
.name("app")
.build()
)
)
.cidr("10.0.0.0/16").build();
对于其他语言,请查看 https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ec2.Vpc.html#natgatewayprovider
经过几个小时的努力,这是我的问题。目前我用CDK创建VPC的形式最简单:
let vpc = new Vpc(this, "myVpc", {maxAzs: 1});
这为我提供了一个 public 子网和一个包含所有网关(互联网和 NAT)的私有子网。我的 NAT 网关从 AWS 池中获得了一个 public EIP。当然,当我销毁堆栈并重新创建它时,我将从 AWS 获得一个新的 EIP,但是 这个 我不想要。
我想要的是: 在我的 CDK 项目之外创建弹性 IP(通过 CLI 或 AWS 控制台手动)并将其附加到我的 NAT GW,这样即使在破坏堆栈之后,我也可以将我的(外部)EIP 重新附加到“新”NAT GW .
所以必须有一种方法 不是 让 AWS::EC2::NatGateway 由 VPC 自动创建,而是手动使用正确的 EIP 关联,然后将其附加到 VPC / Public 子网。几乎与我可以显式定义子网并将它们与 VPC 相关联而不是 CDK 构造魔术的方式相同。
最后post可以参考这里https://github.com/aws/aws-cdk/issues/4067。
您可以定义 EIP 分配,然后在部署 CDK 时将其分配到 Nat Gateway。
当然要先手动创建EIP
对于 Java CDK,您可以使用 natGatewayProvider(NatProvider.gateway(NatGatewayProps.builder().eipAllocationIds(Collections.singletonList("eipalloc-id")).build()))
使用手动配置的 EIP 为 NAT 创建 VPC 的完整示例:
Vpc.Builder.create(this, "vpc")
.natGateways(1)
.natGatewayProvider(NatProvider.gateway(NatGatewayProps.builder().eipAllocationIds(Collections.singletonList("eipalloc-id")).build()))
.maxAzs(3)
.subnetConfiguration(
Arrays.asList(
SubnetConfiguration.builder()
.subnetType(SubnetType.PRIVATE)
.cidrMask(24)
.name("mc")
.build(),
SubnetConfiguration.builder()
.subnetType(SubnetType.PUBLIC)
.cidrMask(24)
.name("Ingress")
.build(),
SubnetConfiguration.builder()
.subnetType(SubnetType.ISOLATED)
.cidrMask(24)
.name("app")
.build()
)
)
.cidr("10.0.0.0/16").build();
对于其他语言,请查看 https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ec2.Vpc.html#natgatewayprovider