

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

# 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)工作坊，它會提供範本開發的實作體驗。