

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

# CloudFormation 入門
<a name="GettingStarted"></a>

您可以透過從範例範本建立堆疊 AWS 管理主控台 ，開始透過 使用 CloudFormation，這可協助您了解堆疊建立的基本概念。*範本*是定義堆疊內所有資源的文字檔案。*堆疊*是 CloudFormation 範本的部署。可以從單一範本建立多個堆疊。每個堆疊都包含可做為單一單位管理的一組 AWS 資源。

CloudFormation 是一項免費服務；不過，您需要按每個服務目前費率支付堆疊中包含 AWS 的資源費用。如需 AWS 定價的詳細資訊，請前往 https：//[http://aws.amazon.com](https://aws.amazon.com/) 上每個產品的詳細資訊頁面。

**影片：CloudFormation 入門**  
以下影片介紹如何從 AWS 管理主控台建立 CloudFormation 堆疊。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/1h-GPXQrLZw?si=MYHlJvBkE3DspKcL/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/1h-GPXQrLZw?si=MYHlJvBkE3DspKcL)


**Topics**
+ [CloudFormation 如何運作](cloudformation-overview.md)
+ [註冊 AWS 帳戶](cfn-sign-up-for-aws.md)
+ [建立您的第一個堆疊](gettingstarted.walkthrough.md)

# CloudFormation 如何運作
<a name="cloudformation-overview"></a>

本主題說明 CloudFormation 的運作方式，並介紹使用 CloudFormation 時需要了解的重要概念。

