Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在CloudFormation模板中以编程方式生成子网CIDR块(或将整数添加到一起)_Amazon Web Services_Amazon Cloudformation_Cidr_Amazon Vpc - Fatal编程技术网

Amazon web services 在CloudFormation模板中以编程方式生成子网CIDR块(或将整数添加到一起)

Amazon web services 在CloudFormation模板中以编程方式生成子网CIDR块(或将整数添加到一起),amazon-web-services,amazon-cloudformation,cidr,amazon-vpc,Amazon Web Services,Amazon Cloudformation,Cidr,Amazon Vpc,我们正在调整我们的应用程序云信息模板以利用VPC。在这个模板中,我们需要以编程方式生成用于VPC子网的CIDR块,以确保它们不会在CloudFormation堆栈之间发生冲突 我最初的计划是通过将字符串连接在一起来生成CIDR,例如: "ProxyLoadBalancerSubnetA" : { "Type" : "AWS::EC2::Subnet", "Properties" : { "VpcId" : { "Ref" : "Vpc" }, "AvailabilityZ

我们正在调整我们的应用程序云信息模板以利用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" ] ] }
  }
},
    "CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, { "Fn::Sum", [ { "Ref" : "VpcCidrStart" }, 3 ] }, "0/24 ] ] }
但是,进一步考虑后,我们需要使用一个VPC,而不是为每个堆栈使用一个VPC

AWS限制VPC最多使用
/16
CIDR块(我们要求提高此限制,但显然不可能)。这意味着我们不可能再使用这种连接方法,因为我们的每个堆栈都需要总共跨越255个地址的子网

我想动态生成CIDR块,而不是将它们定义为CloudFormation模板的参数

我的一个想法是,每个堆栈都有一个“基本整数”,并为每个子网的CIDR块添加该整数

例如:

"ProxyLoadBalancerSubnetA" : {
  "Type" : "AWS::EC2::Subnet",
  "Properties" : {
    "VpcId" : { "Ref" : "Vpc" },
    "AvailabilityZone" : "eu-west-1a",
    "CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, "0.0/24" ] ] }
  }
},
    "CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, { "Fn::Sum", [ { "Ref" : "VpcCidrStart" }, 3 ] }, "0/24 ] ] }
其中,
vpccidrst
是一个整数,用于设置脚本中第三个CIDR八位字节应从中开始的值,
3
是子网编号


显然,
Fn::Sum
内在函数并不存在,所以我想知道是否有人有办法在VPC中添加整数(这似乎是不可能的,因为CloudFormation是面向字符串的),一般来说,这是一个更好的解决方案。

对于这类问题,我的解决方案是使用合法的编程语言将模板编译成CloudFormation JSON文档。我使用了PHP5.4、Twig和Symfony控制台,但没有使用YMMV


基本上,您可以提前用编程语言进行计算,然后在编写JSON文档时使用这些数据。

我遇到了类似的情况。我想控制模板中的所有内容,而不使用脚本生成模板。我的输入范围也和你的情况一样有限。我最后进行了一次可怕的黑客攻击。我有点不好意思把它贴在这里,但如果它能帮助更多的人,它可能是值得的

有一个映射表,它将为您计算并为所有可能的输入定义它

"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" ] }

我已经开始开发一个“Stack Manager”应用程序来处理登台和生产环境需要稍微不同的设置的情况,并在夜间自动关闭非生产环境的灯光,所以我认为这个解决方案对我们来说是有意义的。遗憾的是,CloudFormation天生就缺少这些特性。如果你还没有,那么最好描述一下你的用例,并在官方网站上提出你的特性请求。我知道开发团队在那里处理支持。我知道这已经有一段时间了,但我确实实现了这一点,最近也实现了。AWS最近确实为CloudFormation添加了基本的逻辑和数学,但这相当麻烦。