问题描述
我正在努力弄清楚如何为 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"
解决方法
遗憾的是,您不能使用普通的 CloudFormation (CFN) 来做到这一点。这将需要 CFN 不支持的循环机制。
唯一的方法是通过 CFN custom resources 或 CFN macro。
在第一种情况下,您必须开发一个自定义 lambda 函数,它将创建整个
AutoScalingGroup
使用 AWS 开发工具包(例如 python)。在第二种情况下,也需要创建 lambda,但它会解析原始模板,展开 Overrides
,并将修改后的模板返回给 CFN 执行。
替代方法是不使用 CFN,而是使用 terraform (TF)。 TF 具有广泛的影响力和对循环的广泛支持,可让您轻松地做您想做的事。