当 CloudFormation 中的启动模板没有更改时,如何启动我的自动扩缩组的滚动更新?

2 分钟阅读
0

我希望在每次 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 属性中的其他元素。

要设置滚动更新,请完成以下步骤:

  1. 在您的 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'
  2. 在模板的启动配置中,引用 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
  3. 创建堆栈

  4. 要启动滚动更新,请根据其当前设置,将 Toggle 参数的值由 true 更改为 false 或由 false 更改为 true

**注意:**您还可以对更新需要替换的属性(例如 LaunchTemplateName)使用上述解决方法。

AWS 官方
AWS 官方已更新 2 个月前