7

我們正在調整我們的應用程序CloudFormation模板以利用VPC。在此模板中,我們需要以編程方式生成用於VPC子網的CIDR塊,以確保它們不會在CloudFormation堆棧之間發生衝突。以編程方式在CloudFormation模板中生成子網CIDR塊(或將整數加在一起)

我最初的計劃一直是產生通過連接字符串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限制VPC使用CIDR塊的最大數量爲/16(我們已要求提高此限制,但顯然這是不可能的)。這意味着我們不再可能使用這種連接方法,因爲我們的每個堆棧都需要總共跨度超過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 Console,但使用了YMMV。基本上,你在編程語言中提前做數學計算,然後在寫出你的JSON文檔時使用這些數據。

+0

我已經開始工作「堆棧管理器」應用程序可以處理臨時和生產環境需要稍微不同的設置的情況,以及在晚上自動化非生產環境的「熄燈」 - 所以我認爲這個解決方案對我們來說是有意義的。令人遺憾的是CloudFormation本身雖然缺乏這些功能。 – roberthl

+0

如果你還沒有,那麼在官方[AWS CloudFormation論壇](https://forums.aws.amazon.com/forum)上描述你的用例並提出你的特性請求可能是個好主意。 JSPA?forumID = 92)。我知道開發團隊在那裏處理支持。 –

+0

我知道這已經有一段時間了,但我確實實現了這一點,並且最近[在GitHub上發佈了它](https://github.com/royaloperahouse/stack-manager)。 AWS最近爲CloudFormation添加了基本的邏輯和數學,但它相當麻煩。 – roberthl

5

我面臨類似的情況。我想控制模板中的所有內容,而不使用腳本生成模板。我的輸入範圍也受限於你的情況。我結束了一個可怕的可怕黑客攻擊。我有些慚愧地把它發佈在這裏,但如果它幫助更多的人,這可能是值得的。

有一個映射表,這將做數學題,你和它定義爲所有可能的輸入

"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" ] } 
相關問題