You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CloudFormation中基于Number参数的条件始终无法评估为true问题排查

CloudFormation条件判断失效问题排查与解决

问题描述

我尝试通过CloudFormation(CFN)的Number参数创建多台EC2实例,配置了如下参数与条件:

Parameters:
  NumberOfInstances:
    Type: Number
    MinValue: 1
    MaxValue: 10
    Default: 1
    Description: >
      How many Edge Nodes do you want to launch in this Stack? (Min = 1, Max = 10)

Conditions:
  MoreThan1:
    !Or [!Equals [NumberOfInstances, 2], !Equals [NumberOfInstances, 3], !Equals [NumberOfInstances, 4], !Equals [NumberOfInstances, 5], !Equals [NumberOfInstances, 6], !Equals [NumberOfInstances, 7], !Equals [NumberOfInstances, 8], !Equals [NumberOfInstances, 9], !Equals [NumberOfInstances, 10] ]
  MoreThan2:
    !Or [!Equals [NumberOfInstances, 3], !Equals [NumberOfInstances, 4], !Equals [NumberOfInstances, 5], !Equals [NumberOfInstances, 6], !Equals [NumberOfInstances, 7], !Equals [NumberOfInstances, 8], !Equals [NumberOfInstances, 9], !Equals [NumberOfInstances, 10] ]
  MoreThan3:
    !Or [!Equals [NumberOfInstances, 4], !Equals [NumberOfInstances, 5], !Equals [NumberOfInstances, 6], !Equals [NumberOfInstances, 7], !Equals [NumberOfInstances, 8], !Equals [NumberOfInstances, 9], !Equals [NumberOfInstances, 10] ]

资源段中第一台实例始终创建,当NumberOfInstances大于1时使用不同名称格式:

MyInstance01:
    Type: 'AWS::EC2::Instance'
    Properties:
      Tags:
        - Key: Name
          Value: !If [MoreThan1, !Sub '${AWS::StackName}-001',!Ref AWS::StackName ]

第二台实例配置:

MyInstance02:
    Condition: MoreThan1
    Type: 'AWS::EC2::Instance'
    Properties:
      Tags:
        - Key: Name
          Value: !Sub '${AWS::StackName}-002'

但无论NumberOfInstances设为大于1的任何值,MoreThan1条件始终不评估为true:第一台实例名称标签未正确设置,第二台实例也无法创建。后续简化条件后问题依旧:

Conditions:
  TwoOrMoreInstances: !Or [!Equals [NumberOfInstances, 2], !Condition ThreeOrMoreInstances]
  ThreeOrMoreInstances: !Or [!Equals [NumberOfInstances, 3], !Condition FourOrMoreInstances]
  FourOrMoreInstances: !Or [!Equals [NumberOfInstances, 4], !Condition FiveOrMoreInstances]
  FiveOrMoreInstances: !Or [!Equals [NumberOfInstances, 5], !Condition SixOrMoreInstances]
  SixOrMoreInstances: !Or [!Equals [NumberOfInstances, 6], !Condition SevenOrMoreInstances]
  SevenOrMoreInstances: !Or [!Equals [NumberOfInstances, 7], !Condition EightOrMoreInstances]
  EightOrMoreInstances: !Or [!Equals [NumberOfInstances, 8], !Condition NineOrMoreInstances]
  NineOrMoreInstances: !Or [!Equals [NumberOfInstances, 9], !Condition TenOrMoreInstances]
  TenOrMoreInstances: !Equals [NumberOfInstances, 10] # Not actually ten OR MORE, but keeping same format makes easier to extend in future

对应资源段调整后问题仍存在。


错误原因

CloudFormation中,Number类型的参数是数值类型,但你在!Equals里直接使用的数字(比如2、3)属于字符串字面量。CFN的类型比较是严格的,数值和字符串永远不相等,因此所有条件判断结果都是false。


解决方案

有两种可行的修正方式:

方式1:将数值参数转为字符串后比较

通过!Sub把NumberOfInstances参数转换为字符串,再和字符串形式的数字比较:

Conditions:
  MoreThan1:
    !Or 
      - !Equals [!Sub '${NumberOfInstances}', '2']
      - !Equals [!Sub '${NumberOfInstances}', '3']
      - !Equals [!Sub '${NumberOfInstances}', '4']
      - !Equals [!Sub '${NumberOfInstances}', '5']
      - !Equals [!Sub '${NumberOfInstances}', '6']
      - !Equals [!Sub '${NumberOfInstances}', '7']
      - !Equals [!Sub '${NumberOfInstances}', '8']
      - !Equals [!Sub '${NumberOfInstances}', '9']
      - !Equals [!Sub '${NumberOfInstances}', '10']

方式2:使用数值比较函数(更简洁推荐)

利用CFN的!GreaterThan、!LessThan等数值比较函数,直接判断数值大小,无需逐个列举:

Parameters:
  NumberOfInstances:
    Type: Number
    MinValue: 1
    MaxValue: 10
    Default: 1
    Description: >
      要在栈中启动多少台边缘节点?(最小值=1,最大值=10)

Conditions:
  MoreThan1: !GreaterThan [!Ref NumberOfInstances, 1]
  MoreThan2: !GreaterThan [!Ref NumberOfInstances, 2]
  MoreThan3: !GreaterThan [!Ref NumberOfInstances, 3]
  # 以此类推,或者直接用TwoOrMoreInstances: !GreaterThan [!Ref NumberOfInstances, 1]

这种写法不仅更简洁,还避免了类型不匹配的问题,同时更易扩展(比如后续调整MaxValue时无需修改条件)。


内容的提问来源于stack exchange,提问作者Fat Monk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:02:42