

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

# 建立您的第一個堆疊
<a name="gettingstarted.walkthrough"></a>

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

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

**注意**  
CloudFormation 是免費的，但您需要為建立的 Amazon EC2 和 Amazon S3 資源付費。不過，如果您是新手 AWS，則可以利用 [免費方案](https://aws.amazon.com/free/)，在此學習過程中將成本降至最低或消除。

**Topics**
+ [先決條件](#getting-started-prerequisites)
+ [使用主控台建立 CloudFormation 堆疊](#getting-started-create-stack)
+ [監控堆疊建立](#getting-started-monitor-stack-creation)
+ [測試 Web 伺服器](#getting-started-test-web-server)
+ [疑難排解](#getting-started-troubleshooting)
+ [清除](#getting-started-clean-up)
+ [後續步驟](#getting-started-next-steps)

## 先決條件
<a name="getting-started-prerequisites"></a>
+ 您必須具有 IAM 使用者或角色 AWS 帳戶 的存取權，該角色具有使用 Amazon EC2、Amazon S3 和 CloudFormation 的許可，或管理使用者存取權。
+ 必須擁有可存取網際網路的虛擬私有雲端 (VPC)。此逐步解說範本需要預設的 VPC，較新的 AWS 帳戶會自動提供它。如果沒有預設的 VPC，或已刪除它，請參閱本主題中的疑難排解一節，了解替代解決方案。

## 使用主控台建立 CloudFormation 堆疊
<a name="getting-started-create-stack"></a>

**使用主控台建立 Hello world CloudFormation 堆疊**

1. 開啟 [CloudFormation 主控台](https://console.aws.amazon.com/cloudformation/)。

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

1. 在**建立堆疊**頁面中，選擇**從 Infrastructure Composer 中建置**，然後選擇**在 Infrastructure Composer 中建立**。您會進入 CloudFormation 主控台模式中的 Infrastructure Composer，可以在其中上傳和驗證範例範本。

1. 若要上傳和驗證範例範本，請執行下列動作：

   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 Parameter Store 中擷取最新的 Amazon Linux 2 AMI ID。
        + **`InstanceType`** – 允許選取 EC2 執行個體類型 (預設值：`t2.micro`，允許的值：`t3.micro`，`t2.micro`)。
        + **`MyIP`** – 指定 HTTP 存取的 IP 位址範圍 (預設值：0.0.0.0/0，允許從任何 IP 中存取)。
      + **`Resources`** 區段包含您要使用範本建立 AWS 的資源定義。資源宣告是一次指定所有組態設定的有效方式。當您將資源宣告包含在範本中時，可以透過使用範本建立堆疊，來建立及設定所有宣告的資源。也可以從相同的範本中建立新堆疊，以啟動相同的資源組態。
      + 此範本會建立以下資源：
        + **`WebServerSecurityGroup`** – EC2 安全群組，它允許來自指定 IP 範圍的連接埠 80 上的傳入 HTTP 流量。
        + **`WebServer`** – 具有下列組態的 EC2 執行個體：
          + 使用最新的 Amazon Linux 2 AMI
          + 套用選取的執行個體類型
          + 將 `WebServerSecurityGroup` 新增至 `SecurityGroupIds` 屬性
          + 包含使用者資料指令碼以安裝 Apache HTTP Server
      + 會在每個資源和參數宣告的開頭指定邏輯名稱。例如，`WebServerSecurityGroup` 是指派給 EC2 安全群組資源的邏輯名稱。然後，`Ref` 函數會透過其在範本其他部分中的邏輯名稱來參考資源和參數。當一個資源參考另一個資源時，會在兩者之間建立相依性。
      + **`Outputs`** 區段定義堆疊建立後傳回的自訂值。您可以使用輸出值，從堆疊中的資源傳回資訊，例如資源識別符或 URL。
      + 範本會定義一個輸出：
        + **`WebsiteURL`** – 已部署的 Web 伺服器的 URL，使用 EC2 執行個體的公有 DNS 名稱建構。`Join` 函數有助於將固定的 `http://` 與可變的 `PublicDnsName` 合併為單一字串，從而輕鬆輸出 Web 伺服器的完整 URL。

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

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

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

1. 在**建立堆疊**頁面中，選擇**下一步**。

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

1. 在**參數**下，指定參數值，如下所示：
   + **LatestAmiId**：它預設為最新的 Amazon Linux 2 AMI。
   + **InstanceType**：為 EC2 執行個體類型選擇 **t2.micro** 或 **t3.micro**。
**注意**  
如果您是新手 AWS，您可以使用免費方案免費啟動和使用`t2.micro`執行個體 12 個月 （在`t2.micro`無法使用的區域中，您可以在免費方案下使用`t3.micro`執行個體）。
   + **MyIP**：指定具有 `/32` 尾碼的實際公有 IP 位址。`/32` 尾碼用於 CIDR 表示法，以指定允許的單一 IP 位址。它本質上意味著允許流量進出此特定 IP 位址，而不允許其他位址。

1. 選取**下一步**兩次，以前往**檢閱和建立**頁面。在本教學課程中，可以在**設定堆疊選項**頁面上原樣保留預設值。

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

## 監控堆疊建立
<a name="getting-started-monitor-stack-creation"></a>

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

**檢視堆疊的事件**

1. 在 CloudFormation 主控台中，選擇清單中的堆疊 **MyTestStack**。

1. 在堆疊詳細資訊窗格中，選擇 **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 伺服器
<a name="getting-started-test-web-server"></a>

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

開啟瀏覽器並前往 **WebsiteURL** 下列出的 URL。應該會看到瀏覽器中顯示的簡單 "Hello World\$1" 訊息。

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

## 疑難排解
<a name="getting-started-troubleshooting"></a>

如果在堆疊建立期間遇到復原，可能是因為缺少 VPC。以下是解決此問題的方法。

### 沒有可用的預設 VPC
<a name="getting-started-troubleshooting-no-default-vpc"></a>

此逐步解說中的範本需要預設 VPC。如果堆疊建立因 VPC 或子網路可用性錯誤而失敗，則帳戶中可能沒有預設 VPC。您有下列選項：
+ **建立新的預設 VPC** – 可以透過 Amazon VPC 主控台來建立新的預設 VPC。如需說明，請參閱《Amazon VPC 使用者指南》**中的[建立預設 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/work-with-default-vpc.html#create-default-vpc)。
+ **修改範本以指定子網路** – 如果您有非預設 VPC，可以修改範本以明確指定 VPC 和子網路 ID。將以下參數新增至範本：

  ```
    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 伺服器。

## 清除
<a name="getting-started-clean-up"></a>

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

**刪除堆疊及其資源**

1. 開啟 [CloudFormation 主控台](https://console.aws.amazon.com/cloudformation/)。

1. 在**堆疊**頁面中，選取您所建立堆疊名稱旁的選項 (**MyTestStack**)，然後選擇**刪除**。

1. 出現確認提示時，請選擇**刪除**。

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

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

**若要清空和刪除 Amazon S3 儲存貯體**

1. 開啟 [Amazon S3 主控台](https://console.aws.amazon.com/s3/)。

1. 在主控台左側的導覽窗格中，選擇 **Buckets (儲存貯體)**。

1. 在**儲存貯體**清單中，選取您為此教學課程建立的儲存貯體名稱旁的選項，然後選擇**清空**。

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

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

1. 若要返回儲存貯體清單，請選擇 **Exit (結束)**。

1. 選取儲存貯體名稱旁邊的選項，然後選擇**刪除**。

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

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

## 後續步驟
<a name="getting-started-next-steps"></a>

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

若要繼續學習：
+ 進一步了解範本，以便您可以建立自己的範本。如需詳細資訊，請參閱[使用 CloudFormation 範本](template-guide.md)。
+ 請嘗試 [CloudFormation入門](https://catalog.us-east-1.prod.workshops.aws/workshops/df7f72cf-4f10-4664-acb6-b30dc8d4bcf0/en-US)工作坊，以取得有關範本建立的更多實作實務。
+ 如需 [入門 CloudFormation](https://catalog.us-east-1.prod.workshops.aws/workshops/df7f72cf-4f10-4664-acb6-b30dc8d4bcf0/en-US)的縮短版本，請參閱 [在 Amazon EC2 上部署應用程式](deploying.applications.md)。本主題說明使用 CloudFormation 協助程式指令碼 `cfn-init` 來引導 Amazon EC2 執行個體的相同案例。