在CloudFormation模板中以编程方式生成子网CIDR块(或将整数相加)

11

我们正在调整应用程序的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 ] ] }

其中VpcCidrStart是一个整数,用于在脚本中设置第三个CIDR八位组应从哪里开始,而3是子网号。

显然Fn::Sum内置函数并不存在,因此我想知道是否有人有解决VPC中整数相加的方案(似乎这不应该是可能的,因为CloudFormation是基于字符串的),或者一般情况下更好的解决方案。

2个回答

7
我遇到了类似的情况。我想通过模板来控制所有内容,而不是使用某些脚本生成模板。我的输入范围也像你的情况一样有限。最终,我采用了一个非常可怕的hack方法。我有点羞于在这里发布它,但如果它能帮助更多的人,那可能是值得的。
创建一个映射表,它将为您执行数学计算并定义所有可能的输入。
"Mappings" : { 
    "HorribleHackForSubtraction" : { 
        "1" : {"SubtractOne" : "0"},
        "2" : {"SubtractOne" : "1"},
        "3" : {"SubtractOne" : "2"},
        "4" : {"SubtractOne" : "3"},
        "5" : {"SubtractOne" : "4"},
        "6" : {"SubtractOne" : "5"},
        "7" : {"SubtractOne" : "6"},
        "8" : {"SubtractOne" : "7"},
        "9" : {"SubtractOne" : "8"},
        "10" : {"SubtractOne" : "9"},
        "11" : {"SubtractOne" : "10"},
        "12" : {"SubtractOne" : "11"},
        "13" : {"SubtractOne" : "12"},
        "14" : {"SubtractOne" : "13"},
        "15" : {"SubtractOne" : "14"},
        "16" : {"SubtractOne" : "15"},
    }   
},  

您可以将计算值称为

{ "Fn::FindInMap" : [ "HorribleHackForSubtraction", { "Ref" : "MyInputParam"}, "SubtractOne" ] }

3
我的解决方案是使用一种合法的编程语言将模板编译成CloudFormation JSON文档。我使用了PHP 5.4,Twig和Symfony Console,但可能因人而异。
基本上,您可以在编程语言中提前计算好数据,然后将该数据用于编写JSON文档。

我已经开始开发一个“堆栈管理器”应用程序,以处理分阶段和生产环境需要稍微不同的设置,并自动在夜间关闭非生产环境 - 所以我认为这个解决方案对我们很有意义。遗憾的是,CloudFormation本身缺乏这些功能。 - user2610892
如果您还没有这样做,最好在官方的AWS CloudFormation论坛上描述您的用例并提出功能请求。我知道开发团队会在那里处理支持。 - Ryan Parman
我知道已经有一段时间了,但我已经实现了这个功能,并最近在GitHub上发布了它(https://github.com/royaloperahouse/stack-manager)。AWS最近确实向CloudFormation添加了基本逻辑和数学功能,但使用起来相当繁琐。 - user2610892

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