如何 CloudFormation 工作 - AWS CloudFormation

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

如何 CloudFormation 工作

本主題說明如何 CloudFormation 運作,並向您介紹使用時需要了解的關鍵概念。

重要概念

使用時 CloudFormation,您可以使用範本堆疊。您可以建立範本來描述您的 AWS 資源及其屬性。每當您建立堆疊時,都會 CloudFormation 佈建範本中描述的資源。

範本

CloudFormation 範本是 JSON 或 YAML 格式的文字檔案。您可以使用任何副檔名儲存這些檔案.json,例如.yaml.template、、或.txt。 CloudFormation 使用這些範本做為建置 AWS 資源的藍圖。舉例來說,您可以在範本中說明 Amazon EC2 執行個體的執行個體類型、AMI ID、區塊型裝置映射與 Amazon EC2 金鑰對名稱等等。每當您建立堆疊時,您也會指定一個範本, CloudFormation 用來建立您在範本中描述的任何內容。

例如,如果您使用下列範本建立堆疊,請使用 ami-0ff8a91507f77f867 AMI ID、執行個t2.micro體類型、testkey key pair 名稱和 Amazon EBS 磁碟區 CloudFormation 佈建執行個體。

JSON

{ "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 } } ] } } } }

YAML

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 執行個體相關聯,如以下範例所示:

JSON

{ "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" } } } } }

YAML

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 堆疊時指定其值的輸入參數。換言之,您不需等到建立範本期間才指定數值,建立堆疊期間即可指定執行個體類型等值,藉此在不同情況下更輕鬆地重複使用範本。

如需詳細資訊,請參閱 使用 CloudFormation 範本

堆疊

使用時 CloudFormation,您可以將相關資源當做一個稱為堆疊的單一單元來管理。意即您能夠建立、更新和刪除堆疊,藉此建立、更新並刪除資源集合。堆棧中的所有資源都由堆棧的 CloudFormation 模板定義。假設您想建立包含 Auto Scaling 群組、Elastic Load Balancing 負載平衡器及 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體的範本。若要建立這些資源,您可以透過提交您建立的範本來建立堆疊,並為您 CloudFormation 佈建所有這些資源。您可以使用 CloudFormation 主控台API 或來處理堆疊AWS CLI

如需詳細資訊,請參閱 使用建立和管理堆疊 AWS CloudFormation

變更集

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

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

如需詳細資訊,請參閱 透過變更集更新堆疊

如何 CloudFormation 工作

建立堆疊時,會 CloudFormation 對基礎服務呼叫 AWS 進行佈建和設定資源。 CloudFormation 只能執行您有權執行的動作。例如,若要使用建立 EC2 執行個體 CloudFormation,您需要許可才能建立執行個體。當您刪除具備執行個體的堆疊時,必須擁有類似於終止執行個體的許可。您可以使用 AWS Identity and Access Management (IAM) 來管理許可。

