建立您的第一個堆疊 - AWS CloudFormation

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

建立您的第一個堆疊

本主題會逐步引導您使用 建立您的第一個 CloudFormation 堆疊 AWS Management Console。遵循本教學課程,您將了解如何佈建基本 AWS 資源、監控堆疊事件和產生輸出。

在此範例中,CloudFormation 範本是以 YAML 撰寫。YAML 是一種人類可讀格式,廣泛用於將基礎設施定義為程式碼。當您進一步了解 CloudFormation 時,您可能也會遇到 JSON 格式的其他範本,但在本教學課程中,為了方便閱讀,會選擇 YAML。

注意

CloudFormation 是免費的,但您需要為您建立的 Amazon EC2 和 Amazon S3 資源付費。不過,如果您不熟悉 AWS,則可以利用 免費方案,在此學習過程中將成本降至最低或消除。

先決條件

  • 您必須具有 IAM 使用者或角色 AWS 帳戶 的 存取權,該角色具有使用 Amazon EC2、Amazon S3 和 CloudFormation 的許可,或管理使用者存取權。

  • 您必須擁有可存取網際網路的 Virtual Private Cloud (VPC)。此演練範本需要預設 VPC,它會自動隨附較新的 AWS 帳戶。如果您沒有預設 VPC,或已刪除 VPC,請參閱本主題的故障診斷一節以取得替代解決方案。

使用主控台建立 CloudFormation 堆疊

