AWS CloudFormation
User Guide (API Version 2010-05-15)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

了解模板基础知识

入门中,您已学习了如何使用模板创建堆栈。您已了解模板中声明的资源以及它们如何映射到堆栈中的资源。我们还涉及到了输入参数,以及当您在模板中创建一个堆栈时,这些参数如何能使您传入特定值。在本节中,我们将对资源和参数进行更深入的了解。我们也将介绍模板的其他组件,以便让您了解如何综合使用这些组件来创建能产生您想要的 AWS 资源的模板。

AWS CloudFormation 模板是什么?

模板是对组建堆栈的 AWS 资源的声明。模板将存储为文本文件,其格式符合 JavaScript 对象表示法 (JSON) 或 YAML 标准。鉴于只是文本文件,您可以在任何文本编辑器中创建编辑它们,亦可在源控制系统中用其余源代码对之进行管理。有关模板格式的更多信息,请参阅AWS CloudFormation 模板格式

在模板中,可以声明要创建和配置的 AWS 资源。将对象声明为名称/值对或名称与一组括起来的子对象的配对。语法取决于您使用的格式。有关更多信息,请参阅模板剖析。唯一需要的顶级数据元就是资源数据元,它至少须声明一种资源。让我们先从最基础的模板开始,该模板只包含一个单一资源声明的资源数据元。

资源:您好,存储段!

Resources 对象包含一系列资源对象。资源声明包含资源的属性,其本身声明为子数据元。一个资源必须有一个Type属性,该属性规定了您要创建 AWS 资源的类别。该Type属性有一个特殊格式:

Copy
AWS::ProductIdentifier::ResourceType

例如,一个 Amazon S3 存储段的资源类型是AWS::S3:: 存储段。有关资源类型完整列表的信息,请参阅模板参考

让我们先来了解一下最基础的模板。以下模板声明了一个名字为 HelloBucket 的 AWS::S3: 存储段类型的单一资源。

例 JSON

Copy
{ "Resources" : { "HelloBucket" : { "Type" : "AWS::S3::Bucket" } } }

例 YAML

Copy
Resources: HelloBucket: Type: AWS::S3::Bucket

如果您使用此模板创建一个堆栈, AWS CloudFormation 将创建一个 Amazon S3 存储段。鉴于 AWS CloudFormation 可以在默认设置情况下创建存储段,因此创建存储段是比较简单的。对于其他资源,如 Auto Scaling 组或 EC2 实例,AWS CloudFormation 需要更多信息。资源声明使用Properties属性来指定用于创建资源的信息。

根据资源类型,一些属性例如AWS::EC2:: 实例资源的 ImageId 属性是必选的,其他一些属于可选的。有些属性将有默认值,如 AWS:: S3:: 存储段资源的“AccessControl”属性,因此指定这些属性值是可选的。其他属性不是必选的,但可以添加您想要的功能,如 AWS:: S3:: 存储段资源的 WebsiteConfiguration 属性。根据您的需要,此类属性值的指定完全是可选的。在上面的例子中,因为 AWS:: S3:: 存储段资源只有可选属性,但我们并不需要任何可选功能,因此我们接受默认值忽略 Properties 属性。

要查看每个资源类型的属性,请参阅资源属性类型参考中主题。

资源属性和共同使用资源

通常情况下,资源属性只是一个字符串值。例如,以下模板为存储段的 AccessControl 属性指定了一个已存的 ACL (PublicRead)。

例 JSON

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

例 YAML

Copy
Resources: HelloBucket: Type: AWS::S3::Bucket Properties: AccessControl: PublicRead

有些资源可以有多个属性,而有些属性可以有一个或多个子属性。例如,AWS::S3:: 存储段资源就有 AccessControl 和 WebsiteConfiguration 两个属性。WebsiteConfiguration 属性有 IndexDocument 和 ErrorDocument 两个子属性。以下模板将展示我们的具有附加属性的原有存储段资源。

例 JSON

