使用 AWS CloudFormation 設計工具修改堆疊的範本 - AWS CloudFormation

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

使用 AWS CloudFormation 設計工具修改堆疊的範本

注意

CloudFormation 主控台模式中的基礎設施編譯器是 AWS CloudFormation Designer 的改進。我們建議您盡可能使用 Infrastructure Composer 而非 Designer。如需詳細資訊,請參閱使用 Infrastructure Composer 以視覺化方式建立範本

您可以使用AWS CloudFormation 設計工具修改堆疊的範本,然後將其提交至 AWS CloudFormation 以更新堆疊。一般而言,當您修改堆疊時,您需要取得其範本的副本、在文字編輯器中修改範本,然後使用 CloudFormation 更新堆疊。使用 AWS CloudFormation 設計工具,您可以快速取得任何執行中堆疊範本的副本、修改範本,然後更新堆疊,而不必離開主控台。

在此演練中,我們將從基本 Web 伺服器堆疊開始,然後修改它,使 Web 伺服器可擴展且安全耐久。

在此演練期間,我們將完成以下步驟:

  1. 取得堆疊的範本

    我們將取得執行中堆疊之範本的範本,與以下逐步解說中相同的基本 Web 伺服器堆疊:使用 AWS CloudFormation 設計工具建立基本 Web 伺服器

  2. 修改範本

    我們將使用 AWS CloudFormation 設計工具來修改堆疊的範本,以使用 Auto Scaling 群組和 Elastic Load Balancing 負載平衡器取代EC2執行個體,讓您的網站具有可擴展性和耐用性。

  3. 更新堆疊

    儲存修改之後,我們將以修改後的範本更新基本 Web 伺服器堆疊。

    注意

    CloudFormation 是一項免費服務;但是,您需要按照每個服務的最新費率,支付堆疊中包含 AWS 的資源費用。如需有關 AWS 定價的詳細資訊,請參閱 http://aws.amazon.com 上各項產品的詳細資訊頁面。

  4. 刪除堆疊

    我們將刪除堆疊以清除所有資源。

必要條件

本演練假設您具備 Amazon Virtual Private Cloud (AmazonVPC)、Auto Scaling 、Elastic Load Balancing 和 的工作知識 CloudFormation。在內容方面,每個程序都提供各項資源的一些基本資訊。

另外,此逐步解說假設您已完成以下逐步解說:使用 AWS CloudFormation 設計工具建立基本 Web 伺服器。透過該逐步解說,您應已擁有名為 BasicWebServerStack 的執行中堆疊。

步驟 1:取得堆疊範本

在此步驟中,我們將使用 AWS CloudFormation 設計工具取得並開啟執行中堆疊範本的副本。

取得執行中堆疊之範本的副本
  1. 在 開啟 CloudFormation 主控台https://console.aws.amazon.com/cloudformation/

  2. 從堆疊清單中,選擇 BasicWebServerStack

  3. 選擇 Actions (動作),然後選擇 View/Edit template in Designer (在設計工具中檢視/編輯範本)

CloudFormation 會取得BasicWebServerStack堆疊範本的副本,並在 AWS CloudFormation 設計工具中顯示,您可以在其中檢視範本資源及其關係。在下列步驟中,我們將使用 AWS CloudFormation 設計工具來修改範本。

步驟 2:修改範本

我們將使用 AWS CloudFormation Designer 的 drag-and-drop介面和整合的 JSON和YAML編輯器來修改基本 Web 伺服器範本,以 Auto Scaling 群組和負載平衡器取代單一 Amazon EC2執行個體,讓網站可擴展。如果網站流量突然增加,請使用 Auto Scaling 快速增加 Web 伺服器的數量。負載平衡器將在您的執行個體之間平均分配流量。