使用主控台建立 Hello world CloudFormation 堆疊
  1. 開啟 CloudFormation 主控台

  2. 選擇 Create Stack (建立堆疊)。

  3. 建立堆疊頁面上,選擇從 Infrastructure Composer 建置,然後在 Infrastructure Composer 中建立。這會將您帶到 CloudFormation 主控台模式中的 Infrastructure Composer,您可以在其中上傳和驗證範例範本。

  4. 若要上傳和驗證範例範本,請執行下列動作:

    1. 選擇 範本。然後,將下列 CloudFormation 範本複製並貼到範本編輯器中:

      AWSTemplateFormatVersion: 2010-09-09 Description: CloudFormation Template for WebServer with Security Group and EC2 Instance Parameters: LatestAmiId: Description: The latest Amazon Linux 2 AMI from the Parameter Store Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>' Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2' InstanceType: Description: WebServer EC2 instance type Type: String Default: t2.micro AllowedValues: - t3.micro - t2.micro ConstraintDescription: must be a valid EC2 instance type. MyIP: Description: Your IP address in CIDR format (e.g. 203.0.113.1/32). Type: String MinLength: '9' MaxLength: '18' Default: 0.0.0.0/0 AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. Resources: WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTP access via my IP address SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: !Ref MyIP WebServer: Type: AWS::EC2::Instance Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType SecurityGroupIds: - !Ref WebServerSecurityGroup UserData: !Base64 | #!/bin/bash yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd echo "<html><body><h1>Hello World!</h1></body></html>" > /var/www/html/index.html Outputs: WebsiteURL: Value: !Join - '' - - http:// - !GetAtt WebServer.PublicDnsName Description: Website URL

      在進行下一個步驟之前,讓我們花點時間查看範本並了解一些重要的 CloudFormation 概念。

      • Parameters 區段宣告可在您建立堆疊時傳遞至範本的值。在範本中稍後指定的資源會參考這些值並使用資料。參數是指定您不想存放在範本本身的資訊的有效方式。它們也是指定資訊的一種方式,這些資訊對於您要部署的特定應用程式或組態可能是唯一的。

      • 範本定義下列參數:

        • LatestAmiId – 從 AWS Systems Manager 參數存放區擷取最新的 Amazon Linux 2 AMI ID。

        • InstanceType – 允許選取 EC2 執行個體類型 (預設值:t2.micro,允許:t3.microt2.micro)。

        • MyIP – 指定 HTTP 存取的 IP 地址範圍 (預設值:0.0.0.0/0,允許從任何 IP 存取)。

      • Resources 區段包含您要使用範本建立 AWS 的資源定義。資源宣告是一次指定所有組態設定的有效方式。當您在範本中包含資源宣告時,您可以使用該範本建立堆疊,來建立和設定所有宣告的資源。您也可以從相同的範本建立新的堆疊,以啟動相同的資源組態。

      • 此範本會建立以下資源:

        • WebServerSecurityGroup – EC2 安全群組,允許連接埠 80 上來自指定 IP 範圍的傳入 HTTP 流量。

        • WebServer – 具有下列組態的 EC2 執行個體:

          • 使用最新的 Amazon Linux 2 AMI

          • 套用選取的執行個體類型

          • WebServerSecurityGroup新增至 SecurityGroupIds 屬性

          • 包含使用者資料指令碼以安裝 Apache HTTP 伺服器

      • 邏輯名稱會在每個資源和參數宣告的開頭指定。例如, WebServerSecurityGroup是指派給 EC2 安全群組資源的邏輯名稱。然後,該Ref函數會透過其在範本其他部分中的邏輯名稱來參考資源和參數。當一個資源參考另一個資源時,這會在它們之間建立相依性。

      • Outputs 區段定義堆疊建立後傳回的自訂值。您可以使用輸出值,從堆疊中的資源傳回資訊,例如資源識別符或 URLs。

      • 範本會定義一個輸出:

        • WebsiteURL – 已部署 Web 伺服器的 URL,使用 EC2 執行個體的公有 DNS 名稱建構。Join 函數有助於將固定的 http://與 變數合併PublicDnsName為單一字串,讓您輕鬆地輸出 Web 伺服器的完整 URL。

    2. 選擇驗證,以確保 YAML 程式碼在上傳範本之前有效。

    3. 接著,選擇建立範本以建立範本,並將其新增至 S3 儲存貯體。

    4. 從開啟的對話方塊中,記下 S3 儲存貯體的名稱,以便稍後刪除它。然後,選擇確認並繼續前往 CloudFormation。這將帶您前往 CloudFormation 主控台,其中現在已指定範本的 S3 路徑。

  5. 建立堆疊頁面上,選擇下一步

  6. 指定堆疊詳細資訊頁面上,在堆疊名稱欄位中輸入名稱。堆疊不可含有空格。在此範例中,使用 MyTestStack

  7. 參數下,指定參數值,如下所示:

    • LatestAmiId:這是預設設定為最新的 Amazon Linux 2 AMI。

    • InstanceType:為 EC22 執行個體類型選擇 t2.microt3.micro。

      注意

      如果您是初次使用 AWS,您可以使用免費方案免費啟動和使用t2.micro執行個體 12 個月 (在t2.micro無法使用的區域中,您可以在免費方案下使用t3.micro執行個體)。

    • MyIP:使用尾碼指定實際公有 IP /32 地址。尾碼用於 CIDR /32 表示法,以指定允許單一 IP 地址。這基本上意味著允許進出此特定 IP 地址的流量,而不是其他 IP 地址。

  8. 選擇下一步兩次以前往檢閱和建立頁面。在本教學課程中,您可以在設定堆疊選項頁面上保留預設值。

  9. 檢閱堆疊的資訊。當您滿意設定時,請選擇 Submit (提交)

監控堆疊建立

選擇提交後,CloudFormation 會開始建立範本中指定的資源。您的新堆疊 MyTestStack 會出現在 CloudFormation 主控台上方部分的清單中。其狀態應為 CREATE_IN_PROGRESS。您可以透過檢視其事件來查看堆疊的詳細狀態。

檢視堆疊的事件
  1. 在 CloudFormation 主控台MyTestStack上,選擇清單中的堆疊。

  2. 在堆疊詳細資訊窗格中,選擇 Events (事件) 標籤。

    主控台會每隔 60 秒自動重新整理事件清單,以包含最新的事件。

Events (事件) 標籤會顯示堆疊建立過程中的每個主要步驟,並依每個事件的時間排序,最新的事件放在最上方。

第一個事件 (位於事件清單的底部) 是開始堆疊建立程序:

2024-12-23 18:54 UTC-7 MyTestStack CREATE_IN_PROGRESS User initiated

接下來是標記每個資源建立開始和完成的事件。例如,建立 EC2 執行個體會產生下列項目:

2024-12-23 18:59 UTC-7 WebServer CREATE_COMPLETE

2024-12-23 18:54 UTC-7 WebServer CREATE_IN_PROGRESS Resource creation initiated

當 CloudFormation 報告已開始建立資源時,會記錄 CREATE_IN_PROGRESS 事件。當資源成功建立時,會記錄 CREATE_COMPLETE 事件。