Copy
{ "Resources" : { "HelloBucket" : { "Type" : "AWS::S3::Bucket", "Properties" : { "AccessControl" : "PublicRead", "WebsiteConfiguration" : { "IndexDocument" : "index.html", "ErrorDocument" : "error.html" } } } } }

例 YAML

Copy
Resources: HelloBucket: Type: AWS::S3::Bucket Properties: AccessControl: PublicRead WebsiteConfiguration: IndexDocument: index.html ErrorDocument: error.html

模板和 AWS CloudFormation 的最大优势之一就是能够创建一组资源,这些资源能一起合作,共同创建一个应用程序或解决方案。模板内的资源所使用的名称是一个逻辑名称。在 AWS CloudFormation 创建资源时,会产生一个基于其逻辑名、堆栈名和一个独立 ID 相组合的实体名称。

您可能会想知道如何根据该名称或另一种资源的属性在一种资源上设置属性。例如,您可以创建一个受 S3 存储段或使用 EC2 安全组的 EC2 实例支持的 CloudFront 分配,并且可以在同一模板中创建所有这些资源。 AWS CloudFormation 提供许多内部函数,您可以使用这些函数来引用其他资源及其属性。您可以使用Ref 函数来参阅资源的标识属性。通常,这是资源的实体名称;然而,有时,它也可以作为一个标识符,例如,AWS::EC2::EIP资源的 IP 地址或 Amazon SNS 主题的 Amazon 资源名称 (ARN)。有关 Ref 函数返回的一系列值的信息,请参阅Ref 函数。下列模板包含一个AWS::EC2::实例资源。该资源的 SecurityGroups 属性调用了 Ref 函数,以便能参阅 AWS::EC2::SecurityGroup 资源,即 InstanceSecurityGroup。

例 JSON

Copy
{ "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ], "KeyName": "mykey", "ImageId": "" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": "0.0.0.0/0" } ] } } } }

例 YAML

Copy
Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroups: - !Ref InstanceSecurityGroup KeyName: mykey ImageId: '' InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: '22' ToPort: '22' CidrIp: 0.0.0.0/0

SecurityGroups 属性是一个安全组列表,在之前的示例中,该列表只有一个项目。在 SecurityGroups 属性列表中,以下模板有一个附加项目。

例 JSON

Copy
{ "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" }, "MyExistingSecurityGroup" ], "KeyName": "mykey", "ImageId": "ami-7a11e213" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": "0.0.0.0/0" } ] } } } }

例 YAML

Copy
Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroups: - !Ref InstanceSecurityGroup - MyExistingSecurityGroup KeyName: mykey ImageId: ami-7a11e213 InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: '22' ToPort: '22' CidrIp: 0.0.0.0/0

MyExistingSecurityGroup 是指代现存 EC2 安全组,而不是模板中声明的安全组一个字符串。您可以使用文字字符串来指代现存 AWS 资源。

在上述示例中,AWS::EC2::实例的 KeyName 属性是文字字符串 mykey。这就意味着,名为 mykey 的密钥对必须位于正在创建堆栈的区域;否则,由于不存在密钥对,堆栈创建将失败。您所使用的密钥对会因您正在创建堆栈区域而异,或是您想与其他人共享该模板,使他们能与其 AWS 账户共用。如果是这样的话,您可使用输入参数以便在创建堆栈时指定密钥对名称。Ref 函数可指代那些在创建堆栈时指定的输入参数。以下模板添加了一个包含 KeyName 参数的参数对象,其中,KeyName 参数用于指定 AWS::EC2::Instance 资源的 KeyName 属性。参数类型为 AWS::EC2::KeyPair::KeyName,这将确保用户在其账户和正从中创建堆栈的区域中指定一个有效的密钥对名称。

例 JSON

Copy
{ "Parameters": { "KeyName": { "Description": "The EC2 Key Pair to allow SSH access to the instance", "Type": "AWS::EC2::KeyPair::KeyName" } }, "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" }, "MyExistingSecurityGroup" ], "KeyName": { "Ref": "KeyName" }, "ImageId": "ami-7a11e213" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": "0.0.0.0/0" } ] } } } }

