如果 AWS CloudFormation 中的启动配置没有任何更改,我该如何触发滚动更新?

上次更新时间:2019 年 5 月 20 日

当我更新 AWS CloudFormation 堆栈时,Auto Scaling 组中的实例不会更新,因为我未修改启动配置。但是,我希望每次更新堆栈时都触发 Auto Scaling 组中的滚动更新,即使我未修改启动配置也是如此。

简短描述

仅当满足 UpdatePolicy 属性的特定条件时,才会触发 Auto Scaling 组的滚动更新。

要触发滚动更新,您可以在 AWS CloudFormation 模板的启动配置中创建触发参数(本示例中为 Toggle)。但是,如果您在堆栈更新期间更改 Toggle 参数的值,则 UserData 属性也会修改。对 UserData 的任何修改都需要替换。AWS CloudFormation 会检测对 UserData 的修改,然后替换 LaunchConfiguration 资源。该替换会触发 UpdatePolicy 属性定义的 Auto Scaling 滚动更新。

解决方法

以下步骤假定已为您的 Auto Scaling 组配置 AutoScalingRollingUpdate 策略,并且您的 Auto Scaling 组已配置为引用 LaunchConfiguration

重要提示:当您将 Toggle 参数添加到模板时,请注意不要破坏 UserData 属性中的其他元素。请勿在 cfn-signal 之前添加 Toggle 参数。

1.    在您的 AWS CloudFormation 模板中,定义您的参数(本示例中为 Toggle)。请参阅以下 JSON 和 YAML 示例。

JSON:

"Parameters": {
        "Toggle": {
            "Type": "String",
            "AllowedValues": ["true","false"],
            "Default": "true"
        }
    }

YAML:

Parameters:
  Toggle:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
    Default: 'true'

2.    在模板的启动配置中,引用 UserData 属性中的 Toggle,然后启动您的堆栈。请参阅以下 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

重要提示:要在更新堆栈时触发滚动更新,请在启动堆栈前将 Toggle 参数的值从 true 更改为 false,或者从 false 更改为 true,具体取决于该参数的初始设置。

注意:您可以对更新需要替换的属性(例如 LaunchConfigurationName)以及 AWS::EC2::LaunchTemplate 等资源使用 Toggle 参数解决方法。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?