**Topics**
+ [重要概念](#cfn-whatis-concepts)
+ [CloudFormation 如何運作](#cfn-whatis-howdoesitwork)
+ [CloudFormation 入門方法](#ways-to-get-started)

## 重要概念
<a name="cfn-whatis-concepts"></a>

當您使用 CloudFormation 時，即可搭配*範本*與*堆疊*使用。您可以建立範本來描述 AWS 資源及其屬性。每當建立堆疊時，CloudFormation 即會佈建範本中所述的資源。

**Topics**
+ [範本](#cfn-concepts-templates)
+ [堆疊](#cfn-concepts-stacks)
+ [變更集](#cfn-concepts-change-sets)

### 範本
<a name="cfn-concepts-templates"></a>

CloudFormation 範本屬於 YAMLN 或 JSON 格式的文字檔案。您可以用任何副檔名 (如 `.yaml`、`.json`、`.template` 或 `.txt`) 來儲存這些檔案。CloudFormation 使用這些範本做為建置 AWS 資源的藍圖。舉例來說，您可以在範本中說明 Amazon EC2 執行個體的執行個體類型、AMI ID、區塊型裝置映射與 Amazon EC2 金鑰對名稱等等。您在建立堆疊時還可以指定範本，讓 CloudFormation 能用來建立範本中所述的內容。

假若您採用下方範本建立堆疊，則 CloudFormation 在佈建執行個體時，會使用 `ami-0ff8a91507f77f867` AMI ID、`t2.micro` 執行個體類型、`testkey` 金鑰對名稱與 Amazon EBS 磁碟區。

#### YAML
<a name="t2-micro-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: A sample template
Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: t2.micro
      KeyName: testkey
      BlockDeviceMappings:
        - DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20
```

#### JSON
<a name="t2-micro-example.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "A sample template",
    "Resources": {
        "MyEC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "ami-0ff8a91507f77f867",
                "InstanceType": "t2.micro",
                "KeyName": "testkey",
                "BlockDeviceMappings": [
                    {
                        "DeviceName": "/dev/sdm",
                        "Ebs": {
                            "VolumeType": "io1",
                            "Iops": 200,
                            "DeleteOnTermination": false,
                            "VolumeSize": 20
                        }
                    }
                ]
            }
        }
    }
}
```

您也可以在單一範本中指定多個資源並加以設定，讓這些資源共同搭配運作。例如，您可以修改先前的範本以包括彈性 IP 地址 (EIP)，並將其與 Amazon EC2 執行個體相關聯，如以下範例所示：

#### YAML
<a name="multiple-resources-single-template.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: A sample template
Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: t2.micro
      KeyName: testkey
      BlockDeviceMappings:
        - DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20
  MyEIP:
    Type: AWS::EC2::EIP
    Properties:
      InstanceId: !Ref MyEC2Instance
```

#### JSON
<a name="multiple-resources-single-template.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "A sample template",
    "Resources": {
        "MyEC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "ami-0ff8a91507f77f867",
                "InstanceType": "t2.micro",
                "KeyName": "testkey",
                "BlockDeviceMappings": [
                    {
                        "DeviceName": "/dev/sdm",
                        "Ebs": {
                            "VolumeType": "io1",
                            "Iops": 200,
                            "DeleteOnTermination": false,
                            "VolumeSize": 20
                        }
                    }
                ]
            }
        },
        "MyEIP": {
            "Type": "AWS::EC2::EIP",
            "Properties": {
                "InstanceId": {
                    "Ref": "MyEC2Instance"
                }
            }
        }
    }
}
```

儘管先前的範本是以單一 Amazon EC2 執行個體為中心，但 CloudFormation 範本還有提供其他的功能，讓您可以用來建構複雜的資源集，並在多種情況下重複使用這些範本。舉例來說，您可以新增輸入參數，其為建立 CloudFormation 堆疊時所指定的值。換言之，您不需等到建立範本期間才指定數值，建立堆疊期間即可指定執行個體類型等值，藉此在不同情況下更輕鬆地重複使用範本。

### 堆疊
<a name="cfn-concepts-stacks"></a>

透過 CloudFormation，您可以將相關資源視為單一單位進行管理，該單位稱為「堆疊」；意即您能夠建立、更新和刪除堆疊，藉此建立、更新並刪除資源集合。堆疊中所有的資源都是由堆疊的 CloudFormation 範本定義。假設您想建立包含 Auto Scaling 群組、Elastic Load Balancing 負載平衡器及 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體的範本。則請提交您建立的範本以進行堆疊建立程序，即可建立這些資源；而 CloudFormation 會為您佈建所有這些資源。

### 變更集
<a name="cfn-concepts-change-sets"></a>

如果您需要變更堆疊內的執行中資源，請更新堆疊。在變更資源之前，您可以產生變更集以列出請求變更的摘要。藉由變更集，您可以先掌握該變更對執行中資源 (特別是重要資源) 造成的影響，再實行變更作業。

例如，若您變更 Amazon RDS 資料庫執行個體的名稱，CloudFormation 即會建立新的資料庫並刪除舊有資料庫。除非您已備份舊資料庫中的資料，否則這些資料均會遺失。如果您有產生變更集，即可發現該變更作業會導致資料庫遭取代，便能在更新堆疊前進行相應的考量。

## CloudFormation 如何運作
<a name="cfn-whatis-howdoesitwork"></a>

當您使用 CloudFormation 來建立堆疊時，CloudFormation 會對 AWS 發出基礎服務呼叫，以佈建並設定範本中描述的資源。您需要許可才能建立這些資源。舉例來說，您必須擁有建立執行個體的許可，才能使用 CloudFormation 建立 EC2 執行個體。您可以使用 [AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/) (IAM) 來管理這些許可。

您的範本會宣告所有 CloudFormation 進行的呼叫。例如，假設範本可以說明執行個體類型為 `t2.micro` 的 EC2 執行個體；則使用該範本建立堆疊時，CloudFormation 即會呼叫 Amazon EC2 來建立執行個體 API，並將執行個體類型指定為 `t2.micro`。下圖概述了建立堆疊的 CloudFormation 工作流程。

![\[在本機或儲存貯體中儲存的已建立的範本或現有範本用於建立堆疊。\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/create-stack-diagram.png)


**建立 堆疊**

1. 使用文字編輯器來建立 YAML 或 JSON 格式的 CloudFormation 範本。CloudFormation 範本會描述所需的資源及其設定。使用 [Infrastructure Composer](infrastructure-composer-for-cloudformation.md) 來視覺化和驗證範本。這可協助確保範本結構正確且沒有語法錯誤。如需詳細資訊，請參閱[使用 CloudFormation 範本](template-guide.md)。

1. 在本機或 Amazon S3 儲存貯體中儲存範本。

1. 透過指定範本檔案的位置 (如本機電腦上的路徑或 Amazon S3 URL) 建立 CloudFormation 堆疊。若該範本包含參數，您可以在建立堆疊期間指定輸入值。透過參數，您可以將值傳入範本，因此您每次建立堆疊時都可以自訂資源。
**注意**  
如果您指定儲存在本機的範本檔案，CloudFormation 會將其上傳至您 AWS 帳戶中的 S3 儲存貯體。CloudFormation 會為您在其中上傳範本檔案的各個區域建立儲存貯體。 AWS 您帳戶中具有 Amazon Simple Storage Service (Amazon S3) 許可的任何人都可以存取儲存貯體。如果 CloudFormation 已建立儲存貯體，則系統會將範本新增至該儲存貯體。  
您可以使用自己的儲存貯體，並手動上傳範本至 Amazon S3 以管理其許可。然後在您每次建立或更新堆疊時，指定範本檔案的 Amazon S3 URL。

建立完所有資源之後，CloudFormation 即會回報堆疊建立完成。接著，您便可以開始使用堆疊中的資源。如果堆疊建立失敗，則 CloudFormation 會刪除建立的資源來復原變更。

### 透過變更集更新堆疊
<a name="updating-stack-with-change-sets"></a>

當您需要更新堆疊的資源時，即可修改堆疊的範本，並不需要建立新堆疊和刪除舊堆疊。若要更新堆疊，請透過提交原始堆疊範本的修改版本、不同的輸入參數值或同時提交兩者來建立變更集。CloudFormation 會比較經修改範本與原始範本，並產生變更集。而該變更集會列出建議的變更。檢閱變更之後，您可以啟動該變更集以更新堆疊，或建立新的變更集。下圖概述了更新堆疊的工作流程。

![\[這是一個範本，它在執行變更集以更新堆疊之前，使用變更集檢視修改後的值。\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/update-stack-diagram.png)


**若要使用變更集來更新堆疊**

1. 可以使用 [Infrastructure Composer](infrastructure-composer-for-cloudformation.md) 或文字編輯器來修改 CloudFormation 堆疊範本。如需詳細資訊，請參閱[更新您的堆疊範本](using-cfn-updating-stacks-get-template.md)。

   更新範本時，請謹記更新可能會導致中斷。根據更新中的資源與屬性，更新作業可能會中斷，甚至是取代現有資源。如需詳細資訊，請參閱[了解更新堆疊資源的行為](using-cfn-updating-stacks-update-behaviors.md)。

1. 在本機或 S3 儲存貯體中儲存 CloudFormation 範本。

1. 透過指定要更新的堆疊與修改後範本的位置 (如本機電腦上的路徑或 Amazon S3 URL)，即可建立變更集。如需建立變更集的詳細資訊，請參閱 [透過變更集更新 CloudFormation 堆疊](using-cfn-updating-stacks-changesets.md)。
**注意**  
如果您指定的範本存放於本機電腦上，CloudFormation 會自動將範本上傳至 AWS 帳戶中的 S3 儲存貯體。

1. 檢視變更集，藉此檢查 CloudFormation 是否會執行預期的變更。例如，檢查 CloudFormation 是否會取代任何重要的堆疊資源。您可以依需求建立無限個變更集，直到涵蓋所需的變更為止。
**重要**  
變更集並不會指示系統是否能成功執行堆疊更新作業。例如，變更集並不會檢查是否超過帳戶[配額](cloudformation-limits.md)、更新中的資源是否不支援更新，或者具備的[許可](control-access-with-iam.md)是否不足以修改資源，上述所有情況都可能導致堆疊更新失敗。

1. 啟動要套用至堆疊的變更集。CloudFormation 透過僅更新經修改的資源來更新堆疊，並發出已成功更新堆疊的訊號。CloudFormation 在堆疊更新失敗時則會復原變更，使堆疊還原至上次已知的運作狀態。

## CloudFormation 入門方法
<a name="ways-to-get-started"></a>

若要使用主控台建立 hello world CloudFormation 堆疊，請參閱 [建立您的第一個堆疊](gettingstarted.walkthrough.md)。

如需指導性學習，請嘗試 [CloudFormation入門](https://catalog.us-east-1.prod.workshops.aws/workshops/df7f72cf-4f10-4664-acb6-b30dc8d4bcf0/en-US)工作坊，它會提供範本開發的實作體驗。

# 註冊 AWS 帳戶
<a name="cfn-sign-up-for-aws"></a>

當您註冊 時 AWS，您的 AWS 帳戶 會自動註冊 中的所有 服務 AWS，包括 CloudFormation。如果您已有 AWS 帳戶 ，請跳到下一個主題。如果您沒有 AWS 帳戶，請使用下列程序建立一個。

## 註冊 AWS 帳戶
<a name="sign-up-for-aws"></a>

如果您沒有 AWS 帳戶，請完成下列步驟來建立一個。

**註冊 AWS 帳戶**

1. 開啟 [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)。

1. 請遵循線上指示進行。

   部分註冊程序需接收來電或簡訊，並在電話鍵盤輸入驗證碼。

   當您註冊 時 AWS 帳戶，*AWS 帳戶根使用者*會建立 。根使用者有權存取該帳戶中的所有 AWS 服務 和資源。作為安全最佳實務，請將管理存取權指派給使用者，並且僅使用根使用者來執行[需要根使用者存取權的任務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

AWS 會在註冊程序完成後傳送確認電子郵件給您。您可以隨時登錄 [https://aws.amazon.com/](https://aws.amazon.com/) 並選擇**我的帳戶**，以檢視您目前的帳戶活動並管理帳戶。

## 建立具有管理存取權的使用者
<a name="create-an-admin"></a>

註冊 後 AWS 帳戶，請保護 AWS 帳戶根使用者、啟用 AWS IAM Identity Center和建立管理使用者，以免將根使用者用於日常任務。

**保護您的 AWS 帳戶根使用者**

1.  選擇**根使用者**並輸入 AWS 帳戶 您的電子郵件地址，以帳戶擁有者[AWS 管理主控台](https://console.aws.amazon.com/)身分登入 。在下一頁中，輸入您的密碼。

   如需使用根使用者登入的說明，請參閱 *AWS 登入 使用者指南*中的[以根使用者身分登入](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)。

1. 若要在您的根使用者帳戶上啟用多重要素驗證 (MFA)。

   如需說明，請參閱《*IAM 使用者指南*》中的[為您的 AWS 帳戶 根使用者 （主控台） 啟用虛擬 MFA 裝置](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)。

**建立具有管理存取權的使用者**

1. 啟用 IAM Identity Center。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[啟用 AWS IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)。

1. 在 IAM Identity Center 中，將管理存取權授予使用者。

   如需使用 IAM Identity Center 目錄 做為身分來源的教學課程，請參閱*AWS IAM Identity Center 《 使用者指南*》中的[使用預設值設定使用者存取 IAM Identity Center 目錄](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)。

**以具有管理存取權的使用者身分登入**
+ 若要使用您的 IAM Identity Center 使用者簽署，請使用建立 IAM Identity Center 使用者時傳送至您電子郵件地址的簽署 URL。

  如需使用 IAM Identity Center 使用者登入的說明，請參閱*AWS 登入 《 使用者指南*》中的[登入 AWS 存取入口網站](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)。

**指派存取權給其他使用者**

1. 在 IAM Identity Center 中，建立一個許可集來遵循套用最低權限的最佳實務。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[建立許可集](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)。

1. 將使用者指派至群組，然後對該群組指派單一登入存取權。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[新增群組](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)。

**注意**  
如需有關如何管理誰有權進行什麼操作的詳細資訊，請參閱 [使用 控制 CloudFormation 存取 AWS Identity and Access Management](control-access-with-iam.md)。

# 建立您的第一個堆疊
<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 執行個體的相同案例。