例 YAML

Copy
Parameters: KeyName: Description: The EC2 Key Pair to allow SSH access to the instance Type: 'AWS::EC2::KeyPair::KeyName' Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroups: - !Ref InstanceSecurityGroup - MyExistingSecurityGroup KeyName: !Ref KeyName ImageId: ami-7a11e213 InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: '22' ToPort: '22' CidrIp: 0.0.0.0/0

如果该参数或为资源返回的值正是您需要的,该 Ref 函数是很方便的,但可能还需要其他的资源属性。例如,如果您想创建一个具有 S3 起始地址的 CloudFront 分配,就需要使用 DNS 样式的地址来指定存储段的位置。许多资源都具有附加属性,您可以在模板中使用这些属性的值。若要获得这些属性,您可以使用Fn::GetAtt函数。以下模板创建了一个 CloudFront 分配资源,通过使用 Fn::GetAtt 函数,该资源指定了 S3 存储段资源的 DNS 名,以便能获得 S3 存储段的 DomainName 属性。

例 JSON

Copy
{ "Resources": { "myBucket": { "Type": "AWS::S3::Bucket" }, "myDistribution": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { "Origins": [ { "DomainName": { "Fn::GetAtt": [ "myBucket", "DomainName" ] }, "Id": "myS3Origin", "S3OriginConfig": {} } ], "Enabled": "true", "DefaultCacheBehavior": { "TargetOriginId": "myS3Origin", "ForwardedValues": { "QueryString": "false" }, "ViewerProtocolPolicy": "allow-all" } } } } } }

例 YAML

Copy
Resources: myBucket: Type: 'AWS::S3::Bucket' myDistribution: Type: 'AWS::CloudFront::Distribution' Properties: DistributionConfig: Origins: - DomainName: !GetAtt - myBucket - DomainName Id: myS3Origin S3OriginConfig: {} Enabled: 'true' DefaultCacheBehavior: TargetOriginId: myS3Origin ForwardedValues: QueryString: 'false' ViewerProtocolPolicy: allow-all

FN::GetAtt 函数有两个参数,即资源的逻辑名和要检索的属性名。有关这些资源的可用属性的完整列表,请参阅Fn::GetAtt。您将发现 Fn::GetAtt 函数在一个数组中列出其两个参数。对于采用多个参数的函数,可以使用数组来指定其参数。

使用输入参数的接收用户输入

迄今为止,您已经了解了这些资源和一点点有关如何在一个模板内共用这些资源的信息。您已经学习了如何引用输入参数,但我们还未深入研究过如何定义这些输入参数本身。让我们先来了解一下参数声明,以及如何限制并验证用户输入。

声明模板参数数据元中的那些参数。一个参数包含一系列属性,这些属性定义了其值但也限制了其值。唯一需要的属性就是 Type,它可以是 String、Number 或 AWS 特定的类型。您还可以添加一个描述属性,该属性会告诉用户更多有关应指定何种值的信息。当用户使用创建堆栈向导中的模板时,参数的名称和描述会出现在指定参数页面。

下列模板片段是参数数据元,这些数据元声明了在上述指定参数页面中使用的参数。

例 JSON

