我们正在调整我们的应用程序 CloudFormation 模板以使用 VPC。在此模板中,我们需要以编程方式生成用于我们的 VPC 子网的 CIDR 块,以确保它们不会在 CloudFormation 堆栈之间发生冲突。
我最初的计划是通过将字符串连接在一起来生成 CIDR,例如:
"ProxyLoadBalancerSubnetA" : {
"Type" : "AWS::EC2::Subnet",
"Properties" : {
"VpcId" : { "Ref" : "Vpc" },
"AvailabilityZone" : "eu-west-1a",
"CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, "0.0/24" ] ] }
}
},
然而,经过进一步考虑,我们需要使用单个 VPC,而不是为每个堆栈使用一个 VPC。
AWS 将 VPC 限制为最多使用/16
CIDR 块(我们已要求提高此限制,但显然不可能)。这意味着我们不再可能使用这种连接方法,因为我们的每个堆栈都需要总共跨越 255 个地址的子网。
我想即时生成 CIDR 块,而不必将它们定义为 CloudFormation 模板的参数,
我的一个想法是每个堆栈都有一个“基本整数”,并为每个子网的 CIDR 块添加它。
例如:
"CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, { "Fn::Sum", [ { "Ref" : "VpcCidrStart" }, 3 ] }, "0/24 ] ] }
whereVpcCidrStart
是一个整数,它设置脚本中第三个 CIDR 八位字节应从其开始的值,并且3
是子网号。
显然,Fn::Sum
内在函数不存在,所以我想知道是否有人有在 VPC 中添加整数的解决方案(这似乎是不可能的,因为 CloudFormation 是面向字符串的),或者对此有更好的解决方案一般的难题。