CloudFormation——可能有嵌套的映射?
CloudFormation -- possible to have nested Mappings?
是否可以在 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 中存储需要两个参数的值的最佳方法是什么 select(例如取决于区域和环境的值)?
像这样:
"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" }
]
}
我最后是这样的:
"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"
}
}
}
这里的重点是对象在"mappings"和键之间交替。所以在这种情况下,"dev"是一个映射,"us-east-1"是一个键,"ImageId"是一个映射,"something"是一个键。映射名称不能有非字母数字字符,因此Region名称不能是Mappings。因此,使用环境作为第一个参数,使用区域名称作为第二个参数是强制性的。
在我看来,CloudFormation 的映射部分有很多非常奇怪的任意规则,令我惊讶的是它并不更灵活,但你已经知道了。
遇到了同样的问题。在 Fn::FindInMap documentation
中找到以下内容
The intrinsic function Fn::FindInMap returns the value corresponding
to keys in a two-level map that is declared in the Mappings
section.
所以基本上:
以下将起作用:
Mappings:
map_name:
level_1_key:
level_2_key:
"value"
但3级不会。
Mappings:
map_name:
level_1_key:
level_2_key:
level_3_key:
"value"
是否可以在 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 中存储需要两个参数的值的最佳方法是什么 select(例如取决于区域和环境的值)?
像这样:
"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" }
]
}
我最后是这样的:
"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"
}
}
}
这里的重点是对象在"mappings"和键之间交替。所以在这种情况下,"dev"是一个映射,"us-east-1"是一个键,"ImageId"是一个映射,"something"是一个键。映射名称不能有非字母数字字符,因此Region名称不能是Mappings。因此,使用环境作为第一个参数,使用区域名称作为第二个参数是强制性的。
在我看来,CloudFormation 的映射部分有很多非常奇怪的任意规则,令我惊讶的是它并不更灵活,但你已经知道了。
遇到了同样的问题。在 Fn::FindInMap documentation
中找到以下内容The intrinsic function Fn::FindInMap returns the value corresponding to keys in a two-level map that is declared in the Mappings section.
所以基本上:
以下将起作用:
Mappings:
map_name:
level_1_key:
level_2_key:
"value"
但3级不会。
Mappings:
map_name:
level_1_key:
level_2_key:
level_3_key:
"value"