2017-05-17 59 views
1

是否有可能在CloudFormation中嵌套映射,如下例所示?CloudFormation - 可能有嵌套映射?

"Mappings" : 
{ 
    "Regions" : 
    { 
     "us-east-1" : 
     { 
      "Environments" : 
      { 
       "dev" : 
       { 
        "ImageId" : "something", 
        "Subnet" : "something" 
       }, 
       "qa" : 
       { 
        "ImageId" : "something", 
        "Subnet" : "something" 
       } 
      } 
     }, 
     "us-west-2" : 
     { 
      "Environments" : 
      { 
       "dev" : 
       { 
        "ImageId" : "something", 
        "Subnet" : "something" 
       }, 
       "qa" : 
       { 
        "ImageId" : "something", 
        "Subnet" : "something" 
       } 
      } 
     } 
    } 
} 

當我試圖做這樣的事情,我得到以下錯誤:

Template format error: Every Mappings attribute must be a String or a List.

如果嵌套映射是不可能的,那麼什麼是存儲在一個CFT值的最佳方式需要兩個參數來選擇(例如取決於BOTH區域和環境的值)?

回答

0

事情是這樣的:

"ImageMap" : { 
    "us-east-1" : { "dev" : "ami-11111111", "qa" : "ami-22222222" }, 
    "us-west-1" : { "dev" : "ami-33333333", "qa" : "ami-44444444" } 
} 

,然後才能訪問這些值:

"Value" : { 
    "Fn::FindInMap" : [ 
     "ImageMap", { "Ref" : "AWS::Region" }, { "Ref" : "EnvironmentType" } 
    ] 
} 
+0

但是如果我想要在同一個映射下列出多個值,該怎麼辦?有沒有辦法避免爲每個值單獨映射?我編輯了OP進行澄清。 – jcgrowley

+0

未驗證此內容,但您可以按如下方式對它們進行設置:「us-east-1-dev」:{「imageid」:「abc」,「subnet」:「xyz」}然後使用Fn ::加入區域ref和環境ref,創建類似us-east-1-dev或us-west-2-qa的東西,這將形成Fn :: FindInMap的第一維,其中「imagedid」或「subnet」爲第二維。不理想,但我不相信CF在映射中支持兩個以上的維度。 – jarmod

+0

這肯定會起作用,並且很高興知道有一種方法可以獲得任意數量的參數,但它比我所希望的更有效率。謝謝! – jcgrowley

1

最後我做這樣的:

"Mappings" : 
{ 
    "dev" : 
    { 
     "us-east-1" : 
     { 
      "ImageId" : "something", 
      "Subnet" : "something" 
     }, 
     "us-west-2" : 
     { 
      "ImageId" : "something", 
      "Subnet" : "something" 
     } 
    }, 
    "qa" : 
    { 
     "us-east-1" : 
     { 
      "ImageId" : "something", 
      "Subnet" : "something" 
     }, 
     "us-west-2" : 
     { 
      "ImageId" : "something", 
      "Subnet" : "something" 
     } 
    } 
} 

這裏最重要的一點是,在這種情況下,「dev」是一個映射,「us-east-1」是一個鍵,「ImageId」是一種映射,「某物」是一個關鍵。映射名稱不能包含非字母數字字符,因此區域名稱不能爲映射。因此,將環境用作第一個參數並將區域名稱用作第二個參數是強制性的。

在我看來,CloudFormation的Mappings部分有很多非常奇怪的任意規則,它讓我感到驚訝,它不是更靈活,但是你擁有它。

+0

那麼如何獲得實際價值? – change

+0

是不是必須是兩個關卡? – change

+1

它將以{「Fn:FindInMap」:[「dev」,{「Ref」:「AWS :: Region」},「ImageId」]}的形式訪問 – jcgrowley