演练:创建您的第一个堆栈 - Amazon CloudFormation
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

演练:创建您的第一个堆栈

在本演练中,您将使用示例模板创建一个 CloudFormation 堆栈,从而创建在 EC2 实例上托管 WordPress 博客网站所需的资源。

示例模板会创建一个 EC2 实例。Amazon CloudFormation 是免费的,但 CloudFormation 创建的 Amazon 资源会实时运行(并且不在沙盒环境中运行)。从实例启动之时起到您删除堆栈并终止实例(本教程的最后一项任务)之时止,您需要支付标准的 Amazon EC2 使用费,即使实例处于空闲状态也不例外。有关 Amazon EC2 定价的更多信息,请参阅 Amazon EC2 定价页面。

步骤 1:选取模板

在这一步中,您将使用示例模板创建一个基本 WordPress 博客,后者将单个 Amazon EC2 实例与本地 MySQL 数据库结合使用来进行存储。该模板还创建一个 Amazon EC2 安全组以控制 Amazon EC2 实例的防火墙设置。

查看模板
  • 您可以查看 JSONYAML WordPress 示例模板。您无需下载此模板,因为您将在本指南的后面会使用相应的模板 URL。

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

Resources 部分包含要使用该模板创建的 Amazon 资源的定义。每项资源将分别列明,并指定创建此特定资源所需的属性。以下资源声明是 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 部分。您将使用映射来声明条件值,条件值的求值方式与查找表语句相似。模板将使用映射来选择该区域的亚马逊机器映像(AMI)以及该实例类型的架构类型。输出定义由 aws cloudformation describe-stacks 命令返回的自定义值,这些值位于创建堆栈后 CloudFormation 控制台的 Outputs (输出) 选项卡上。您可以使用输出值返回从堆栈中的资源得到的信息,例如,在模板中创建的网站的 URL。我们将在模板概述中更加详细地介绍映射、输出和其他有关模板的信息。

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

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

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

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

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

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

注意

如果您没有 Amazon EC2 密钥对,则必须在您要创建堆栈的同一 Amazon Web Services 区域中创建一个密钥对。有关创建密钥对的信息,请参阅《Amazon EC2 用户指南》中的获取密钥对

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

步骤 3:创建堆栈

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

要创建 WordPress 堆栈
  1. 登录到 Amazon Web Services Management Console 并打开 Amazon 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 存储桶中的 Amazon CloudFormation 模板必须可供创建堆栈的用户访问,并且必须与创建的堆栈位于同一区域。因此,如果 S3 存储桶位于 aws-region 区域,则堆栈也必须在 aws-region 中创建。

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

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

  6. 选择下一步

  7. 在这种情况下,我们不会添加任何标签。选择下一步。作为键值对的标签可帮助您识别堆栈。有关更多信息,请参阅 设置 Amazon 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 博客。您可以在Amazon CloudFormation 示例模板库中找到其他的模板。

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