我想在每次 AWS CloudFormation 堆栈更新时在我的自动扩缩组中启动滚动更新,而不修改启动配置。
简短描述
仅当满足 UpdatePolicy 属性的特定条件时,才可以启动自动扩缩组的滚动更新。
要启动滚动更新,您可以在 CloudFormation 模板的启动配置中创建一个切换参数。但是,如果您在堆栈更新期间更改切换参数的值,则 UserData 属性也会修改。对 UserData 的任何修改都需要替换。CloudFormation 会检测对 UserData 的修改,然后替换 LaunchConfiguration 资源。该替换会启动 UpdatePolicy 属性定义的自动扩缩滚动更新。
解决方法
以下步骤假定已为您的自动扩缩组配置 AutoScalingRollingUpdate 策略,并且您的自动扩缩组已配置为引用 LaunchConfiguration。
**重要提示:**当您将切换参数添加到模板时,请确保不要破坏 UserData 属性中的其他元素。另外,请勿在 cfn-signal 之前添加切换参数。
1. 在您的 CloudFormation 模板中,将 Toggle 定义为参数。
JSON:
"Parameters": {
"Toggle": {
"Type": "String",
"AllowedValues": ["true","false"],
"Default": "true"
}
}
YAML:
Parameters:
Toggle:
Type: String
AllowedValues:
- 'true'
- 'false'
Default: 'true'
2. 在模板的启动配置中,引用 UserData 属性中的切换参数,然后启动您的堆栈。请参阅以下 JSON 和 YAML 示例。
JSON:
"LaunchConfig" : {
"Type" : "AWS::AutoScaling::LaunchConfiguration",
"Properties" : {
"ImageId" : { "Ref" : "ImageID" },
"UserData" : { "Fn::Base64" : { "Ref" : "Toggle" }
...
...
},
"InstanceType" : { "Ref" : "Type" }
}
}
YAML:
LaunchConfig:
Type: 'AWS::AutoScaling::LaunchConfiguration'
Properties:
ImageId: !Ref ImageID
UserData:
'Fn::Base64': !Ref Toggle
...
...
InstanceType: !Ref Type
**重要提示:**要在更新堆栈时启动滚动更新,请将参数的值从 true 更改为 false,或者从 false 更改为 true,具体取决于该参数的初始设置。
**注意:**您可以对更新需要替换的属性(例如 LaunchConfigurationName)以及 AWS::EC2::LaunchTemplate 等资源使用切换参数解决方法。