迁移 Amazon CloudFormation 堆栈以启动模板 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

迁移 Amazon CloudFormation 堆栈以启动模板

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

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

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

查找使用启动配置的自动扩缩组
  • 使用以下 describe-auto-scaling-groups 命令列出在指定区域中使用启动配置的自动扩缩组的名称。包括将结果范围缩小到与 CloudFormation 堆栈关联的组的--filters选项(通过按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" ]

    您可以找到其他有用的 Amazon CLI 命令,用于查找要迁移的 Auto Scaling 组和筛选输出迁移您的 Auto Scaling 群组以启动模板

重要

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

更新堆栈以使用启动模板

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

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

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

  • 部署这些更新。

修改堆栈模板并更新堆栈
  1. 按照Amazon 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 支持的所有属性的参考信息,请参阅Amazon CloudFormation 用户指南中的。

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

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

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

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

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

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

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

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

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

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

  8. 从资源中移除该LaunchConfigurationName属性。将启动模板添加到其位置上。

    在以下示例中,Ref 内部函数获取具有逻辑 ID 的资源 ID。myLaunchTemplateGetAtt函数获取该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 支持的所有属性的参考信息,请参阅Amazon CloudFormation 用户指南中的AWS::AutoScaling::AutoScaling群

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

理解堆栈资源的更新行为

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

CloudFormation 支持 Auto Scaling 组的UpdatePolicy属性。更新期间,如果设置UpdatePolicyAutoScalingRollingUpdate,则在执行此过程中的步骤后 CloudFormation 替换InService实例。如果设置UpdatePolicyAutoScalingReplacingUpdate,则 CloudFormation 替换 Auto Scaling 组及其温池(如果存在)。

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

跟踪迁移

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

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

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

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

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

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

启动配置映射参考

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

启动配置源属性 启动模板目标属性
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 已不可用。