将 AWS CloudFormation 堆栈迁移到启动模板 - Amazon EC2 Auto Scaling

将 AWS CloudFormation 堆栈迁移到启动模板

您可以将现有的 CloudFormation 堆栈模板从启动配置迁移到启动模板。为此,请将启动模板直接添加到现有堆栈模板中,然后将启动模板与堆栈模板中的自动扩缩组相关联。然后使用您的经过修改的模板更新您的堆栈。

本主题提供了迁移到启动模板时将 CloudFormation 堆栈模板中的启动配置重写为启动模板的相关说明,从而为您节省时间。有关将启动配置迁移到启动模板的更多信息,请参阅 将自动扩缩组迁移到启动模板

查找使用启动配置的自动扩缩组

查找使用启动配置的自动扩缩组
  • 使用以下 describe-auto-scaling-groups 命令列出在指定区域中使用启动配置的自动扩缩组的名称。包括 --filters 选项,将结果范围缩小到与 CloudFormation 堆栈关联的群组(按 aws:cloudformation:stack-name 标签键进行筛选)。

    aws autoscaling describe-auto-scaling-groups --region REGION \ --filters Name=tag-key,Values=aws:cloudformation:stack-name \ --query 'AutoScalingGroups[?LaunchConfigurationName!=`null`].AutoScalingGroupName'

    下面显示了示例输出。

    [ "{stack-name}-group-1", "{stack-name}-group-2", "{stack-name}-group-3" ]

    您可以在 将自动扩缩组迁移到启动模板 中找到其他有用的 AWS CLI 命令,用于在查找要迁移的自动扩缩组和筛选输出。

重要

如果您的堆栈资源名称中有 AWSEB,则表示它们是通过 AWS Elastic Beanstalk 创建的。在这种情况下,您必须更新 Beanstalk 环境以指示 Elastic Beanstalk 删除启动配置并将其替换为启动模板。

更新堆栈以使用启动模板

请按照本部分中的步骤,来执行以下操作:

  • 使用等效的启动模板属性将启动配置重写为启动模板。

  • 关联新启动模板与自动扩缩组。

  • 部署这些更新。

修改堆栈模板并更新堆栈
  1. 按照AWS CloudFormation用户指南修改堆栈模板的中所述的修改堆栈模板一般步骤进行操作。

  2. 将启动配置重写为启动模板。请参见以下示例:

    示例:简单的启动配置

    --- Resources: myLaunchConfig: Type: AWS::AutoScaling::LaunchConfiguration Properties: ImageId: ami-02354e95b3example InstanceType: t3.micro SecurityGroups: - !Ref EC2SecurityGroup KeyName: MyKeyPair BlockDeviceMappings: - DeviceName: /dev/xvda Ebs: VolumeSize: 150 DeleteOnTermination: true UserData: Fn::Base64: !Sub | #!/bin/bash -xe yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource myASG --region ${AWS::Region}

    示例:等效的启动模板

    --- Resources: myLaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateName: !Sub ${AWS::StackName}-launch-template LaunchTemplateData: ImageId: ami-02354e95b3example InstanceType: t3.micro SecurityGroupIds: - Ref! EC2SecurityGroup KeyName: MyKeyPair BlockDeviceMappings: - DeviceName: /dev/xvda Ebs: VolumeSize: 150 DeleteOnTermination: true UserData: Fn::Base64: !Sub | #!/bin/bash -x yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource myASG --region ${AWS::Region}

    有关 Amazon EC2 支持的所有属性的参考信息,请参阅AWS CloudFormation用户指南中的 AWS::EC2::LaunchTemplate

    请注意启动模板如何包含值为 !Sub ${AWS::StackName}-launch-templateLaunchTemplateName 属性。如果您要在启动模板的名称中包含堆栈名称,则必须执行此操作。

  3. 如果启动配置中存在 IamInstanceProfile 属性,则必须将其转换为结构并指定实例配置文件的名称或 ARN。有关示例,请参阅 AWS::EC2::LaunchTemplate

  4. 如果启动配置中存在 AssociatePublicIpAddressInstanceMonitoringPlacementTenancy 属性,则必须将其转换为结构。有关示例,请参阅 AWS::EC2::LaunchTemplate

    一个例外情况是,当您用于自动扩缩组的子网上的 MapPublicIpOnLaunch 属性值与启动配置中的 AssociatePublicIpAddress 属性值相匹配时。在这种情况下,您可以忽略 AssociatePublicIpAddress 属性。该 AssociatePublicIpAddress 属性仅用于覆盖该 MapPublicIpOnLaunch 属性以更改实例在启动时是否接收公有 IPv4 地址。

  5. 您可以将安全组从 SecurityGroups 属性复制到启动模板中的两个位置之一。通常,您可以将安全组复制到 SecurityGroupIds 属性。但是,如果您在启动模板中创建 NetworkInterfaces 结构来指定 AssociatePublicIpAddress 属性,则必须将安全组复制到网络接口的 Groups 属性中。

  6. 如果您的启动配置中存在任何 NoDevice 设置为 trueBlockDeviceMapping 结构,则必须在启动模板中为 NoDevice 指定一个空字符串,才能让 Amazon EC2 省略该设备。

  7. 如果您的启动配置中存在 SpotPrice 属性,我们建议您将其从启动模板中省略。您的竞价型实例将以当前的 Spot 价格启动。该价格永远不会超过按需价格。

    要请求竞价型实例,您有两个互斥的选项:

    • 第一种是在启动模板中使用 InstanceMarketOptions 结构(不推荐)。有关更多信息,请参阅AWS CloudFormation用户指南中的 AWS::EC2::LaunchTemplate InstanceMarketOptions

    • 另一种方法是将 MixedInstancesPolicy 结构添加到自动扩缩组。这样做可以为你提供更多关于如何提出请求的选项。您的启动模板中的竞价型实例请求不支持每个自动扩缩组选择多个实例类型。但是,混合实例策略支持每个自动扩缩组选择多个实例类型。竞价型实例请求可以受益于有多个实例类型可供选择。有关更多信息,请参阅AWS CloudFormation用户指南中的 AWS::AutoScaling::AutoScalingGroup MixedInstancesPolicy

  8. AWS::AutoScaling::AutoScalingGroup 资源中删除 LaunchConfigurationName 属性。将启动模板添加到其位置上。

    在以下示例中,Ref 内置函数获取带有逻辑 ID myLaunchTemplateAWS::EC2::LaunchTemplate 资源。GetAtt 函数会获取 Version 属性的启动模板的最新版本号(例如 1)。

    示例:没有混合实例策略

    --- Resources: myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: LaunchTemplate: LaunchTemplateId: !Ref myLaunchTemplate Version: !GetAtt myLaunchTemplate.LatestVersionNumber ...

    示例:使用混合实例策略

    --- Resources: myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: MixedInstancesPolicy: LaunchTemplate: LaunchTemplateSpecification: LaunchTemplateId: !Ref myLaunchTemplate Version: !GetAtt myLaunchTemplate.LatestVersionNumber ...

    有关 Amazon EC2 Auto Scaling 支持的所有属性的参考信息,请参阅AWS CloudFormation用户指南中的 AWS::AutoScaling::AutoScalingGroup

  9. 当您准备好部署这些更新时,请按照 CloudFormation 程序使用修改后的堆栈模板更新堆栈。有关更多信息,请参阅AWS CloudFormation用户指南中的修改堆栈模板

