

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

# 迁移 AWS CloudFormation 堆栈以启动模板
<a name="migrate-launch-configurations-with-cloudformation"></a>

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

迁移到启动模板时，本主题提供了将 CloudFormation 堆栈模板中的启动配置重写为启动模板的说明，从而为您节省时间。有关将启动配置迁移到启动模板的更多信息，请参阅 [将自动扩缩组迁移到启动模板](migrate-to-launch-templates.md)。

**Topics**
+ [查找使用启动配置的自动扩缩组](#find-auto-scaling-groups-to-migrate)
+ [更新堆栈以使用启动模板](#update-stack-to-use-launch-template)
+ [理解堆栈资源的更新行为](#understand-update-behavior)
+ [跟踪迁移](#track-the-migration)
+ [启动配置映射参考](#launch-configuration-mapping-reference)

## 查找使用启动配置的自动扩缩组
<a name="find-auto-scaling-groups-to-migrate"></a>

**查找使用启动配置的自动扩缩组**
+ 使用以下[describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html)命令列出在指定区域中使用启动配置的 Auto Scaling 组的名称。包括将结果范围缩小到与 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"
  ]
  ```

  您可以找到其他有用的 AWS CLI 命令，用于查找要迁移的 Auto Scaling 组和筛选输出[将自动扩缩组迁移到启动模板](migrate-to-launch-templates.md)。

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

## 更新堆栈以使用启动模板
<a name="update-stack-to-use-launch-template"></a>

请按照本部分中的步骤，来执行以下操作：
+ 使用等效的启动模板属性将启动配置重写为启动模板。
+ 关联新启动模板与自动扩缩组。
+ 部署这些更新。

**修改堆栈模板并更新堆栈**

1. 按照*AWS CloudFormation 用户指南*中[修改堆栈模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-get-template.html)的中所述的修改堆栈模板一般步骤进行操作。

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

   **示例：简单的启动配置**

   ```
   ---
   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](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html)*中的。

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

1. 如果启动配置中存在 `IamInstanceProfile` 属性，则必须将其转换为结构并指定实例配置文件的名称或 ARN。有关示例，请参阅[AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html)。

1. 如果启动配置中存在 `AssociatePublicIpAddress`、`InstanceMonitoring` 或 `PlacementTenancy` 属性，则必须将其转换为结构。有关示例，请参阅 [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html)。

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

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

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

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

   要请求竞价型实例，您有两个互斥的选项：
   + 第一种是在启动模板中使用 `InstanceMarketOptions` 结构（不推荐）。有关更多信息，请参阅[AWS::EC2::LaunchTemplate InstanceMarketOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancemarketoptions.html)《*AWS CloudFormation 用户指南》*。
   + 另一种方法是将 `MixedInstancesPolicy` 结构添加到自动扩缩组。这样做可以为你提供更多关于如何提出请求的选项。您的启动模板中的竞价型实例请求不支持每个自动扩缩组选择多个实例类型。但是，混合实例策略支持每个自动扩缩组选择多个实例类型。竞价型实例请求可以受益于有多个实例类型可供选择。有关更多信息，请参阅《*AWS CloudFormation 用户指南》 MixedInstancesPolicy*中的 MixedInstancesPolicy。

1. 从[AWS::AutoScaling::AutoScaling群](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-autoscalinggroup.html)资源中移除该`LaunchConfigurationName`属性。将启动模板添加到其位置上。

   在以下示例中，[Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) 内部函数获取具有逻辑 ID 的[AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html)资源 ID。`myLaunchTemplate`该[GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html)函数获取该`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 用户指南*中的。

1. 准备好部署这些更新后，请按照 CloudFormation步骤使用修改后的堆栈模板更新堆栈。有关更多信息，请参阅*AWS CloudFormation 用户指南*中的[修改堆栈模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-get-template.html)。

## 理解堆栈资源的更新行为
<a name="understand-update-behavior"></a>

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

CloudFormation 支持 Auto Scaling 组的[UpdatePolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html)属性。更新期间，如果设置`UpdatePolicy`为`AutoScalingRollingUpdate`，则在执行此过程中的步骤后 CloudFormation 替换`InService`实例。如果设置`UpdatePolicy`为`AutoScalingReplacingUpdate`，则 CloudFormation 替换 Auto Scaling 组及其温池（如果存在）。

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

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

## 跟踪迁移
<a name="track-the-migration"></a>

**跟踪迁移**

1. 在[CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)中，选择已更新的堆栈，然后单击**事件**选项卡，查看堆栈事件。

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

1. 在堆栈更新时，您会注意到每次资源更新都会发生多个事件。如果您在 **“状态原因” **列中看到异常，表明在尝试创建启动模板时出现问题，请参阅 [Amazon EC2 Auto Scaling 问题排查：启动模板](ts-as-launch-template.md) 以了解潜在原因。

1. （可选）根据您对 `UpdatePolicy` 属性的使用情况，您可以从 Amazon EC2 控制台的[自动扩缩组页面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)监控自动扩缩组的进度。选择 Auto Scaling 组。在 **Activity**（活动）选项卡的 **Activity history**（活动历史记录）下，**Status**（状态）列显示您的 Auto Scaling 组是否已成功启动或终止实例，或者扩展活动是否仍在进行中。

1. 堆栈更新完成后， CloudFormation 发出`UPDATE_COMPLETE`堆栈事件。有关更多信息，请参阅*AWS CloudFormation 用户指南*中的[监控堆栈更新的进度](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-monitor-stack.html)。

1. 堆栈更新完成后，打开 Amazon EC2 控制台的[启动模板页面](https://console.aws.amazon.com/ec2/v2/#LaunchTemplates)和[启动配置页面](https://console.aws.amazon.com/ec2/v2/home?#LaunchConfigurations)。您会注意到已创建新的启动模板，并且已删除启动配置。

## 启动配置映射参考
<a name="launch-configuration-mapping-reference"></a>

为了便于参考，下表列出了[AWS::AutoScaling::LaunchConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html)资源中的所有顶级属性及其在[AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html)资源中的相应属性。


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

¹ `ClassicLinkVPCId` 和 `ClassicLinkVPCSecurityGroups` 属性不可在启动模板中使用，因为 EC2-Classic 不再可用。