我希望在每次 AWS CloudFormation 堆栈更新时在我的 Amazon Elastic Compute Cloud (Amazon EC2) 自动扩缩组中滚动更新。我不想每次都修改启动模板。
解决方法
要启动自动扩缩组的滚动更新,请使用 UpdatePolicy 属性。
在您的 CloudFormation 模板的启动配置中,最佳做法是引用 AWS::EC2::LaunchTemplate 资源类型的 UserData 属性中的 Toggle 参数。在堆栈更新期间,当您更改 Toggle 值(例如由 true 更改为 false)时,您会修改 UserData 属性。此操作会提示 CloudFormation 创建新的启动模板版本。
以下解决方法假设您已为自动扩缩组配置了 AutoScalingRollingUpdate 策略,并将您的自动扩缩组配置为引用 AWS::EC2::LaunchTemplate。
**重要事项:**在向模板中添加 Toggle 参数时,请确保不会破坏 UserData 属性中的其他元素。
要设置滚动更新,请完成以下步骤:
-
在您的 CloudFormation 模板中,将 Toggle 定义为参数。
对于 JSON 文件,请输入以下代码:
"Parameters": {
"Toggle": {
"Type": "String",
"AllowedValues": [
"true",
"false"
],
"Default": "true",
"Description": "Toggle parameter to force ASG update"
}
}
对于 YAML 文件,请输入以下代码:
Parameters:
Toggle:
Type: String
AllowedValues:
- 'true'
- 'false'
Default: 'true'
Description: 'Toggle parameter to force ASG update'
-
在模板的启动配置中,引用 UserData 属性中的 Toggle 参数。
JSON 示例:
"LaunchTemplate": {
"Type": "AWS::EC2::LaunchTemplate",
"Properties": {
"LaunchTemplateData": {
"ImageId": { "Ref": "ImageId" },
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"",
[
"#!/bin/bash\n",
"echo \"Toggle parameter is set to ",
{
"Ref": "Toggle"
},
"\"\n"
...
...
]
]
}
},
"InstanceType": { "Ref": "InstanceType" }
}
}
YAML 示例:
LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateData:
ImageId: !Ref ImageId
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
echo "Toggle parameter is set to ${Toggle}"
...
...
InstanceType: !Ref InstanceType
-
创建堆栈。
-
要启动滚动更新,请根据其当前设置,将 Toggle 参数的值由 true 更改为 false 或由 false 更改为 true。
**注意:**您还可以对更新需要替换的属性(例如 LaunchTemplateName)使用上述解决方法。