當 CloudFormation 已成功建立堆疊時,您會在 Events (事件) 標籤頂端看到下列事件:

2024-12-23 19:17 UTC-7 MyTestStack CREATE_COMPLETE

如果 CloudFormation 無法建立資源,它會報告 CREATE_FAILED 事件,且預設會復原堆疊並刪除任何已建立的資源。Status Reason (狀態原因) 欄會顯示導致失敗的問題。

堆疊建立之後,您可以前往資源索引標籤,以檢視您建立的 EC2 執行個體和安全群組。

測試 Web 伺服器

成功建立堆疊後,導覽至 CloudFormation 主控台中的輸出索引標籤。尋找 WebsiteURL 欄位。這將包含 EC2 執行個體的公有 URL。

開啟瀏覽器並前往 WebsiteURL 下列出的 URL。您應該會在瀏覽器中看到簡單的"Hello World!"訊息。

這確認您的 EC2 執行個體正在執行 Apache HTTP Server 並提供基本網頁。

故障診斷

如果您在堆疊建立期間遇到轉返,可能是因為缺少 VPC。以下是如何解決此問題的方法。

沒有可用的預設 VPC

此演練中的範本需要預設 VPC。如果您的堆疊建立因 VPC 或子網路可用性錯誤而失敗,您的帳戶中可能沒有預設 VPC。您有下列選項:

  • 建立新的預設 VPC – 您可以透過 Amazon VPC 主控台建立新的預設 VPC。如需說明,請參閱《Amazon VPC 使用者指南》中的建立預設 VPC。

  • 修改範本以指定子網路 – 如果您有非預設 VPC,您可以修改範本以明確指定 VPC 和子網路 IDs。將下列參數新增至範本:

    SubnetId: Description: The subnet ID to launch the instance into Type: AWS::EC2::Subnet::Id

    然後,更新 WebServer 資源以包含子網路 ID:

    WebServer: Type: AWS::EC2::Instance Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType SecurityGroupIds: - !Ref WebServerSecurityGroup SubnetId: !Ref SubnetId UserData: !Base64 | #!/bin/bash yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd echo "<html><body><h1>Hello World!</h1></body></html>" > /var/www/html/index.html

    建立堆疊時,您需要指定具有網際網路存取權的子網路,才能連線 Web 伺服器。

清除

若要確定您不會針對任何不想要的服務支付費用,您可以透過刪除堆疊及其資源來清除這些服務。您也可以刪除存放堆疊範本的 S3 儲存貯體。

刪除堆疊及其資源
  1. 開啟 CloudFormation 主控台

  2. 堆疊頁面上,選取您所建立堆疊名稱旁的選項 (MyTestStack),然後選擇刪除

  3. 出現確認提示時,請選擇刪除

  4. 事件索引標籤上監控堆疊刪除程序的進度。MyTestStack 的狀態會變更為 DELETE_IN_PROGRESS。當 CloudFormation 完成刪除堆疊時,它會從清單移除堆疊。

如果您已完成使用範例範本,且不再需要您的 Amazon S3 儲存貯體,請將其刪除。您必須先將其清空,才能刪除儲存貯體。清空儲存貯體會刪除其中的所有物件。

若要清空和刪除 Amazon S3 儲存貯體
  1. 開啟 Amazon S3 主控台

  2. 在主控台左側的導覽窗格中,選擇 Buckets (儲存貯體)

  3. 儲存貯體清單中,選取您為此教學課程建立的儲存貯體名稱旁的選項,然後選擇空白

  4. 清空儲存貯體頁面上的文字欄位中輸入 permanently delete,以確認您要清空儲存貯體,然後選擇清空

  5. Empty bucket: Status (清空儲存貯體:狀態) 頁面上監控儲存貯體清空的進度。

  6. 若要返回儲存貯體清單,請選擇 Exit (結束)

  7. 選取儲存貯體名稱旁的選項,然後選擇刪除

  8. 出現確認提示時,請輸入儲存貯體的名稱,然後選擇刪除儲存貯體。

  9. 從儲存貯體清單中監控儲存貯體刪除程序的進度。當 Amazon S3 完成刪除儲存貯體時,會從清單中移除儲存貯體。

後續步驟

恭喜您!您已成功建立堆疊、監控其建立,並使用其輸出。

若要繼續學習: