如何用单个CloudFormation条件按需配置EMR实例组或实例队列?
用单个CloudFormation条件按需指定EMR实例组/队列
完全可以用单个条件实现,不需要多个独立判断,核心是用Fn::If结合环境判断条件来分支配置。
步骤1:定义单个环境判断条件
先在模板的Conditions段定义一个判断生产环境的条件,匹配stage或prod:
Conditions: IsProductionEnvironment: !Or - !Equals [!Ref Environment, "stage"] - !Equals [!Ref Environment, "prod"]
步骤2:在EMR资源中用Fn::If分支配置
在EMR集群的Instances配置里,用Fn::If根据上面的条件选择CoreInstanceGroup或CoreInstanceFleet:
Resources: MyEMRCluster: Type: AWS::EMR::Cluster Properties: # 其他集群配置(名称、ReleaseLabel等) Instances: MasterInstanceGroup: # 主实例组基础配置(按需调整) InstanceCount: 1 InstanceType: m5.xlarge Market: ON_DEMAND # 核心实例部分用条件分支 !If - IsProductionEnvironment # 生产环境用CoreInstanceGroup - CoreInstanceGroup: InstanceCount: 3 InstanceType: m5.xlarge Market: ON_DEMAND # 预生产环境用CoreInstanceFleet - CoreInstanceFleet: InstanceTypeConfigs: - InstanceType: m5.xlarge WeightedCapacity: 1 TargetOnDemandCapacity: 2 # 其他Instances配置(比如TerminationProtected等)
扩展到主实例组/队列的情况
如果要为主实例也做同样的环境区分,直接复用同一个IsProductionEnvironment条件即可,不需要新增条件:
Instances: !If - IsProductionEnvironment # 生产环境:主+核心都用InstanceGroup - MasterInstanceGroup: InstanceCount: 1 InstanceType: m5.xlarge Market: ON_DEMAND CoreInstanceGroup: InstanceCount: 3 InstanceType: m5.xlarge Market: ON_DEMAND # 预生产环境:主+核心都用InstanceFleet - MasterInstanceFleet: InstanceTypeConfigs: - InstanceType: m5.xlarge WeightedCapacity: 1 TargetOnDemandCapacity: 1 CoreInstanceFleet: InstanceTypeConfigs: - InstanceType: m5.xlarge WeightedCapacity: 1 TargetOnDemandCapacity: 2
注意事项
- 确保
Fn::If的结构正确:三个元素的列表,第一个是条件名,第二个是条件满足时的配置,第三个是不满足时的配置,YAML缩进要严格对齐,这是之前写法报错的常见原因。 - 两种实例配置的结构要符合EMR资源的Schema,比如
CoreInstanceFleet需要InstanceTypeConfigs和TargetOnDemandCapacity,而CoreInstanceGroup用InstanceCount和InstanceType。
内容的提问来源于stack exchange,提问作者SteveTR
相关产品推荐
相关产品推荐