理解堆栈资源的更新行为

CloudFormation 通过比较您提供的更新模板与您在先前版本的堆栈模板中描述的资源配置之间的变化来更新堆栈资源。尚未更改的资源配置在更新过程中不会受到影响。

CloudFormation 支持自动扩缩组的 UpdatePolicy 属性。在更新期间,如果 UpdatePolicy 设置为 AutoScalingRollingUpdate,则在您执行此过程中的步骤后,CloudFormation 会替换 InService 实例。如果 UpdatePolicy 设置为 AutoScalingReplacingUpdate,则 CloudFormation 会替换自动扩缩组及其暖池(如果存在)。

如果您未为自动扩缩组指定 UpdatePolicy 属性,则会检查启动模板的正确性,但是 CloudFormation 不会在自动扩缩组的实例之间部署任何更改。所有新实例都使用您的启动模板,但现有实例会继续使用其最初启动的配置运行(除非不存在启动配置)。例外情况是当您更改购买选项时,例如通过添加混合实例策略。在这种情况下,您的自动扩缩组会逐渐用新实例替换现有实例,以匹配新的购买选项。

如果您必须回滚更改才能从启动配置切换到启动模板,则请务必测试回滚操作。

跟踪迁移

跟踪迁移
  1. CloudFormation控制台中,选择已更新的堆栈,然后单击事件选项卡,查看堆栈事件。

  2. 要更新具有最新事件的事件列表,请选择 CloudFormation 控制台中的刷新按钮。

  3. 在堆栈更新时,您会注意到每次资源更新都会发生多个事件。如果您在 “状态原因” 列中看到异常,表明在尝试创建启动模板时出现问题,请参阅 Amazon EC2 Auto Scaling 问题排查:启动模板 以了解潜在原因。

  4. (可选)根据您对 UpdatePolicy 属性的使用情况,您可以从 Amazon EC2 控制台的自动扩缩组页面监控自动扩缩组的进度。选择 Auto Scaling 组。在 Activity(活动)选项卡的 Activity history(活动历史记录)下,Status(状态)列显示您的 Auto Scaling 组是否已成功启动或终止实例,或者扩展活动是否仍在进行中。

  5. 堆栈更新完成后,CloudFormation 会启动 UPDATE_COMPLETE 堆栈事件。有关更多信息,请参阅AWS CloudFormation用户指南中的监控堆栈更新的进度

  6. 堆栈更新完成后,打开 Amazon EC2 控制台的启动模板页面启动配置页面。您会注意到已创建新的启动模板,并且已删除启动配置。

启动配置映射参考

为了便于参考,下表列出了 AWS::AutoScaling::LaunchConfiguration 资源中的所有顶级属性及其在 AWS::EC2::LaunchTemplate 资源中的相应属性。

启动配置源属性 启动模板目标属性
AssociatePublicIpAddress NetworkInterfaces.AssociatePublicIpAddress
BlockDeviceMappings BlockDeviceMappings
ClassicLinkVPCId 不可用¹
ClassicLinkVPCSecurityGroups 不可用¹
EbsOptimized EbsOptimized
IamInstanceProfile 选择在 IamInstanceProfile.ArnIamInstanceProfile.Name,但不能同时选择两者
ImageId ImageId
InstanceId InstanceId
InstanceMonitoring Monitoring.Enabled
InstanceType InstanceType
KernelId KernelId
KeyName KeyName
LaunchConfigurationName LaunchTemplateName
MetadataOptions MetadataOptions
PlacementTenancy Placement.Tenancy
RamDiskId RamDiskId
SecurityGroups 选择在 SecurityGroupIdsNetworkInterfaces.Groups,但不能同时选择两者
SpotPrice InstanceMarketOptions.SpotOptions.MaxPrice
UserData UserData

¹ ClassicLinkVPCIdClassicLinkVPCSecurityGroups 属性不可在启动模板中使用,因为 EC2-Classic 不再可用。