2016-04-20 8 views
2

クラウドフォーメーションテンプレートにセキュリティグループの受信規則を作成したいとします。私は多くの異なるIPから3306ポートを開けたいと思っています。AWS CloudFormationテンプレート:多くのCidrIpをリストとして追加できますか?

"SecurityGroupIngress": [ 
      { 
       "IpProtocol": "tcp", 
       "CidrIp": "0.0.0.0/0", 
       "FromPort": "3306", 
       "ToPort": "3306" 
      } 

私はドキュメントがString CidrIp型として言うが、同じブロックを何度も書き込まないようにするために、この["100.10.77.66/32", "100.10.66.66/32" , "101.10.77.66/32"]ような何かをすることが可能であることを知っていますか?

答えて

4

恐れ入りましたが、ドキュメントでは、文字列を受け入れ、リストのみを受け付けるため、複数のブロックが必要です。

ウェブコンソール内に入力ルールが作成されるのと同じように考えると、各CIDRに対して新しいルールが1つあります。

4

は残念ながら、CloudFormationのIntrinsic Functionsを通じて利用可能な反復はありません、とあなたはAWS::EC2::SecurityGroupIngressリソース自体を指摘したようにのみ、そのCidrIpプロパティのための単一のStringを受け入れます。

代わりに、表現力の強化が必要な場合に、プリプロセッサを使用してCloudFormationテンプレートJSONをコンパイルするための中間形式を選択することをお勧めします。 troposphereのようなフル機能のライブラリを使用することもできますが、ユースケースやプログラミング言語/ライブラリの設定に合わせて独自の基本的な前処理レイヤーをコード化するだけでも簡単です。

私の現在の選択肢は、YAMLと組み込みのRuby(ERB)の組み合わせです。これは主に私がすでによく知っているからです。

SecurityGroupIngress: 
<% ["100.10.77.66/32", "100.10.66.66/32" , "101.10.77.66/32"].each do |cidr| -%> 
- IpProtocol: tcp 
    CidrIp: <%=cidr%> 
    FromPort: 3306 
    ToPort: 3306 
<% end -%> 

ここでは、最小限のプリプロセッサスクリプトだ、process_template.rbruby ./process_template.rb template.yml.erbを実行

require 'erb' 
require 'yaml' 
require 'json' 
puts JSON.pretty_generate(YAML.load(ERB.new(ARGF.read, nil, '-').result)) 

生成します。ここでは、上記の例のJSONを生成する例template.yml.erbファイルです

{ 
    "SecurityGroupIngress": [ 
    { 
     "IpProtocol": "tcp", 
     "CidrIp": "100.10.77.66/32", 
     "FromPort": 3306, 
     "ToPort": 3306 
    }, 
    { 
     "IpProtocol": "tcp", 
     "CidrIp": "100.10.66.66/32", 
     "FromPort": 3306, 
     "ToPort": 3306 
    }, 
    { 
     "IpProtocol": "tcp", 
     "CidrIp": "101.10.77.66/32", 
     "FromPort": 3306, 
     "ToPort": 3306 
    } 
    ] 
} 
関連する問題