Copy
"Parameters": { "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access into the WordPress web server", "Type": "AWS::EC2::KeyPair::KeyName" }, "WordPressUser": { "Default": "admin", "NoEcho": "true", "Description" : "The WordPress database admin account user name", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*" }, "WebServerPort": { "Default": "8888", "Description" : "TCP/IP port for the WordPress web server", "Type": "Number", "MinValue": "1", "MaxValue": "65535" } }

例 YAML

Copy
Parameters: KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access into the WordPress web server Type: AWS::EC2::KeyPair::KeyName WordPressUser: Default: admin NoEcho: true Description: The WordPress database admin account user name Type: String MinLength: 1 MaxLength: 16 AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*" WebServerPort: Default: 8888 Description: TCP/IP port for the WordPress web server Type: Number MinValue: 1 MaxValue: 65535

对于具有默认值的参数,AWS CloudFormation 将使用默认值,除非用户指定其他值。如果省略默认属性,则用户将需要指定该参数的值;然而,要求用户输入值并不能确保该值是有效的。要验证参数的值,您可以声明一些约束条件或指定某个特定于 AWS 的参数类型。

您会注意到 KeyName 参数并没有 Default 属性,而其他参数却有。例如,WordPress 参数有属性 Default: admin,但 KeyName 参数却没有。用户必须在创建堆栈时指定一个键名称值。如果用户未执行此操作,AWS CloudFormation 将无法创建堆栈,并将引发异常:Parameters: [KeyName] must have values

对于特定于 AWS 的参数类型,AWS CloudFormation 会在创建任何堆栈资源之前,对照用户的 AWS 账户中以及用户创建堆栈所在的区域中的现有值验证输入值。在示例模板中,KeyName 参数是 AWS::EC2::KeyPair::KeyName 的特定于 AWS 的参数类型。AWS CloudFormation 将在创建堆栈之前检查用户是否指定了有效的 EC2 键对名称。特定于 AWS 的参数类型的另一个示例是 AWS::EC2::VPC::Id,该类型要求用户指定一个有效的 VPC ID。除了前期验证之外,AWS 控制台将在用户使用“Create Stack”向导时针对特定于 AWS 的参数类型显示一个有效值的下拉列表,例如,有效的 EC2 键对名称或 VPC ID。

对于 String 类型,您可以使用以下属性来声明约束:MinLengthMaxLengthDefaultAllowedValuesAllowedPattern。在以上示例中,WordPressUser 参数有三个约束:参数值必须是 1 到 16 个字符长 (MinLengthMaxLength),必须以字母开头,后面是字母和数字的任何组合 (AllowedPattern)。

对于 Number 类型,您可以声明以下约束:MinValueMaxValueDefaultAllowedValues。数字可以是一个整数或一个浮点值。在上述示例中,WebServerPort 参数必须是一个介于 1 和 65535 (含 65535) 之间的一个数字 (MinValue, MaxValue)。

在本节之前,我们提到,参数是一个指定敏感或实现特定数据的很好的方式,如您需要使用但却不想嵌入模板本身的密码或用户名。对于敏感信息,您可以使用NoEcho属性让参数值不显示在控制台、命令行工具或 API 上。如果您将 NoEcho 属性设置为 true,则将以星号 (*****) 的形式返回参数值。在上述示例中,WordPressUser 参数值对于查看堆栈设置的任何人都是不可见的,其值以星号形式返回。

使用映射指定条件型值

参数是一个能帮助客户指定在堆栈资源属性中用到的独立或敏感值的绝佳方法,然而,可能会有一些视区域而定的设置,或是一些因其他条件或依赖关系而需要用户弄清的复杂设置。在这些情况下,您会需要把一些逻辑放入模板本身中,以便用户可以指定简单值(或根本没有)来获得他们希望得到的结果。在前面的示例中,我们为 EC2 实例的 ImageId 属性硬编码了 AMI ID。AMI ID 在美国东部区域操作正常,它代表了我们想要的 AMI。然而,如果用户尝试在不同区域的创建堆栈,那么他或她将会得到一个错误的 AMI 或根本得不到 AMI。(AMI ID 对一个区域来说是唯一的,因此在一个不同的区域,同一个 AMI ID 可能并不代表任何 AMI 或一个完全不同的 AMI。)

若要避免这个问题,您需要(在本示例中,创建堆栈的区域)通过一种方式根据条件型输入指定正确 AMI ID。有两种模板功能能起到作用,即映射数据元和 AWS:: 区域伪参数。

AWS:: 区域伪参数是一个用于 AWS CloudFormation 解析创建堆栈所在区域的值。在创建堆栈时,AWS CloudFormation 解析了这些伪参数。映射可让您把一个输入值用作确定另一个值的条件。类似于交换语句,一个映射将把一组值与另一组值联系起来。AWS:: 区域参数与映射相结合使用,您能确保为该区域指定一个适当的 AMI ID。以下模板包含一个名为 RegionMap 的映射对象,该对象用于将 AMI ID 映射到合适的区域。

例 JSON

Copy
{ "Parameters": { "KeyName": { "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instance", "Type": "String" } }, "Mappings": { "RegionMap": { "us-east-1": { "AMI": "ami-76f0061f" }, "us-west-1": { "AMI": "ami-655a0a20" }, "eu-west-1": { "AMI": "ami-7fd4e10b" }, "ap-southeast-1": { "AMI": "ami-72621c20" }, "ap-northeast-1": { "AMI": "ami-8e08a38f" } } }, "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "KeyName": { "Ref": "KeyName" }, "ImageId": { "Fn::FindInMap": [ "RegionMap", { "Ref": "AWS::Region" }, "AMI" ] }, "UserData": { "Fn::Base64": "80" } } } } }

例 YAML

Copy
Parameters: KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access to the instance Type: String Mappings: RegionMap: us-east-1: AMI: ami-76f0061f us-west-1: AMI: ami-655a0a20 eu-west-1: AMI: ami-7fd4e10b ap-southeast-1: AMI: ami-72621c20 ap-northeast-1: AMI: ami-8e08a38f Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: KeyName: !Ref KeyName ImageId: !FindInMap - RegionMap - !Ref 'AWS::Region' - AMI UserData: !Base64 '80'

在 RegionMap 中,每个区域都会被映射到一个名值对中。名值对是一个标签,该值是用来映射的。在 RegionMap 中,AMI 是该标签,AMI ID 是该值。要使用映射返回值,请使用 Fn::FindInMap 函数传递映射的名称、用于查找映射值的值,以及要返回的映射值的标签。在上述示例中,资源 Ec2Instance 的 ImageId 属性通过把 RegionMap 指定为要使用的映射,把 AWS:: 区域指定为开始映射的输入值,把 AMI 指定为映射到的需要标识的标签,使用了 Fn::FindInMap 函数来确定其值。例如,如果该模板用于创建美国东部 1 区域的堆栈,ImageId 会被设置为 ami-655a0a20。

提示

AWS:: 区域伪参数能使您获得创建堆栈的区域。有些资源,例如AWS::EC2:: 实例AWS::AutoScaling::AutoScalingGroup AWS::ElasticLoadBalancing::LoadBalancer 都有一个指定了可用区的属性。您可以使用Fn::GetAZs 函数来获得一个区域内所有可用区的列表。

已构建的值和输出值

创建堆栈时,参数和映射是一种传递或确定特定值的极好的方式,但可能存在一些情况,例如参数值或其他资源属性值仅仅是您所需要的值的一部分。例如,在以下 WordPress 模板的片段中,通过并置 WebServerPort 参数和其他文字字符串,Fn::加入函数为 ElasticLoadBalancer 资源的 HealthCheck 属性构建了目标子属性,以便形成所需值。

例 JSON

Copy
{ "Resources": { "ElasticLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "AvailabilityZones": { "Fn::GetAZs": "" }, "Instances": [ { "Ref": "Ec2Instance1" }, { "Ref": "Ec2Instance2" } ], "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": { "Ref": "WebServerPort" }, "Protocol": "HTTP" } ], "HealthCheck": { "Target": { "Fn::Join": [ "", [ "HTTP:", { "Ref": "WebServerPort" }, "/" ] ] }, "HealthyThreshold": "3", "UnhealthyThreshold": "5", "Interval": "30", "Timeout": "5" } } } } }

例 YAML

Copy
Resources: ElasticLoadBalancer: Type: 'AWS::ElasticLoadBalancing::LoadBalancer' Properties: AvailabilityZones: !GetAZs '' Instances: - !Ref Ec2Instance1 - !Ref Ec2Instance2 Listeners: - LoadBalancerPort: '80' InstancePort: !Ref WebServerPort Protocol: HTTP HealthCheck: Target: !Join - '' - - 'HTTP:' - !Ref WebServerPort - / HealthyThreshold: '3' UnhealthyThreshold: '5' Interval: '30' Timeout: '5'

Fn::加入函数有两个参数,一个是把您想要并置的值分开的分隔符,另一个是按您想要这些值出现的顺序排列的数组。在上述示例中,Fn::加入函数指定了一个空字符串作为分隔符和 HTTP:,WebServerPort 参数的值,以及一个 / 字符被作为要并置的值。如果 WebServerPort 有一个值为 8888,该目标属性就会被设置为以下值:

Copy
HTTP:8888/

Fn::加入函数对于声明该堆栈的输出值来说也是很有用的。该模板中的输出数据元包含您想要使之在堆栈创建后可用的值的声明。输出是一个用于捕获有关您的资源或输入参数的重要信息的便捷方式。例如,在 WordPress 模板中,我们声明了以下输出数据元。

例 JSON

Copy
"Outputs": { "InstallURL": { "Value": { "Fn::Join": [ "", [ "http://", { "Fn::GetAtt": [ "ElasticLoadBalancer", "DNSName" ] }, "/wp-admin/install.php" ] ] }, "Description": "Installation URL of the WordPress website" }, "WebsiteURL": { "Value": { "Fn::Join": [ "", [ "http://", { "Fn::GetAtt": [ "ElasticLoadBalancer", "DNSName" ] } ] ] } } }

例 YAML

Copy
Outputs: InstallURL: Value: !Join - '' - - 'http://' - !GetAtt - ElasticLoadBalancer - DNSName - /wp-admin/install.php Description: Installation URL of the WordPress website WebsiteURL: Value: !Join - '' - - 'http://' - !GetAtt - ElasticLoadBalancer - DNSName

每一个输出值都有一个名称,一个包含该返回值声明的值属性被作为输出值,和一个视需要而定的该值的描述。在前面的例子中,InstallURL 是一个由一个 Fn::加入函数调用返回的字符串,该字符串并置了 http://,资源 ElasticLoadBalancer 的 DNS 名,和 /wp-admin/install.php。该输出值可能会与以下值相似:

Copy
http://mywptests-elasticl-1gb51l6sl8y5v-206169572.us-east-2.elb.amazonaws.com/wp-admin/install.php

在入门教程中,我们使用此链接很方便地进入了已建 WordPress 博客安装页面。AWS CloudFormation 在完成堆栈的创建之后生成了这些输出值。可以在 AWS CloudFormation 控制台“Outputs (输出)”选项卡中或使用 aws cloudformation describe-stacks 命令查看输出值。

后续步骤

我们刚刚详细介绍了一个模板的基本部分,以及如何使用它们。您已了解了有关模板的以下信息:

  • 声明资源及其属性

  • 请参考具有 Ref 函数的其他资源和使用 Fn::GetAtt 函数的资源属性

  • 使用参数来使用户在创建堆栈期间指定这些值,使用限制条件来验证参数输入

  • 使用映射来确定条件值。

  • 根据参数、资源属性和其他字符串,使用 Fn::加入函数来构建值。

  • 使用基于值的输出来获得有关堆栈资源的信息。

在一个模板中没有涵盖两个顶级对象:AWSTemplateFormatVersion 和 描述。AWSTemplateFormatVersion 只是模板格式的版本,如果您不指定,AWS CloudFormation 将使用最新版本。Description 是任意有效的 JSON 或 YAML 字符串。此说明将显示在“Create Stack”向导的“Specify Parameters”页面上。有关更多信息,请参阅 格式版本描述

当然,还有很多高级的模板和堆栈功能。这里是一些您也许想要了解的重要模板和堆栈功能的列表:

可与任何资源共同使用的可选属性

  • DependsOn 属性能使您指定必须在一种资源创建之后才能接着创建另一个资源。

  • DeletionPolicy 属性,可使您指定 AWS CloudFormation 如何处理资源删除的方式。

  • 元数据属性可让您指定一个资源的结构化数据。

AWS::CloudFormation::Stack 使您可以在模板中将另一个堆栈作为资源嵌套。