AWS CloudFormation简介(附实例)

1,186 阅读5分钟

AWS CloudFormation是一个AWS基础设施即代码(IaC)工具--意思是让你使用代码指定基础设施的工具。这种代码被称为CloudFormation模板。AWS CloudFormation让你通过CloudFormation模板指定他们几乎所有的基础设施。然后,AWS可以创建CloudFormation模板中指定的资源。

将AWS基础设施指定为代码有几个好处:

  • AWS可以为你创建基础设施
  • 错误或遗漏的风险要小得多
  • CloudFormation模板的功能是为你的基础设施配置提供文件

在AWS网络控制台(或通过AWS CLI)手动创建AWS资源可能需要一些时间,而且手动创建时更容易忘记一些事情或犯错误。也更难记住基础设施是如何配置的,或者记住准确地记录它。有了AWS CloudFormation模板,这些问题就小多了。

AWS CloudFormation网站

AWS CloudFormation的官方网站可以在这里找到:

https://aws.amazon.com/cloudformation/

CloudFormation堆栈

一个AWS CloudFormation模板可以指定一个以上的基础设施。在CloudFormation模板中指定的每一块基础设施都被称为资源。我稍后会回到资源的问题。

当部署AWS CloudFormation模板时,创建的基础设施资源在AWS称为堆栈中相互关联。如果你多次部署同一个AWS CloudFormation模板,那么每次部署都会导致部署一个独特的资源堆栈。

CloudFormation将部署特定堆栈(CloudFormation模板)中的所有资源。如果创建任何资源因任何原因而失败,CloudFormation将默认回滚(撤销部署)所有部署的资源。

通过要求AWS CloudFormation根据CloudFormation模板更新堆栈,可以更新正在运行的堆栈。然后,CloudFormation将尝试找出当前部署的堆栈与更改的CloudFormation模板中指定的资源之间的区别。任何添加到CloudFormation模板的资源将被部署到堆栈中。任何改变的资源将被尝试改变以匹配CloudFormation模板中的规范。任何被删除的资源将被尝试从堆栈中撤销部署。

也可以删除一个CloudFormation堆栈。然后AWS CloudFormation将删除与该堆栈相关的所有资源。

部署CloudFormation堆栈

要从CloudFormation模板中部署一个CloudFormation堆栈--模板必须首先位于AWS S3桶中。

您可以将CloudFormation模板上传到S3桶,并将AWS指向该模板(通过向AWS CloudFormation提供S3桶中CloudFormation模板的S3 URL),或者您可以在创建(部署)CloudFormation堆栈期间上传CloudFormation模板。

如果你在创建CloudFormation堆栈期间上传CloudFormation模板,AWS将把CloudFormation模板存储在AWS为此目的而创建的S3桶中。

你通常会为CloudFormation模板创建自己的S3桶,并通过将AWS CloudFormation指向这些模板来创建堆栈。这样你就可以控制哪些S3桶包含哪些CloudFormation模板。

JSON或YAML

AWS CloudFormation模板可以用JSON或YAML编写。有些人喜欢YAML,因为它的大括号比较少。其他人更喜欢JSON,因为每行可以列出多个属性,而YAML中每行只有一个属性。就我个人而言,我并不喜欢。

CloudFormation模板基础知识

一个AWS CloudFormation模板由以下部分组成:

  • AWSTemplateFormatVersion
  • 描述
  • 元数据
  • 参数
  • 映射
  • 资源
  • 输出

在这些部分中,只有资源部分是必须的,其余的部分是可选的。

CloudFormation模板示例

下面是一个例子,空的CloudFormation模板 "template",在JSON中,它显示了一个CloudFormation模板的样子,有上面一节中提到的主要部分,但在每个部分中没有任何实际内容:

{
   "AWSTemplateFormatVersion":"2010-09-09",

   "Description":"... text ... ",

   "Parameters":{
   },
   "Metadata":{
   },
   "Mappings":{
   },
   "Resources":{
   },
   "Outputs":{
   }
}

下面是同样的CloudFormation模板在YAML中的样子:

AWSTemplateFormatVersion: "2010-09-09"

Description: A sample template

Parameters:

Metadata:

Mappings:

Resources:

Outputs:


资源

CloudFormation模板的资源部分由一个或多个资源规范组成。 一个资源规范由以下部分组成:

  • 名称
  • 类型
  • 属性

下面是一个JSON格式的CloudFormation模板的例子,其中填写了资源部分:

{
    "AWSTemplateFormatVersion":"2010-09-09",

    "Resources":{
        "MyResourceName" : {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "AccessControl": "PublicRead"
            }
        },

        "MyNextResourceName": {

        }
   }
}

下面是YAML中相同的CloudFormation模板片段:

AWSTemplateFormatVersion: "2010-09-09"

Resources:
  MyResourceName:
    Type: "AWS::S3::Bucket"
    Properties:
      AccessControl: "PublicRead"

  MyNextResourceName:

正如你所看到的,资源名称是一个JSON属性的名称("MyResourceName "和 "MyNextResourceName")。 没有一个单独的字段/属性命名为 "名称"。

第一个资源被命名为 "MyResourceName"(名称中不包括引号)。这个资源有一个 "类型 "和 "属性 "属性。

资源类型("类型 "属性)通常是一个AWS特定的标识符,用于识别AWS资源类型,如S3桶、EC2实例、VPC等。你需要查询你想创建的特定资源类型所需的特定标识符。见AWS CloudFormation文档,或在网上搜索(谷歌、DuckDuckGo、Brave Search等)。

资源属性("Properties "属性)是特定于资源的--意味着嵌套在 "Properties "属性内的属性(字段)是特定于你正在创建的资源类型。一个S3桶会有一组属性,一个EC2实例会有另一组属性,一个VPC会有另一组属性等等。要查看一个给定的资源类型有哪些属性,请查阅AWS CloudFormation文档。

参数

AWS CloudFormation模板可以包含参数。当CloudFormation模板被用于创建CloudFormation堆栈时,参数值被提供。CloudFormation模板可以在内部使用参数,以便在部署时可以定制模板。例如,一个S3 bucket CloudFormation模板可以把要创建的S3 bucket的名字作为一个参数--所以每次使用同一个CloudFormation模板创建新的堆栈时,都可以从外部提供这个名字。

我在这里写过更多关于AWS CloudFormation模板参数的内容。

AWS CloudFormation参数