10

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 で最大/16CIDR ブロックを使用するように制限しています (この制限の引き上げを求めましたが、明らかに不可能です)。これは、スタックごとに合計 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 は文字列指向であるため、それは不可能であるように思われます)、またはこれに対するより良い解決策があるかどうかを知りたいと思いました。一般的な難問。

4

2 に答える 2

6

私は同様の状況に直面しました。スクリプトを使用してテンプレートを生成せずに、テンプレートからすべてを制御したかったのです。私の入力範囲もあなたの場合のように制限されています。私は恐ろしい恐ろしいハックを入れてしまいました。ここに投稿するのはちょっと恥ずかしいですが、もう一人の人の助けになるなら、それだけの価値があるかもしれません.

あなたのために計算を行い、可能なすべての入力に対してそれを定義するマッピングテーブルを用意してください

"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" ] }
于 2013-09-17T14:01:05.150 に答える
2

この種の問題に対する私の解決策は、正規のプログラミング言語を使用して、テンプレートを CloudFormation JSON ドキュメントにコンパイルすることでした。PHP 5.4、Twig および Symfony コンソールを使用しましたが、YMMV を使用しました。

基本的に、事前にプログラミング言語で計算を行い、そのデータを使用して JSON ドキュメントを作成します。

于 2013-07-26T03:18:06.013 に答える