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

上次更新日期:2022 年 8 月 16 日

我想在每次 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 等资源使用切换参数解决方法。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?