Cloudformation yaml- 在 AutoScalingGroup 资源中生成实例列表

问题描述

我正在努力弄清楚如何为 AutoScalingGroup 资源编写 yaml 模板的覆盖部分。目前,我所拥有的仅适用于固定长度的字符串。在这种情况下,传递到模板中的字符串称为 InstanceTypesOverride

您可以在下面看到代码片段:

InstanceTypesOverride = "m5.large,m5d.large,m5a.large"

Type: AWS::AutoScaling::AutoScalingGroup
  Properties:
    AutoScalingGroupName: !Ref NodeGroupName
    DesiredCapacity: !Ref NodeAutoScalingGroupDesiredCapacity
    MixedInstancesPolicy:
      Instancesdistribution:
        ondemandAllocationStrategy: prioritized
        ondemandBaseCapacity: !Ref ondemandBaseCapacity
        ondemandPercentageAboveBaseCapacity: !Ref ondemandPercentageAboveBaseCapacity
        SpotAllocationStrategy: !Ref SpotAllocStrategy
      LaunchTemplate:
        LaunchTemplateSpecification:
          LaunchTemplateId: !Ref SpotLaunchTemplate
          Version: !GetAtt SpotLaunchTemplate.LatestVersionNumber
        Overrides:
          - InstanceType: !Select [0,!Split [ ",",!Ref InstanceTypesOverride ] ]
          - InstanceType: !Select [1,!Ref InstanceTypesOverride ] ]
          - InstanceType: !Select [2,!Ref InstanceTypesOverride ] ]

我想知道是否可以编写模板的覆盖部分,以便 InstanceTypesOverride 可以处理更多或更少的实例类型。如您所知,不同的区域可以处理不同的实例类型,因此具有让 cloudformation 能够处理不同字符串长度的能力对我来说至关重要。有人可以提出一些可行的建议吗?

理想情况下,我想要一个同时适用于 InstanceTypesOverride = "m5.large,m5a.large"InstanceTypesOverride = "m5.large,m5a.large,m5ad.large,m5n.large,m5dn.large"

的 cfm 模板

解决方法

遗憾的是,您不能使用普通的 CloudFormation (CFN) 来做到这一点。这将需要 CFN 不支持的循环机制。

唯一的方法是通过 CFN custom resources 或 CFN macro

在第一种情况下,您必须开发一个自定义 lambda 函数,它将创建整个 AutoScalingGroup 使用 AWS 开发工具包(例如 python)。在第二种情况下,也需要创建 lambda,但它会解析原始模板,展开 Overrides,并将修改后的模板返回给 CFN 执行。

替代方法是不使用 CFN,而是使用 terraform (TF)。 TF 具有广泛的影响力和对循环的广泛支持,可让您轻松地做您想做的事。