修改堆疊範本
  1. 移除 WebServerInstance 資源。

    1. WebServerInstance 資源上按一下滑鼠右鍵。

    2. 從資源功能表中,選擇刪除 (垃圾筒圖示)。

    3. 選擇 OK (確定) 以確認。

  2. 資源類型窗格中,將下列資源新增至PublicSubnet資源:AutoScalingGroupLaunchConfigurationLoadBalancer。在新增資源之前,您可能需要擴展子網路以包含所有資源。

    資源會依資源類別來組織。Auto Scaling 群組和啟動組態位於 AutoScaling類別中,負載平衡器位於 ElasticLoadBalancing類別中。

    注意

    這些資源不遵循容器模型,因此 AWS CloudFormation 設計器不會自動將其與子網路建立關聯。我們稍後會在此步驟中建立連線。

  3. EC2類別中的資源類型窗格中,在子網路中VPC以外的任何位置新增SecurityGroup資源。

    此安全群組將控制負載平衡器的傳入和傳出流量。

  4. 重新命名資源,讓它們更容易地識別:

    • 重新命名 AutoScalingGroupWebServerFleet

    • 重新命名 LaunchConfigurationWebServerLaunchConfig

    • 重新命名 LoadBalancerPublicElasticLoadBalancer

    • 重新命名 SecurityGroupPublicLoadBalancerSecurityGroup

  5. 為您新增的資源建立關聯。

    1. 建立負載平衡器及 Auto Scaling 群組資源與公有子網路的關聯:

      • PublicElasticLoadBalancer 資源,將 AWS::EC2::Subnet (Property: Subnets) 連線拖曳至 PublicSubnet 資源。

      • WebServerFleet 資源,將 AWS::EC2::Subnet (Property: VPCZoneIdentifier) 連線拖曳至 PublicSubnet 資源。

    2. 建立負載平衡器與其安全群組的關聯:

      • PublicElasticLoadBalancer 資源,將 AWS::EC2::SecurityGroup (Property: SecurityGroups) 連線拖曳至 PublicLoadBalancerSecurityGroup 資源。

    3. 建立 Auto Scaling 群組與負載平衡器及啟動組態的關聯:

      • WebServerFleet 資源,將 AWS::ElasticLoadBalancing::LoadBalancer (Property: LoadBalancerNames) 連線拖曳至 PublicElasticLoadBalancer 資源。

      • WebServerFleet 資源,將 AWS::ElasticLoadBalancing::LaunchConfiguration (Property: LaunchConfigurationName) 連線拖曳至 WebServerLaunchConfig 資源。

    4. 建立啟動組態與安全群組的關聯:

      • WebServerLaunchConfig 資源,將 AWS::EC2::SecurityGroup (Property: SecurityGroups) 連線拖曳至 WebServerSecurityGroup 資源。

    5. 定義 Auto Scaling 群組對公有路由的相依性:

      • WebServerFleet 資源,將 DependsOn 連線拖曳至 PublicRoute 資源。

      此相依性表示在公有路由完成之前 CloudFormation ,不會建立WebServerFleet資源。否則,如果 Web 伺服器執行個體啟動時無法使用公有路由,則無法傳送訊號 (使用 cfn-signal 協助程式指令碼) 來通知其組態和應用程式部署完成 CloudFormation 的時間。

  6. 指定您新增資源的屬性。

    1. 在 AWS CloudFormation 設計工具畫布上,選擇 PublicElasticLoadBalancer 資源。

    2. 在整合式編輯器窗格中,選擇 Properties (屬性) 標籤,然後複製以下程式碼片段並貼在 Properties (屬性) 大括號 ({}) 之間。

      AWS CloudFormation 設計器會自動新增安全群組和子網路關聯,因此您只需要新增 ListenersHealthCheck 屬性。Listeners 屬性指定要監聽哪裡的哪種流量類型,HealthCheck 屬性則描述用於判斷負載平衡器運作狀態的設定。

      JSON

      "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": "80", "Protocol": "HTTP" } ], "HealthCheck": { "Target": "HTTP:80/", "HealthyThreshold": "3", "UnhealthyThreshold": "5", "Interval": "90", "Timeout": "60" }, "SecurityGroups": [ { "Ref": "PublicLoadBalancerSecurityGroup" } ], "Subnets": [ { "Ref": "PublicSubnet" } ]

      YAML

      Listeners: - LoadBalancerPort: '80' InstancePort: '80' Protocol: HTTP HealthCheck: Target: 'HTTP:80/' HealthyThreshold: '3' UnhealthyThreshold: '5' Interval: '90' Timeout: '60' SecurityGroups: - !Ref PublicLoadBalancerSecurityGroup Subnets: - !Ref PublicSubnet
    3. 針對下列資源重複這個程序:

      WebServerFleet

      新增 MaxSizeMinSizeDesiredCapacity 屬性。這些屬性指定您可在 Auto Scaling 群組中啟動的執行個體最大和最小數量,以及啟動的執行個體初始數量。所需的容量數值是指新的參數,我們將在此程序稍後新增。

      JSON

      "MinSize": "1", "MaxSize": "10", "DesiredCapacity": { "Ref": "WebServerCount" }, "VPCZoneIdentifier": [ { "Ref": "PublicSubnet" } ], "LaunchConfigurationName": { "Ref": "WebServerLaunchConfig" }, "LoadBalancerNames": [ { "Ref": "PublicElasticLoadBalancer" } ]

      YAML

      MinSize: '1' MaxSize: '10' DesiredCapacity: !Ref WebServerCount VPCZoneIdentifier: - !Ref PublicSubnet LaunchConfigurationName: !Ref WebServerLaunchConfig LoadBalancerNames: - !Ref PublicElasticLoadBalancer
      PublicLoadBalancerSecurityGroup

      新增以下傳入和傳出規則,以判斷可到達與離開負載平衡器的流量。這些規則允許所有HTTP流量到達和離開負載平衡器。

      JSON

      "GroupDescription": "Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" } ], "SecurityGroupEgress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" } ], "VpcId": { "Ref": "VPC" }

      YAML

      GroupDescription: >- Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 SecurityGroupEgress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 VpcId: !Ref VPC
      WebServerSecurityGroup

      修改HTTP傳入規則以僅允許來自負載平衡器的流量。

      JSON

      "GroupDescription": "Allow access from load balancer and SSH traffic", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "SourceSecurityGroupId": { "Ref": "PublicLoadBalancerSecurityGroup" } }, { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": { "Ref": "SSHLocation" } } ], "VpcId": { "Ref": "VPC" }

      YAML

      VpcId: !Ref VPC GroupDescription: Allow access from load balancer and SSH traffic SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 SourceSecurityGroupId: !Ref PublicLoadBalancerSecurityGroup - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation
      WebServerLaunchConfig

      啟動組態有多種您必須指定的不同屬性,因此我們將僅說明其中幾個屬性。InstanceTypeImageId 屬性會使用我們在範本中指定的參數和對應值。在建立堆疊時,您可以將執行個體類型指定為參數值。ImageId 值為映射項目,其會以您的堆疊區域及您指定的執行個體類型為依據。

      UserData 屬性中,我們會指定要在執行個體啟動與執行之後執行的組態指令碼。執行個體的中繼資料定義組態資訊;我們會在下一個步驟中新增此中繼資料。

      JSON

      "InstanceType": { "Ref": "InstanceType" }, "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ] } ] }, "KeyName": { "Ref": "KeyName" }, "AssociatePublicIpAddress": "true", "UserData": { "Fn::Base64": { "Fn::Join": [ "", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerLaunchConfig ", " --configsets All ", " --region ", { "Ref": "AWS::Region" }, "\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerFleet ", " --region ", { "Ref": "AWS::Region" }, "\n" ] ] } }, "SecurityGroups": [ { "Ref": "WebServerSecurityGroup" } ]

      YAML

      InstanceType: !Ref InstanceType ImageId: !FindInMap - AWSRegionArch2AMI - !Ref 'AWS::Region' - !FindInMap - AWSInstanceType2Arch - !Ref InstanceType - Arch KeyName: !Ref KeyName AssociatePublicIpAddress: 'true' UserData: !Base64 'Fn::Join': - '' - - | #!/bin/bash -xe - | yum install -y aws-cfn-bootstrap - | # Install the files and packages from the metadata - '/opt/aws/bin/cfn-init -v ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerLaunchConfig ' - ' --configsets All ' - ' --region ' - !Ref 'AWS::Region' - |+ - | # Signal the status from cfn-init - '/opt/aws/bin/cfn-signal -e $? ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerFleet ' - ' --region ' - !Ref 'AWS::Region' - |+ SecurityGroups: - !Ref WebServerSecurityGroup
  7. 將啟動組態中繼資料新增至 WebServerLaunchConfig 資源,以指示 cfn-init 協助程式指令碼啟動 Web 伺服器並建立基本網頁。

    1. 選擇 WebServerLaunchConfig 資源,然後選擇整合式編輯器中的 Metadata (中繼資料) 標籤。

    2. 如果您要在 中撰寫範本JSON:在支架 ({}Metadata 內,在AWS::CloudFormation::Designer關閉支架之後,新增逗號 (,)。

    3. 將下列程式碼片段新增至 AWS::CloudFormation::Designer 屬性之後,以指示 cfn-init 協助程式指令碼啟動 Web 伺服器並建立基本網頁。

      JSON

      "AWS::CloudFormation::Init" : { "configSets" : { "All" : [ "ConfigureSampleApp" ] }, "ConfigureSampleApp" : { "packages" : { "yum" : { "httpd" : [] } }, "files" : { "/var/www/html/index.html" : { "content" : { "Fn::Join" : ["\n", [ "<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>" ]]}, "mode" : "000644", "owner" : "root", "group" : "root" } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" } } } } }

      YAML

      'AWS::CloudFormation::Init': configSets: All: - ConfigureSampleApp ConfigureSampleApp: packages: yum: httpd: [] files: /var/www/html/index.html: content: !Join - |+ - - >- <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> mode: '000644' owner: root group: root services: sysvinit: httpd: enabled: 'true' ensureRunning: 'true'
  8. 新增 WebServerCount 參數。此參數指定在建立 Auto Scaling 群組時要 CloudFormation 建立的執行個體數量。

    1. 在 AWS CloudFormation 設計工具畫布上的開放區域選取 。

    2. 在整合式編輯器窗格中,選擇 Parameters (參數) 標籤。

    3. 在 整合式編輯器 中,新增以下參數。如果您要在 中撰寫範本JSON,請視需要新增逗號。

      JSON

      "WebServerCount": { "Description": "Number of Amazon EC2 instances to launch for the WebServer server", "Type": "Number", "Default": "1" }

      YAML

      WebServerCount: Description: Number of Amazon EC2 instances to launch for the WebServer server Type: Number Default: '1'
  9. 修改範本輸出以顯示負載平衡器DNS的名稱。

    1. 在整合式編輯器窗格中,選擇 Outputs (輸出) 標籤。

    2. 修改 JSON以使用負載平衡器DNS名稱,如下列程式碼片段所示。

      JSON

      { "Outputs": { "URL": { "Value": { "Fn::GetAtt": [ "PublicElasticLoadBalancer", "DNSName" ] }, "Description": "Newly created application URL" } } }

      如果您要在 中撰寫範本YAML,請使用下列程式碼片段。

      Outputs: URL: Value: !GetAtt - PublicElasticLoadBalancer - DNSName Description: Newly created application URL
  10. 在 AWS CloudFormation 設計工具工具列上,選擇驗證範本 (核取方塊圖示) 以檢查範本中的語法錯誤。

    Messages (訊息) 窗格中檢視並修復錯誤,接著再次驗證範本。如果您沒有看到錯誤,表示該範本的語法有效。

  11. 從 AWS CloudFormation 設計工具工具列中,選擇檔案功能表 (檔案圖示),然後在本機儲存範本。

您現在有修改過的 CloudFormation 範本,可用來更新基本 Web 伺服器堆疊。在下個步驟中,我們將使用此範本來更新基本 Web 伺服器堆疊。

步驟 3:更新堆疊

若要實作您的範本變更,我們需要更新基本 Web 伺服器堆疊。您可以直接從 AWS CloudFormation 設計工具啟動 CloudFormation 更新堆疊精靈。

更新堆疊
  1. 在 AWS CloudFormation 設計工具工具列上,選擇建立堆疊 (具有向上箭頭的雲端圖示)。

    AWS CloudFormation Designer 會將開啟的 CloudFormation範本儲存在 S3 儲存貯體中,然後啟動更新堆疊精靈。因為我們修改了BasicWebServerStack堆疊的範本, CloudFormation 會啟動該堆疊的更新堆疊精靈。

  2. CloudFormation 會自動填入範本 URL;選擇下一步

  3. Stack (堆疊) 區段的 Name (名稱) 欄位中,確認堆疊名稱為 BasicWebServerStack

  4. Parameters (參數) 區段中,使用現有的值;選擇 Next (下一步)。

  5. 在此逐步解說中,您不需要新增標籤或指定進階設定,因此請選擇 Next (下一步)

  6. 確定堆疊名稱正確,然後選擇 Update (更新)

CloudFormation 更新堆疊可能需要幾分鐘的時間。若要監控進度,請檢視堆疊事件。如需詳細資訊,請參閱從 CloudFormation 主控台檢視堆疊資訊。更新堆疊之後,請檢視堆疊輸出並前往網站URL,以確認網站是否正在執行。如需詳細資訊,請參閱從 CloudFormation 主控台檢視堆疊資訊。您已成功使用 AWS CloudFormation 設計工具更新範本和堆疊。

為了確保您不需要為不必要的服務支付費用,您可以刪除堆疊。

步驟 4:清除資源

為避免您為不需要的服務支付費用,請刪除您的堆疊及其資源。

刪除堆疊
  1. 從 CloudFormation 主控台中選擇BasicWebServerStack堆疊。

  2. 選擇 Delete Stack (刪除堆疊)

  3. 在確認訊息中,選擇 Yes, Delete (是,刪除)

CloudFormation 刪除堆疊可能需要幾分鐘的時間。若要監控進度,請檢視堆疊事件。刪除堆疊後,會一併刪除您建立的所有資源。現在您已了解如何使用 AWS CloudFormation 設計工具,您可以使用它來建置和修改自己的範本。