2017-05-17 28 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