AWS CloudFormation模板中能否对引用的参数值执行加减运算?
结论
你想要的直接在Parameter的Default字段通过内置函数引用其他参数做计算的需求,原生CloudFormation不支持。
原因是CloudFormation的参数解析阶段优先级最高,参数的默认值必须是静态字面量,这时候其他参数的取值还未完成校验、内置函数也还没到执行时机,因此无法在Default字段中使用!Ref、!Add这类动态逻辑。
替代方案
场景1:不需要让使用者自定义MaxPreparedCapacity值
不用单独定义MaxPreparedCapacity为Parameter,直接在你需要用到该值的资源属性中内联计算逻辑即可:
# 示例:在Auto Scaling组配置中直接计算使用 Resources: MyAutoScalingGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: DesiredCapacity: !Ref DesiredCapacity MaxPreparedCapacity: !Add - !Ref DesiredCapacity - 2 # 其余属性省略
场景2:需要允许使用者自定义MaxPreparedCapacity,同时保留默认等于DesiredCapacity+2的逻辑
可以结合可选参数+模板规则+条件判断实现,需要先开启AWS::LanguageExtensions扩展支持规则校验:
# 开启语言扩展支持 Transform: AWS::LanguageExtensions Parameters: DesiredCapacity: Type: Number Default: 2 MaxPreparedCapacity: Type: Number Description: 可选参数,输入值必须大于等于DesiredCapacity+2,留空则默认取DesiredCapacity+2 Default: '' # 校验规则:如果用户输入了MaxPreparedCapacity,必须满足最小值要求 Rules: ValidateMaxCapacityRule: RuleCondition: !Not [!Equals [!Ref MaxPreparedCapacity, '']] Assertions: - Assert: !GreaterOrEqual [!Ref MaxPreparedCapacity, !Add [!Ref DesiredCapacity, 2]] AssertDescription: MaxPreparedCapacity不能小于DesiredCapacity+2 # 条件判断:用户是否输入了自定义的MaxPreparedCapacity Conditions: HasCustomMaxCapacity: !Not [!Equals [!Ref MaxPreparedCapacity, '']] # 在资源中使用该值 Resources: MyAutoScalingGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: DesiredCapacity: !Ref DesiredCapacity MaxPreparedCapacity: !If - HasCustomMaxCapacity - !Ref MaxPreparedCapacity - !Add [!Ref DesiredCapacity, 2] # 其余属性省略
内容的提问来源于stack exchange,提问作者Bert Cushman
相关产品推荐
相关产品推荐

