假设我有一个子CF模板,它采用默认值的参数:
Parameters:
Name:
Type: String
Default: whatever
InstanceSize:
Type: String
Default: m3.medium
InstanceCount:
Type: Number
Default: 5
我还有一个采用“EnvType”参数的主CF模板。 “EnvType”的值应确定必须将Name,InstanceSize和InstanceCount传递给子堆栈。我只想在此映射中指定非默认值。因此,如果“EnvType”设置为“Test”,则InstanceSize应为“t2.small”,InstanceCount应为2.如果“EnvType”设置为“Production”,则应使用子堆栈的InstanceSize和InstanceCount的默认值。我尝试以下方法:
Mappings:
ParamsByEnvType:
Test:
Name: staging
InstanceSize: t2.small
InstanceCount: 2
Production:
Name: prod
Staging:
Name: staging
...
Resources:
MyChildStack:
Type: "AWS::CloudFormation::Stack"
Properties:
Parameters:
Name: !FindInMap [ParamsByEnvType, !Ref EnvType, Name]
InstanceSize: !FindInMap [ParamsByEnvType, !Ref EnvType, InstanceSize]
InstanceCount: !FindInMap [ParamsByEnvType, !Ref EnvType, InstanceCount]
...
当使用EnvType =“Production”运行模板时,“无法获取EnvType :: Production :: InstanceSize 的映射”模板验证错误失败。这是预期的:我没有“ParamsByEnvType”映射中的顶级“生产”键的第二级“InstanceSize”键。
所以我的问题是:是否有一个构造允许我只在“ParamsByEnvType”映射中保留非默认值(就像我现在这样),并且只有在这个映射中定义它们的值时才将参数传递给子堆栈?
我尝试设置这样的条件:
Conditions:
DefaultInstanceSize: !Equals [!FindInMap [ParamsByEnvType, !Ref EnvType, InstanceSize], !Ref "AWS::NoValue"]
如果失败并且“每个Fn :: Equals对象需要2个字符串参数列表”错误。
我也试过这个条件:
Conditions:
DefaultInstanceSize: !Equals [!FindInMap [ParamsByEnvType, !Ref EnvType, InstanceSize], ""]
失败并显示“无法获取ParamsByEnvType :: Production :: InstanceSize 的映射”错误。