移轉 AWS CloudFormation 堆疊以啟動範本 - Amazon EC2 Auto Scaling

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

移轉 AWS CloudFormation 堆疊以啟動範本

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

移轉至啟動範本時,本主題會提供將 CloudFormation 堆疊範本中的啟動設定重寫為啟動範本的指示,以節省您的時間。如需將啟動組態遷移到啟動範本的詳細資訊,請參閱 移轉「自 Auto Scaling」群組以啟動範本

尋找使用啟動組態的 Auto Scaling 群組

尋找使用啟動組態的 Auto Scaling 群組
  • 使用下列指describe-auto-scaling-groups令列出在指定區域中使用啟動組態的 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」群組移轉「自 Auto Scaling」群組以啟動範本

重要

如果你的堆棧資源有他們AWSEB的名字,這意味著它們是通過創建的 AWS Elastic Beanstalk。在這種情況下,您必須更新 Beanstalk 環境以指示 Elastic Beanstalk 移除啟動組態並將其替換為啟動範本。

更新堆疊以使用啟動範本

請依照本章節中的步驟,執行下列操作:

  • 使用同等的啟動範本屬性,將啟動組態重寫為啟動範本。

  • 將新的啟動範本與 Auto Scaling 群組關聯。

  • 部署這些更新。

修改堆疊範本並更新堆疊
  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 使用者指南LaunchTemplate中的AWSEC2LaunchTemplateAWSEC2:

    請注意啟動範本如何包含值為 !Sub ${AWS::StackName}-launch-templateLaunchTemplateName 屬性。如果您想要啟動範本的名稱包含堆疊名稱,則需執行此動作。

  3. 如果IamInstanceProfile屬性存在於啟動組態中,您必須將其轉換為結構,並指定執行個體設定檔的ARN名稱或名稱。如需範例,請參閱AWSEC2:: LaunchTemplate AWS

  4. 如果啟動組態中存在 AssociatePublicIpAddressInstanceMonitoringPlacementTenancy 屬性,則必須將其轉換成一個結構。如需範例,請參閱AWSEC2:LaunchTemplateAWS

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

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

  6. 如果啟動組態中有任何NoDevice設定為的BlockDeviceMapping結構true,則必須在啟動範本NoDevice中為其指定空字串,讓 Amazon EC2 省略裝置。

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

    若要請求 Spot 執行個體,您會有兩個互斥的選項:

    • 第一個選項是使用啟動範本中的 InstanceMarketOptions 結構 (不建議使用)。如需詳細資訊,請參閱《AWS CloudFormation 使用指南》LaunchTemplate InstanceMarketOptions中的AWSEC2LaunchTemplate InstanceMarketOptionsAWSEC2:

    • 另一個選項是將 MixedInstancesPolicy 結構新增至您的 Auto Scaling 群組。這樣做會為您發出請求的方式提供更多選項。啟動範本中的 Spot 執行個體請求不支援每個 Auto Scaling 群組選取一個以上的執行個體類型。但是混合執行個體政策則支援每個 Auto Scaling 群組選取一個以上的執行個體類型。Spot 執行個體請求受益於有多種執行個體類型可供選擇。如需詳細資訊,請參閱《AWS CloudFormation 使用指南》AutoScalingGroup MixedInstancesPolicy中的AWSAutoScalingAutoScalingGroup MixedInstancesPolicyAWSAutoScaling:

  8. AWS::: AutoScaling AutoScalingGroup 資源中移除LaunchConfigurationName屬性。在該位置新增啟動範本。

    在下列範例中,Ref 內建函數會取得具有邏輯 ID AWSEC2::: LaunchTemplate AWS 資源的識別碼。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 支援之所有屬性的參考資訊,請參閱AWS CloudFormation 使用者指南AutoScalingGroup中的AWSAutoScalingAutoScalingGroupAWSAutoScaling:

  9. 當您準備好部署這些更新時,請遵循以下 CloudFormation程序,以修改過的堆疊範本更新堆疊。如需詳細資訊,請參閱《AWS CloudFormation 使用者指南》中的修改堆疊範本

了解更新堆疊資源的行為

CloudFormation 通過比較您提供的更新模板和您在舊版堆棧模板中描述的資源配置之間的更改來更新堆棧資源。尚未變更的資源組態在更新程序期間不會受到影響。

CloudFormation 支援「Auto Scaling」群組的UpdatePolicy屬性。在更新期間,如果設定UpdatePolicyAutoScalingRollingUpdate,則會在執行此程序中的步驟後 CloudFormation 取代InService例證。如果設定UpdatePolicyAutoScalingReplacingUpdate,則 CloudFormation 會取代「Auto Scaling」群組及其暖池 (如果有的話)。

如果您沒有為 Auto Scaling 群組指定UpdatePolicy屬性,則會檢查啟動範本的正確性,但 CloudFormation 不會在 Auto Scaling 群組中的執行個體之間部署任何變更。所有新的執行個體均將使用您的啟動範本,但現有的執行個體會繼續使用其原先啟動的組態來執行 (儘管啟動組態已不存在)。當您變更購買選項時,例如新增混合執行個體政策時,則屬例外情況。在這種情況下,Auto Scaling 群組會逐漸以新的執行個體取代現有的執行個體,以符合新的購買選項。

追蹤遷移

追蹤遷移
  1. AWS CloudFormation 主控台選取更新過的堆疊,接著選擇 Events (事件) 標籤來檢視堆疊事件。

  2. 若要使用最近的事件更新事件清單,請選擇 CloudFormation 主控台中的重新整理按鈕。

  3. 當您的推疊更新時,您會發現每個資源更新了多個事件。如果您在狀態原因欄中看到例外狀況,表示嘗試建立啟動範本時發生了問題,請參閱 疑難排解 Amazon EC2 Auto Scaling:啟動範本 了解潛在原因。

  4. (可選)根據您對UpdatePolicy屬性的使用情況,您可以從 Amazon EC2 主控台的「自動擴展」群組頁面監控 Auto Scaling 群組的進度。選取 Auto Scaling 群組。在 Activity (活動) 索引標籤的 Activity history (活動歷史記錄) 中,Status (狀態) 欄位會顯示 Auto Scaling 群組是否已成功啟動或終止執行個體,或擴展活動是否仍在進行中。

  5. 當堆疊更新完成時,會 CloudFormation 發出UPDATE_COMPLETE堆疊事件。如需詳細資訊,請參閱《AWS CloudFormation 使用者指南》中的監控堆疊更新的進度

  6. 堆疊更新完成後,開啟 Amazon EC2 主控台的「啟動範本」頁面和「啟動設定」頁面。您會發現新的啟動範本已建立,並且啟動組態已刪除。

啟動組態對應參考

基於參考目的,下表列出AWS:::: AutoScaling LaunchConfiguration 資源中的所有頂層屬性及其對應屬性位於AWSEC2:: LaunchTemplate AWS 資源中。

啟動組態來源屬性 啟動範本目標屬性
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 已不再可用。