CloudFormation - 可以嵌套映射吗?

时间:2017-05-17 14:39:03

标签: amazon-web-services amazon-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"
                }
            }
        }
    }
}

当我尝试做这样的事情时,我收到以下错误:

  

模板格式错误:每个Mappings属性必须是String或List。

如果嵌套映射不可能,那么在CFT中存储需要两个参数选择的值的最佳方法是什么(例如依赖于BOTH Region和environment的值)?

3 个答案:

答案 0 :(得分:5)

我最终这样做了:

"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部分有很多非常奇怪的任意规则,令我惊讶的是它不是更灵活,但你有它。

答案 1 :(得分:1)

面对同样的问题。在Fn::FindInMap documentation

中找到以下内容

内部函数Fn :: FindInMap返回对应的值 到在“映射”中声明的两级映射中的键 部分。

所以基本上:

以下将起作用:

Mappings:
    map_name:
        level_1_key:
            level_2_key:
                "value"

但是3个级别不会。

Mappings:
    map_name:
        level_1_key:
            level_2_key:
                level_3_key:
                    "value"

答案 2 :(得分: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" }
    ]
}