开始使用 - AWS CloudFormation

开始使用

使用合适的模板,您可以立即部署一个应用程序所需要的所有 AWS 资源。在本节中,您将检查为 WordPress 博客声明资源的模板,创建一个 WordPress 博客作为堆栈,监视堆栈创建过程,检查堆栈上的资源,然后删除该堆栈。您需要使用 AWS Management Console 完成这些任务。

步骤 1:选取模板

首先,需要一个模板来指定堆栈中所需的资源。本步骤中,您可以使用一个已经准备就绪的示例模板。示例模板创建一个基本 WordPress 博客,后者将单个 Amazon EC2 实例与本地 MySQL 数据库结合使用来进行存储。该模板还创建一个 Amazon EC2 安全组以控制 Amazon EC2 实例的防火墙设置。

重要

AWS CloudFormation 是免费的,但 CloudFormation 创建的 AWS 资源将是激活的(并且不在沙盒中运行)。您将为这些资源承担标准使用费,直到您在本教程的最后一项任务中终止这些资源为止。总费用将应该最少的。有关如何最大限度地降低费用的信息,请转至 http://aws.amazon.com/free/

查看模板
  • 您可以查看 JSONYAML WordPress 示例模板。您无需下载此模板,因为您将在本指南的后面会使用相应的模板 URL。有关模板格式的更多信息,请参阅AWS CloudFormation 模板格式

模板是一个 JSON 或 YAML 文本文件,其中包含有关您希望在堆栈中创建的 AWS 资源的配置信息。在此演练中,示例模板包含六个顶级部分:AWSTemplateFormatVersionDescriptionParametersMappingsResourcesOutputs;但只有 Resources 部分是必需的。

Resources 部分包含要使用该模板创建的 AWS 资源的定义。每项资源将分别列明,并指定创建此特定资源所需的属性。以下资源声明是 EC2 实例的配置,该实例在本示例中的逻辑名称为 WebServer

例 JSON
"Resources" : { ... "WebServer": { "Type" : "AWS::EC2::Instance", "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "KeyName" : { "Ref" : "KeyName" }, "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum update -y aws-cfn-bootstrap\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServer ", " --configsets wordpress_install ", " --region ", { "Ref" : "AWS::Region" }, "\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServer ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} }, ... }, ... "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the load balancer + SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0"}, {"IpProtocol" : "tcp", "FromPort" : 22, "ToPort" : 22, "CidrIp" : { "Ref" : "SSHLocation"}} ] } }, ... },
例 YAML
Resources: ... WebServer: Type: AWS::EC2::Instance Properties: ImageId: !FindInMap [AWSRegionArch2AMI, !Ref 'AWS::Region', !FindInMap [AWSInstanceType2Arch, !Ref InstanceType, Arch]] InstanceType: Ref: InstanceType KeyName: Ref: KeyName SecurityGroups: - Ref: WebServerSecurityGroup UserData: Fn::Base64: !Sub | #!/bin/bash -xe yum update -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource WebServer --configsets wordpress_install --region ${AWS::Region} /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackId} --resource WebServer --region ${AWS::Region} ... ... WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: "Enable HTTP access via port 80 locked down to the load balancer + SSH access" SecurityGroupIngress: - CidrIp: 0.0.0.0/0 FromPort: 80 IpProtocol: tcp ToPort: 80 - CidrIp: !Ref SSHLocation FromPort: 22 IpProtocol: tcp ToPort: 22 ...

如果您之前创建过 EC2 实例,应当了解 ImageIdInstanceTypeKeyName 等确定该实例配置的属性。资源声明是立即指定这些所有配置设置的一种有效方法。当您将资源声明放入一个模板时,您将可以使用该模板创建和配置所有的声明资源,从而创建一个堆栈。若要启动资源的相同配置,需新建一个使用相同模板的堆栈即可。

资源声明开始于一个字符串,该字符串指定了资源的逻辑名称。如您所见,该逻辑名称可用于指代模板内的资源。

