amazon-web-services - 在 CloudFormation 模板中以编程方式生成子网 CIDR block (或将整数相加)

标签 amazon-web-services aws-cloudformation cidr amazon-vpc

我们正在调整我们的应用程序 CloudFormation 模板以利用 VPC。在此模板中,我们需要以编程方式生成用于 VPC 子网的 CIDR block ,以确保它们在 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 block (我们已要求提高此限制,但这显然是不可能的)。这意味着我们不再可能使用这种串联方法,因为我们的每个堆栈都需要跨越总共超过 255 个地址的子网。

我想即时生成 CIDR block ,而不必将它们定义为 CloudFormation 模板的参数,

我的一个想法是每个堆栈都有一个“基本整数”并添加到每个子网的 CIDR block 。

例如:

    "CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, { "Fn::Sum", [ { "Ref" : "VpcCidrStart" }, 3 ] }, "0/24 ] ] }

其中 VpcCidrStart 是一个整数,用于设置第三个 CIDR 八位字节应从脚本内开始的值,3 是子网号。

显然,Fn::Sum 内部函数不存在,所以我想知道是否有人有在 VPC 中添加整数的解决方案(这似乎是不可能的事情) ,因为 CloudFormation 是面向字符串的),或者是解决此难题的更好解决方案。

最佳答案

我也遇到过类似的情况。我想控制模板中的所有内容,而不使用某些脚本生成模板。我的输入范围也像你的情况一样受到限制。我最终进行了一次可怕的黑客攻击。我有点羞于将其发布在这里,但如果它能帮助更多人,那可能是值得的。

有一个映射表,可以为您进行数学计算并为所有可能的输入定义它

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

关于amazon-web-services - 在 CloudFormation 模板中以编程方式生成子网 CIDR block (或将整数相加),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17859911/

相关文章:

amazon-web-services - 从 DynamoDB 表创建数据湖

php - 如何使用 aws php sdk 将文件夹与 Amazon S3 同步?

amazon-ec2 - AWS : Start EC2 Instance with Cloudformation and encrypt BlockDevices with specific KMS Key

api - IP 到 CIDR/IP 范围

javascript - 当使用 aws amplify on react 调用 api 网关时,我该如何获取状态码?

mysql - 使用 Slick 从 Scala 连接到 AWS MySQL 数据库

amazon-web-services - 云形成 : Deleting an entire nested stack

amazon-web-services - Cloudformation 条件模板URL

asp.net-mvc - ipSecurity - 如何添加 IP 地址范围

amazon-web-services - CIDR block 10.0.96.32/18 与子网中预先存在的 CIDR block 10.0.96.0/28 重叠