Создание блоков cidr подсети программно в шаблонах CloudFormation (или добавление целых чисел вместе)

мы адаптируем наш шаблон CloudFormation приложений, чтобы использовать VPC. В этом шаблоне нам нужно программно генерировать блоки CIDR, используемые для наших подсетей VPC, чтобы гарантировать, что они не конфликтуют между стеками CloudFormation.

мой первоначальный план был создать CIDRs конкатенации строк, например:

"ProxyLoadBalancerSubnetA" : {
  "Type" : "AWS::EC2::Subnet",
  "Properties" : {
    "VpcId" : { "Ref" : "Vpc" },
    "AvailabilityZone" : "eu-west-1a",
    "CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, "0.0/24" ] ] }
  }
},

при дальнейшем рассмотрении, однако, нам нужно использовать один VPC, а не иметь VPC для каждого наших стеков.

AWS ограничить VPCs использовать максимум /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 ответов


моим решением для таких проблем было использовать законный язык программирования для компиляции шаблона в документ CloudFormation JSON. Я использовал PHP 5.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"},
    }   
},  

вы можете ссылаться на вычисленное значение as

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