VPC を利用するために、アプリケーションの CloudFormation テンプレートを適応させています。このテンプレート内で、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 テンプレートのパラメーターとして定義するのではなく、オンザフライで生成したいと考えています。
私が持っていた 1 つのアイデアは、各スタックが「基本整数」を持ち、それに各サブネットの CIDR ブロックを追加することでした。
例えば:
"CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, { "Fn::Sum", [ { "Ref" : "VpcCidrStart" }, 3 ] }, "0/24 ] ] }
VpcCidrStart
は、スクリプト内で 3 番目の CIDR オクテットを開始する値を設定する整数で、3
サブネット番号です。
明らかにFn::Sum
組み込み関数は存在しないので、誰かが VPC に整数を追加する解決策を持っているかどうか (CloudFormation は文字列指向であるため、それは不可能であるように思われます)、またはこれに対するより良い解決策があるかどうかを知りたいと思いました。一般的な難問。