

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 遷移 AWS CloudFormation 堆疊以啟動範本
<a name="migrate-launch-configurations-with-cloudformation"></a>

您可以將現有的 CloudFormation 堆疊範本從啟動組態遷移到啟動範本。為此，請將啟動範本直接新增至現有的堆疊範本，然後將啟動範本與堆疊範本中的 Auto Scaling 群組建立關聯。然後，使用修改過的範本更新堆疊。

遷移到啟動範本時，本主題會提供將 CloudFormation 堆疊範本中的啟動組態重寫為啟動範本的指示，以節省您的時間。如需將啟動組態遷移到啟動範本的詳細資訊，請參閱 [遷移 Auto Scaling 群組以啟動範本](migrate-to-launch-templates.md)。

**Topics**
+ [尋找使用啟動組態的 Auto Scaling 群組](#find-auto-scaling-groups-to-migrate)
+ [更新堆疊以使用啟動範本](#update-stack-to-use-launch-template)
+ [了解更新堆疊資源的行為](#understand-update-behavior)
+ [追蹤遷移](#track-the-migration)
+ [啟動組態對應參考](#launch-configuration-mapping-reference)

## 尋找使用啟動組態的 Auto Scaling 群組
<a name="find-auto-scaling-groups-to-migrate"></a>

**尋找使用啟動組態的 Auto Scaling 群組**
+ 使用下列 [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) 命令，列出在指定區域中使用啟動組態的 Auto Scaling 群組的名稱。包含 `--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 命令，以尋找 Auto Scaling 群組來遷移和篩選 中的輸出[遷移 Auto Scaling 群組以啟動範本](migrate-to-launch-templates.md)。

**重要**  
如果您的堆疊資源名稱`AWSEB`中有 ，這表示它們是透過 建立 AWS Elastic Beanstalk的。在這種情況下，您必須更新 Beanstalk 環境以指示 Elastic Beanstalk 移除啟動組態並將其替換為啟動範本。

## 更新堆疊以使用啟動範本
<a name="update-stack-to-use-launch-template"></a>

請依照本章節中的步驟，執行下列操作：
+ 使用同等的啟動範本屬性，將啟動組態重寫為啟動範本。
+ 將新的啟動範本與 Auto Scaling 群組關聯。
+ 部署這些更新。

**修改堆疊範本並更新堆疊**

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)。

   當用於 Auto Scaling 群組的子網路上的 `MapPublicIpOnLaunch` 屬性值與啟動組態中的 `AssociatePublicIpAddress` 屬性值相符時，則屬於例外情況。在這種情況下，可以忽略 `AssociatePublicIpAddress` 屬性。`AssociatePublicIpAddress` 屬性僅用於覆寫 `MapPublicIpOnLaunch` 屬性，以變更執行個體在啟動時是否接收公用 IPv4 位址。

1. 您可以將安全群組從 `SecurityGroups` 屬性複製到啟動範本中的兩個位置之一。一般來說，您可以將安全群組複製到 `SecurityGroupIds` 屬性。但是，如果您在啟動範本中建立 `NetworkInterfaces` 結構來指定 `AssociatePublicIpAddress` 屬性，則必須將安全群組複製到網路介面的 `Groups` 屬性。

1. 如果啟動組態中存在任何將 `NoDevice` 設定為 `true` 的 `BlockDeviceMapping` 結構，則必須在啟動範本中為 `NoDevice` 指定空白字串，以讓 Amazon EC2 省略該裝置。

1. 如果啟動配置中存在 `SpotPrice` 屬性，建議您將其從啟動模板中省略。您的 Spot 執行個體將以目前的 Spot 價格啟動。價格絕不會超過隨需價格。

   若要請求 Spot 執行個體，您會有兩個互斥的選項：
   + 第一個選項是使用啟動範本中的 `InstanceMarketOptions` 結構 (不建議使用)。如需詳細資訊，請參閱*《AWS CloudFormation 使用者指南》*中的 [AWS::EC2::LaunchTemplate InstanceMarketOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancemarketoptions.html)。
   + 另一個選項是將 `MixedInstancesPolicy` 結構新增至您的 Auto Scaling 群組。這樣做會為您發出請求的方式提供更多選項。啟動範本中的 Spot 執行個體請求不支援每個 Auto Scaling 群組選取一個以上的執行個體類型。但是混合執行個體政策則支援每個 Auto Scaling 群組選取一個以上的執行個體類型。Spot 執行個體請求受益於有多種執行個體類型可供選擇。如需詳細資訊，請參閱*《AWS CloudFormation 使用者指南》*中的 [AWS::AutoScaling::AutoScalingGroup MixedInstancesPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-mixedinstancespolicy.html)。

1. 將 `LaunchConfigurationName` 屬性從 [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-autoscalinggroup.html) 資源中移除。在該位置新增啟動範本。

   在下列範例中，[參考](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html)內部函數會取得邏輯 ID 為 `myLaunchTemplate` 的 [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) 資源的 ID。[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 使用者指南》*中的 [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-autoscalinggroup.html)。

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 群組的執行個體中部署任何變更。所有新的執行個體均將使用您的啟動範本，但現有的執行個體會繼續使用其原先啟動的組態來執行 (儘管啟動組態已不存在)。當您變更購買選項時，例如新增混合執行個體政策時，則屬例外情況。在這種情況下，Auto Scaling 群組會逐漸以新的執行個體取代現有的執行個體，以符合新的購買選項。

如果您必須復原變更，才能從啟動組態移至啟動範本，請務必測試復原操作。

## 追蹤遷移
<a name="track-the-migration"></a>

**追蹤遷移**

1. 在 [CloudFormation 主控台](https://console.aws.amazon.com/cloudformation)選取更新過的堆疊，接著選擇 **Events (事件)** 標籤來檢視堆疊事件。

1. 如需更新事件清單以包含最新的事件，則請選擇 CloudFormation 主控台中的重新整理按鈕。

1. 當您的推疊更新時，您會發現每個資源更新了多個事件。如果您在**狀態原因**欄中看到例外狀況，表示嘗試建立啟動範本時發生了問題，請參閱 [Amazon EC2 Auto Scaling 的故障診斷：啟動範本](ts-as-launch-template.md) 了解潛在原因。

1. (可選性) 根據您對 `UpdatePolicy` 屬性的使用情況，您可以從 Amazon EC2 主控台的 [Auto Scaling 群組頁面](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)監控 Auto Scaling 群組的進度。選取 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 | 

1 `ClassicLinkVPCId`和 `ClassicLinkVPCSecurityGroups` 屬性無法用於啟動範本，因為 EC2-Classic 不再可用。