AWS CloudFormation:映射中只有非默认参数值

时间:2017-03-08 17:18:25

标签: amazon-web-services amazon-cloudformation

假设我有一个子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 的映射”错误。

0 个答案:

没有答案