使用 Parameters 部分可以声明在创建堆栈时可传递给模板的值。参数是指明敏感信息的一种有效手段,这些敏感信息包括用户名和密码一类的和您不想存储在模板内部的信息。此外,它也是指定对特定应用程序可能具有唯一性的信息,或者您正在部署的配置(例如,域名或实例类型)的一种方法。当您在本节后面的步骤中创建 WordPress 堆栈时,将看到在模板中声明的参数集会显示在 Create Stack(创建堆栈)向导的 Specify Details(指定详细信息)页面中,您在创建堆栈之前可以在该页面中指定参数。

在模板中,以下参数用于指定在 EC2 实例的属性中使用的值:

例 JSON
"Parameters" : { ... "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instances", "Type": "AWS::EC2::KeyPair::KeyName", "ConstraintDescription" : "must be the name of an existing EC2 KeyPair." }, "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues": [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." }, ...
例 YAML
Parameters: ... KeyName: ConstraintDescription: must be the name of an existing EC2 KeyPair. Description: Name of an existing EC2 KeyPair to enable SSH access to the instances Type: AWS::EC2::KeyPair::KeyName InstanceType: AllowedValues: - t1.micro - t2.nano - t2.micro - t2.small - t2.medium - t2.large - m1.small - m1.medium - m1.large - m1.xlarge - m2.xlarge - m2.2xlarge - m2.4xlarge - m3.medium - m3.large - m3.xlarge - m3.2xlarge - m4.large - m4.xlarge - m4.2xlarge - m4.4xlarge - m4.10xlarge - c1.medium - c1.xlarge - c3.large - c3.xlarge - c3.2xlarge - c3.4xlarge - c3.8xlarge - c4.large - c4.xlarge - c4.2xlarge - c4.4xlarge - c4.8xlarge - g2.2xlarge - g2.8xlarge - r3.large - r3.xlarge - r3.2xlarge - r3.4xlarge - r3.8xlarge - i2.xlarge - i2.2xlarge - i2.4xlarge - i2.8xlarge - d2.xlarge - d2.2xlarge - d2.4xlarge - d2.8xlarge - hi1.4xlarge - hs1.8xlarge - cr1.8xlarge - cc2.8xlarge - cg1.4xlarge ConstraintDescription: must be a valid EC2 instance type. Default: t2.small Description: WebServer EC2 instance type Type: String ...

WebServer 资源声明中,KeyName 参数将指定 KeyName 属性:

例 JSON
"WebServer" : { "Type": "AWS::EC2::Instance", "Properties": { "KeyName" : { "Ref" : "KeyName" }, ... } },
例 YAML
WebServer: Type: AWS::EC2::Instance Properties: KeyName: Ref: KeyName ...

大括号内包含了 Ref 函数的一次调用,其中使用 KeyName 作为输入。Ref 函数将返回它指代的对象的值。在这种情况下,创建堆栈后,Ref 函数会将 KeyName 属性设成为 KeyName 指定的值。

Ref 函数也可以将某个资源的属性设置为另一个资源的属性值。例如,资源声明 WebServer 包含下列属性声明:

例 JSON
"WebServer" : { "Type": "AWS::EC2::Instance", "Properties": { ... "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], ... } },
例 YAML
WebServer: Type: AWS::EC2::Instance Properties: SecurityGroups: - Ref: WebServerSecurityGroup ...

SecurityGroups 属性接受 EC2 安全组列表。Ref 函数将使用 WebServerSecurityGroup 的输入,该输入内容为模板中一个安全组的逻辑名称,并将 WebServerSecurityGroup 的名称添加至 SecurityGroups 属性。

在模板中,您还会看到 Mappings 部分。您将使用映射来声明条件值,条件值的求值方式与查找表语句相似。在实例类型中,模板将使用映射为区域和架构类型选择正确的 Amazon 系统映像 (AMI)。输出定义由 aws cloudformation describe-stacks 命令返回的自定义值,这些值位于创建堆栈后 CloudFormation 控制台的 Outputs (输出) 选项卡上。您可以使用输出值返回从堆栈中的资源得到的信息,例如,在模板中创建的网站的 URL。我们将在了解模板基础知识中更加详细地介绍映射、输出和其他有关模板的信息。

现在关于模板的信息已经足够了。让我们开始创建一个堆栈吧。

步骤 2:确保您为创建堆栈所需的所有项目做好了准备。

在您从一个模板创建一个堆栈之前,您必须确保模板所需的所有独立资源都是可用的。模板可以使用或引用现有 AWS 资源以及在模板中声明的资源。CloudFormation 检查对模板中资源的引用,还检查对现有资源的引用,以确保这些资源存在于要创建堆栈的区域中。如果您的模板引用不存在的依赖资源,那么堆栈的创建将会失败。

示例 WordPress 模板包含一个输入参数 KeyName,该参数指定在模板中声明的 Amazon EC2 实例所使用的密钥对。模板依靠从模板创建堆栈的用户为 KeyName 参数提供有效的 Amazon EC2 密钥对。如果您提供了有效的密钥对名称,则该堆栈将会创建成功。如果您未提供有效的密钥对名称,则该堆栈将会回滚。

在您创建堆栈前,请确保您拥有有效的 Amazon EC2 密钥对,并记下密钥对名称。

若要查看密钥对,请打开 Amazon EC2 控制台,然后在导航窗格中选择 Key Pairs (密钥对)

注意

如果您没有 Amazon EC2 密钥对,则须在您即将创建堆栈的同一区域中创建一个密钥对。有关创建密钥对的信息,请参阅《Amazon EC2 用户指南(适用于 Linux 实例)》中的获取 SSH 密钥对

既然您已经拥有一个可用的密钥对,那就让我们使用 WordPress 模板来创建一个堆栈吧。

步骤 3:创建堆栈

您将根据前面讨论的 WordPress-1.0.0 文件创建堆栈。此模板包含多个 AWS 资源,例如 EC2 实例。

要创建 WordPress 堆栈
  1. 登录到 AWS Management Console 并打开 AWS CloudFormation 控制台 https://console.aws.amazon.com/cloudformation

  2. 选择创建堆栈

  3. 指定模板部分,选择 Amazon S3 模板 URL 以键入或粘贴示例 WordPress 模板的 URL,然后选择下一步

    https://s3.us-west-2.amazonaws.com/cloudformation-templates-us-west-2/WordPress_Single_Instance.template

    注意

    存储在 S3 存储桶中的 AWS CloudFormation 模板必须可供创建堆栈的用户访问,并且必须与创建的堆栈位于同一区域。因此,如果 S3 存储桶位于 us-east-2 区域,则还必须在 us-east-2 中创建堆栈。

  4. 指定堆栈详细信息部分的堆栈名称字段中,输入名称。对于本示例,请使用 MyWPTestStack。堆栈名中不得含有空格。

  5. 参数部分中,必须为所有没有默认值的参数提供值,包括 DBUserDBPasswordDBRootPasswordKeyName。在 KeyName 字段中,输入要创建堆栈的同一区域中的有效 Amazon EC2 对名称。

  6. 选择下一步

  7. 在这种情况下,我们不会添加任何标签。选择下一步。作为键值对的标签可帮助您识别堆栈。有关更多信息,请参阅向您的 CloudFormation 堆栈添加标签

  8. 审查堆栈信息。如果对设置满意,请选择 Submit (提交)

创建堆栈可能需要几分钟时间,不过您可能不想坐等消磨时间。如果您喜欢我们的产品,那么您可能会想知道堆栈的创建是如何进行的。

步骤 4:监控堆栈创建的进展

在您完成 Create Stack (创建堆栈) 向导后,CloudFormation 将开始创建模板中指定的资源。您的新堆栈 (MyWPTestStack) 将显示在 CloudFormation 控制台顶部的列表中。它的状态为 CREATE_IN_PROGRESS。您可以通过查看事件了解堆栈的详细状态。

想要查看堆栈的事件
  1. 在 CloudFormation 控制台上,选择列表中的堆栈 MyWPTestStack

  2. 在堆栈详细信息窗格中,选择 Events (事件) 选项卡。

    控制台每 60 秒自动使用最新事件刷新事件列表。

Events (事件) 选项卡显示堆栈创建过程中的每个重要步骤(按每个事件的时间排序,最新事件位于最上面)。

第一个事件 (在事件列表最底部) 为堆栈创建过程的开始:

2013-04-24 18:54 UTC-7 CREATE_IN_PROGRESS AWS::CloudFormation::Stack MyWPTestStack User initiated

下面是标志所有资源创建开始和完成的事件。例如,创建 EC2 实例后会产生以下条目:

2013-04-24 18:59 UTC-7 CREATE_COMPLETE AWS::EC2::Instance...

2013-04-24 18:54 UTC-7 CREATE_IN_PROGRESS AWS::EC2::Instance...

当 CloudFormation 报告它已开始创建资源时,将记录 CREATE_IN_PROGRESS 事件。在资源创建成功时,将记录 CREATE_COMPLETE 事件。

当 CloudFormation 成功创建了堆栈时,您将会在 Event (事件) 选项卡顶部看到下列事件:

2013-04-24 19:17 UTC-7 CREATE_COMPLETE AWS::CloudFormation::Stack MyWPTestStack

如果 CloudFormation 无法创建资源,它将报告 CREATE_FAILED 事件,并(在默认情况下)回滚堆栈、删除已创建的所有资源。状态原因列显示已导致失败的问题。

步骤 5:使用您的堆栈资源

当堆栈 MyWPTestStack 具有 CREATE_COMPLETE 状态时,CloudFormation 已完成堆栈的创建,并且您可以开始使用它的资源了。

示例 WordPress 堆栈将创建一个 WordPress 网站。您可以通过运行 WordPress 安装脚本来继续执行 WordPress 安装。

要完成 WordPress 的安装
  1. Outputs (输出) 选项卡上的 WebsiteURL 行上,选择 Value (值) 列中的链接。

    WebsiteURL 输出值就是您使用堆栈创建的 WordPress 网站的安装脚本的 URL。

  2. 在 WordPress 安装的网页上,请按照屏幕上显示的指示来完成 WordPress 安装。有关安装 WordPress 的更多信息,请参阅 https://wordpress.org/support/article/how-to-install-wordpress/

    完成安装并登录后,您会被定向到控制面板,您可以在那里设置 WordPress 博客的其他选项。然后,您可以开始为使用 CloudFormation 模板成功创建的博客撰写博文。

步骤 6:清理

您已完成 CloudFormation 开始任务。为了保证您不为不需要的服务承担费用,您可以通过删除堆栈和它的资源进行清理。

想要删除堆栈和它的资源
  1. 在 CloudFormation 控制台上,选择 MyWPTestStack 堆栈。

  2. 选择 Delete Stack

  3. 在出现的确认信息中,选择 Yes, Delete (是的,删除)

MyWPTestStack 的状态更改为 DELETE_IN_PROGRESS。按照您监控堆栈创建的同样方式,也可以使用 Event (事件) 选项卡监控删除堆栈的过程。当 CloudFormation 完成删除堆栈后,它会将从列表中移堆栈除。

恭喜您!您已经成功选取了一个模板,创建了一个堆栈,已经查看并使用了它的资源,并删除了该堆栈和它的资源。不仅如此,您还可以使用一个 CloudFormation 模板来建立一个 WordPress 博客。您可以在AWS CloudFormation 示例模板库中找到其他的模板。

现在,我们应该了解更多有关模板的信息,以便您可以修改现存的模板或创建您自己的模板:了解模板基础知识