CloudFormation 的工作原理 - AWS CloudFormation

CloudFormation 的工作原理

本主题说明了 CloudFormation 的工作原理,并介绍了在使用此服务时需要了解的关键概念。

重要概念

在使用 CloudFormation 时,您将使用模板堆栈。您创建模板来描述 AWS 资源及其属性。当您创建堆栈时,CloudFormation 会配置模板中描述的资源。

模板

CloudFormation 模板是 JSON 或 YAML 格式的文本文件。您可使用任何扩展名(如 .json.yaml.template.txt)保存这些文件。CloudFormation 使用这些模板作为构建 AWS 资源的蓝图。例如,在模板中,您可描述 Amazon EC2 实例,如实例类型、AMI ID、块储存设备映射和其 Amazon EC2 密钥对名称。当您创建堆栈时,还可以指定 CloudFormation 用来创建模板中描述的任何项的模板。

例如,如果您使用以下模板创建堆栈,则 CloudFormation 将使用 ami-0ff8a91507f77f867 AMI ID、t2.micro 实例类型、testkey 密钥对名称和 Amazon EBS 卷来配置实例。

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 模板定义。假设您创建了一个模板,它包括自动扩缩组、Elastic Load Balancing 负载均衡器和 Amazon Relational Database Service (Amazon RDS) 数据库实例。要创建这些资源,您可通过提交已创建的模板来创建堆栈,CloudFormation 将会为您配置所有这些资源。您可通过使用 CloudFormation 控制台APIAWS CLI 来使用堆栈。

有关更多信息,请参阅 使用 AWS CloudFormation 堆栈将 AWS 资源作为单个单元进行管理

更改集

如果您需要更改堆栈中运行的资源,则可更新堆栈。在更改资源之前,您可以生成一个更改集,这是建议进行的更改的摘要。利用更改集,您可以在实施更改之前,了解更改可能会对运行的资源 (特别是关键资源) 造成的影响。

例如,如果您更改 Amazon RDS 数据库实例的名称,则 CloudFormation 将创建新数据库并删除旧数据库。除非您已经对旧数据库中的数据进行备份,否则您将丢失该数据。如果您生成了更改集,则将了解更改会导致数据库被替换,而您可以先做出相应的计划,然后再更新堆栈。

有关更多信息,请参阅 使用更改集更新 CloudFormation 堆栈

CloudFormation 的工作原理

创建堆栈时,CloudFormation 会向 AWS 发出基础服务调用以预置和配置资源。CloudFormation 只能执行您有权执行的操作。例如,要使用 CloudFormation 创建 EC2 实例,您需要具有创建实例的权限。您在删除带实例的堆栈时,将需要用于终止实例的类似权限。您可以使用 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 控制台CreateStack API 操作或 create-stack AWS CLI 命令创建堆栈。

    注意

    如果您指定本地存储的模板文件,CloudFormation 会将其上传到您 AWS 账户中的 S3 桶。CloudFormation 为您上传模板文件的每个区域创建一个桶。具有您 AWS 账户中 Amazon Simple Storage Service(Amazon S3)权限的任何人均可访问桶。如果 CloudFormation 创建的存储桶已存在,则将模板添加到该存储桶。

    您可通过手动将模板上传到 Amazon S3 来使用您自己的存储桶并管理其权限。之后,当您创建或更新堆栈时,请指定模板文件的 Amazon S3 URL。

CloudFormation 通过调用您的模板中描述的 AWS 服务来预置和配置资源。

所有资源创建完毕后,CloudFormation 会报告已创建您的堆栈。然后,您可以开始使用堆栈中的资源。如果堆栈创建失败,则 CloudFormation 会通过删除已创建的资源来回滚您的更改。

使用更改集更新堆栈

在需要更新堆栈的资源时,您可以修改堆栈的模板。您不需要创建新堆栈和删除旧堆栈。要更新堆栈,请提交修改的原始堆栈模板版本和/或不同的输入参数值以创建一个更改集。CloudFormation 将修改的模板与原始模板进行比较并生成一个更改集。更改集列出了建议的更改。在审核更改后,您可以启动更改集以更新堆栈,也可以创建新的更改集。以下示意图概述了用于更新堆栈的工作流程。

在执行更改集以更新堆栈之前,使用更改集来查看修改后的值的模板。
重要

更新可能会导致中断。根据您所更新的资源和属性,更新可能会中断或者甚至替换现有资源。有关更多信息,请参阅 理解堆栈资源的更新行为

  1. 您可以使用基础设施编辑器或文本编辑器来修改 CloudFormation 堆栈模板。例如,如果您需要更改 EC2 实例的实例类型,可更改原始堆栈模板中的 InstanceType 属性的值。有关更多信息,请参阅 更新堆栈模板

  2. 您可在本地或在 S3 存储桶中保存 CloudFormation 模板。

  3. 通过指定要更新的堆栈和修改后模板的位置 (例如本地计算机上的路径或 Amazon S3 URL) 来创建更改集。如果模板包含参数,则可在创建更改集时指定值。

    有关创建更改集的更多信息,请参阅使用更改集更新 CloudFormation 堆栈

    注意

    如果您指定存储在本地计算机上的模板,则 CloudFormation 自动将模板上传到 AWS 账户 中的 S3 桶。

  4. 查看更改集以检查 CloudFormation 是否将执行预期更改。例如,检查 CloudFormation 是否将替换任何关键堆栈资源。您可以创建所需数量的更改集,直到您包含所需的更改。

    重要

    更改集并不指示您的堆栈更新是否将成功。例如,更改集不会检查是否将超出账户配额、是否在更新不支持更新的资源或者是否权限不足而无法修改资源,这些都可能导致堆栈更新失败。

  5. 启动要应用于堆栈的更改集。CloudFormation 仅更新您修改的资源以更新堆栈,并发出已成功更新堆栈的信号。如果堆栈更新失败,则 CloudFormation 将回滚更改以将堆栈还原到上一个已知工作状态。

删除堆栈

在删除堆栈时,您可指定要删除的堆栈,并且 CloudFormation 将删除该堆栈及其包含的所有资源。您可通过 CloudFormation 控制台DeleteStack API 操作或 delete-stack AWS CLI 命令删除堆栈。

若要删除一个堆栈但保留该堆栈中的一些资源,您可使用删除策略来保留那些资源。

在删除所有资源后,CloudFormation 会发出有关您的堆栈已被成功删除的信号。如果 CloudFormation 无法删除资源,则将不会删除堆栈。尚未删除的任何资源将保留,直到您能成功删除堆栈。