1. What?

1.1 简介

AWS CloudFormation 通过将基础设施视为代码,为您提供一种简单的方式,为一系列 AWS 相关资源和第三方资源建模,快速而又一致地对这些资源进行预置并在它们的整个生命周期内对其进行管理。CloudFormation 模板描述了您所需的资源及其依赖项,这样,您就可以将它们一起作为一个堆栈进行启动和配置。您可以根据需要,使用模板将整个堆栈作为一个单元进行创建、更新和删除,无需单独管理资源。您可以跨多个 AWS 账户和 AWS 区域管理和预置堆栈。

1.2 优势

  • 自动化最佳实践
    • 借助 CloudFormation,您可以使用广泛采用的流程(例如从 Git 存储库开始并通过 CI/CD 管道进行部署)来应用 DevOps 和 GitOps 最佳实践。您还可以使用 GitHub Actions 和 AWS CodePipeline 等管道集成来简化更改审查并触发自动化部署。
  • 在全球范围内扩展基础设施
    • CloudFormation 模板的共享,可以轻松的在其他账户或区域扩展你的最佳实践和公司基础设置策略。
    • 通过 CloudFormation StackSets,您只需一次操作即可跨多个 AWS 账户和区域创建、更新或删除堆栈。
  • 与其他 AWS 服务集成
  • 管理第三方资源和私有资源
  • 利用社区扩展 CloudFormation

1.3 定价

  • 使用 AWS CloudFormation 创建下列命名空间的 AWS 资源(如 Amazon EC2 实例、Elastic Load Balancing 负载均衡器等)时,其付费方式与您手动创建这些资源时相同。您只需按您的实际用量付费。

    • AWS::、 Alexa:: 和 Custom::*
  • 当将上述之外的第三方资源提供商(非 AWS::、 Alexa:: 或 Custom::*)用于 CloudFormation 时,需要为每个处理程序操作付费。

    • 处理程序操作是指资源上的创建、更新、删除、读取或列表操作。
    • 免费套餐 :每个账户每月 1,000 个处理程序操作

1.4 基本概念

  • Templates

    • AWS CloudFormation 模板是一个 JSON 或 YAML 格式的文本文件。
    • AWS CloudFormation 使用这些模板作为构建 AWS 资源的蓝图。
    • 可以在单个模板中指定多个资源,并配置这些资源以协同工作。
      • 例如,您可以在一个模板中包含一个弹性 IP (EIP) 并将其与 Amazon EC2 实例关联。
    • 可以在创建堆栈时输入参数,而不是在创建模板时指定实例类型之类的值,从而使模板更容易在不同情况下重用。
  • Stacks

    • 当您使用 AWS CloudFormation 时,您将相关资源作为一个称为 Stacks 的单个单元来管理。您可以通过创建、更新和删除堆栈来创建、更新和删除整个资源集合。
    • 堆栈中的所有资源都是由堆栈的 AWS CloudFormation 模板定义的。
    • 您可以通过使用 AWS CloudFormation 控制台、API 或 AWS CLI 来处理栈。
  • Change sets

    • 如果更改堆栈中正在运行的资源,在对资源进行更改之前,会生成 Change sets,通过它可以查看对运行资源的影响。
      • 例如,如果更改 Amazon RDS 数据库实例的名称,AWS CloudFormation 将创建一个新数据库并删除旧数据库。除非您已经对其进行了备份,否则将丢失旧数据库中的数据。这个影响都可以在 Change sets 中了解到。

1.5 工作原理

:::info AWS CloudFormation 只能执行您有权执行的操作。例如,要使用 AWS CloudFormation 创建 EC2 实例,您需要有创建实例的权限。当您删除带有实例的堆栈时,您将需要类似的权限来终止实例。 :::

Create Stack

AWS CloudFormation - 图1

  • 可以使用 AWS CloudFormation Designer 创建一个模板,或文本编辑器编写一个模板。
  • 将模板保存在本地或 S3 存储桶中。
  • 通过指定模板文件的位置(例如本地计算机上的路径或 Amazon S3 URL),创建 AWS CloudFormation 堆栈。如果模板包含参数,您可以在创建堆栈时指定参数输入值。参数使您能够向模板传递值,以便在每次创建堆栈时定制资源。 :::info 如果您指定了本地存储的模板文件,AWS CloudFormation 也会将其上传到您 AWS 帐户的 S3 存储桶中。AWS CloudFormation 为您上载模板文件的每个区域创建一个 bucket。您的 AWS 帐户中任何具有 Amazon S3 权限的人都可以访问这些 bucket。如果 AWS CloudFormation 创建的 bucket 已经存在了,那么模板将被添加到该 bucket 中。

您可以使用自己的 bucket 并通过手动将模板上传到 Amazon S3 来管理它的权限。然后,在创建或更新堆栈时,指定模板文件的 Amazon S3 URL。 :::

  • 您可以使用 AWS CloudFormation 控制台、API 或 AWS CLI 来创建栈。
  • 创建完所有资源后,AWS CloudFormation 会报告您的堆栈已经创建。如果堆栈创建失败,AWS CloudFormation 将通过删除它创建的资源回滚您的更改。

Upating stack with change sets

AWS CloudFormation - 图2

  • 可以使用 AWS CloudFormation Designer 或文本编辑器修改模板。
  • 将修改后的模板保存在本地或 S3 存储桶中。
  • 通过指定要更新的堆栈和修改后的模板的位置 (例如本地计算机上的路径或 Amazon S3 URL )来创建更改集。如果模板包含参数,则可以在创建更改集时指定值。
  • 查看 change sets,以检查 AWS CloudFormation 是否将执行您所期望的更改。您可以根据需要创建任意多的更改集,直到包含了所需的更改。
    • change sets 不会告诉你 update stack 是否会成功,因为它不会去检查资源是否支持 updae,或有没有 update 权限。
  • 执行要应用于堆栈的 change sets。如果堆栈更新失败,AWS CloudFormation 将回滚更改,以将堆栈恢复到最后已知的工作状态。

Deleting stack

  • 删除一个堆栈时,默认会删除该堆栈和其中的所有资源。
  • 如果您想删除一个堆栈,但又想在该堆栈中保留一些资源,那么可以使用删除策略来保留这些资源。
  • 在所有资源都被删除之后,AWS CloudFormation 会发出您的堆栈已被成功删除的信号。
  • 如果 AWS CloudFormation 不能删除一个资源,那么该堆栈将不会被删除。在成功删除堆栈之前,任何未删除的资源都将保留。