發出的 CloudFormation 呼叫全部由您的模板聲明。例如,假設範本可以說明執行個體類型為 t2.micro 的 EC2 執行個體;當您使用該範本建立堆疊時,請 CloudFormation 呼叫 Amazon EC2 建立執行個體 API,並將執行個體類型指定為t2.micro。下圖概述了建立堆疊的 CloudFormation 工作流程。

  1. 使用應用程式編寫器或您自己的文字編輯器來建立或修改 JSON 或 YAML 格式的 CloudFormation 範本。除此之外,您還可以選擇使用系統提供的範本。 CloudFormation 範本說明您想要的資源及其設定。以建立 EC2 執行個體為例,您的範本可以宣告 Amazon EC2 執行個體並描述其屬性;如下列範例所示:

    範例 JSON
    { "AWSTemplateFormatVersion": "2010-09-09", "Description": "A simple EC2 instance", "Resources": { "MyEC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0ff8a91507f77f867", "InstanceType": "t2.micro" } } } }
    範例 YAML
    AWSTemplateFormatVersion: 2010-09-09 Description: A simple EC2 instance Resources: MyEC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0ff8a91507f77f867 InstanceType: t2.micro
  2. 將範本儲存在本機或 Amazon S3 儲存貯體中。建立範本時,請採用 .json.yaml.txt 等副檔名儲存該範本。

  3. 透過指定範本檔案的位置 (例如本機電腦上的路徑或 Amazon S3 URL) 來建立 CloudFormation 堆疊。若該範本包含參數,您可以在建立堆疊期間指定輸入值。透過參數,您可以將值傳入範本,因此您每次建立堆疊時都可以自訂資源。

    您可以使用 CloudFormation 主控台CreateStackAPI 作業或建立堆疊命令來建立堆疊 AWS CLI 。

    注意

    如果您指定存放在本機的範本檔案,請將其 CloudFormation 上傳到 AWS 帳戶中的 S3 儲存貯體。 CloudFormation 會為您上傳範本檔案的每個區域建立值區。 AWS 帳戶中具有 Amazon Simple Storage Service (Amazon S3) 許可的任何人都可以存取這些儲存貯體。如果由建立的值區 CloudFormation 已存在,則會將範本新增至該值區。

    您可以使用自己的儲存貯體,並手動上傳範本至 Amazon S3 以管理其許可。然後在您每次建立或更新堆疊時,指定範本檔案的 Amazon S3 URL。

CloudFormation 通過對模板中描述的 AWS 服務進行調用來佈建和配置資源。

建立完所有資源之後, CloudFormation 報告您的堆疊已建立。接著,您便可以開始使用堆疊中的資源。如果堆疊建立失敗,請刪除所建立的資源來回 CloudFormation 復變更。

透過變更集更新堆疊

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

重要

更新可能會導致作業中斷。根據更新中的資源與屬性,更新作業可能會中斷,甚至是取代現有資源。如需詳細資訊,請參閱 AWS CloudFormation 堆疊更新

  1. 您可以使用應用程式編寫器或文字編輯器來修改 CloudFormation 堆疊樣板。舉例來說,您可以更改原始堆疊範本中的 InstanceType 屬性值,進而變更 EC2 執行個體的執行個體類型。

    如需詳細資訊,請參閱 修改堆疊範本

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

  3. 透過指定要更新的堆疊與修改後範本的位置 (如本機電腦上的路徑或 Amazon S3 URL),即可建立變更集。若該範本包含參數,您可以在建立變更集期間指定值。

    如需建立變更集的詳細資訊,請參閱 透過變更集更新堆疊

    注意

    如果您指定存放在本機電腦上的範本, CloudFormation會自動將範本上傳到 AWS 帳戶.

  4. 檢視要檢查的變更集 CloudFormation ,以執行您預期的變更。例如,檢查是否 CloudFormation 會取代任何重要的堆疊資源。您可以依需求建立無限個變更集,直到涵蓋所需的變更為止。

    重要

    變更集並不會指示系統是否能成功執行堆疊更新作業。例如,變更集不會檢查您是否要超過帳號配額、是否要更新不支援更新的資源,或是您沒有足夠的權限來修改資源,這可能會導致堆疊更新失敗。

  5. 啟動您要套用至堆疊的變更集。 CloudFormation 通過僅更新您修改的資源來更新您的堆棧,並表示您的堆棧已成功更新。如果堆疊更新失敗,請回 CloudFormation 復變更,將堆疊還原到上次已知的工作狀態。

刪除堆疊

當您刪除堆疊時,您可以指定要刪除的堆疊,並 CloudFormation 刪除該堆疊中的所有資源。您可以使用 CloudFormation 主控台DeleteStackAPI 作業或刪除堆疊命令來刪除堆疊 AWS CLI 。

如果您想刪除堆疊但仍保有其中部分資源,則可以透過 deletion policy (刪除政策) 來保留這些資源。

刪除所有資源後,表 CloudFormation 示您的堆棧已成功刪除。如果 CloudFormation 無法刪除資源,則不會刪除堆疊。任何尚未刪除的資源皆會保持不變,直到您可以成功刪除堆疊為止。