了解模板基础知识 - Amazon CloudFormation
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

了解模板基础知识

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

Amazon CloudFormation 模板是什么?

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

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

资源:您好,存储桶!

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

AWS::ProductIdentifier::ResourceType

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

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

JSON

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

YAML

Resources: HelloBucket: Type: 'AWS::S3::Bucket'

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

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

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

资源属性和共同使用资源

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

JSON

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

YAML

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

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

JSON

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

YAML

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

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

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

JSON

{ "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

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

{ "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

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 安全组,而不是模板中声明的安全组一个字符串。您可以使用文字字符串来指代现有 Amazon 资源。

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

JSON

{ "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

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

{ "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

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 或 Amazon 特定的类型。您还可以添加一个描述属性,该属性会告诉用户更多有关应指定何种值的信息。当用户使用创建堆栈向导中的模板时,参数的名称和描述会出现在指定参数页面。

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

JSON

"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

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

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

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

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

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

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

在本节之前,我们提到,参数是一个指定敏感或实现特定数据的很好的方式,如您需要使用但却不想嵌入模板本身的密码或用户名。如果您将 NoEcho 属性设置为 true,则对于描述堆栈或堆栈事件的任何调用,CloudFormation 返回使用星号 (*****) 遮蔽的参数值,但存储在下面指定位置的信息除外。在上述示例中,WordPressUser 参数值对于查看堆栈设置的任何人都是不可见的,其值以星号形式返回。

重要

使用 NoEcho 属性不会遮蔽在以下各区段中存储的任何信息:

  • Metadata 模板区段。CloudFormation 不会转换、修改或编辑您在 Metadata 部分中包含的任何信息。有关更多信息,请参阅元数据

  • Outputs 模板区段。有关更多信息,请参阅输出

  • 资源定义的 Metadata 属性。有关更多信息,请参阅Metadata 属性

强烈建议您不要使用这些机制来包含敏感信息,例如密码。

重要

我们建议不要将敏感信息直接嵌入 CloudFormation 模板中,而应使用堆栈模板中的动态参数来引用在 CloudFormation 外部存储和管理的敏感信息,例如 Amazon Systems Manager Parameter Store 或 Amazon Secrets Manager 中的敏感信息。

有关更多信息,请参阅 请勿将凭证嵌入您的模板 最佳实践。

使用映射指定条件型值

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

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

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

JSON

{ "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

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::Region 指定为开始映射的输入值,把 AMI 指定为映射到的需要标识的标签,使用 Fn::FindInMap 函数来确定其值。例如,如果该模板用于创建美国西部(北加利福尼亚)区域的堆栈,ImageId 将设置为 ami-655a0a20

提示

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

已构建的值和输出值

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

JSON

{ "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

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

HTTP:8888/

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

JSON

{ "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

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::Join 函数调用返回的字符串,该字符串并置了 http://,资源 ElasticLoadBalancer 的 DNS 名,和 /wp-admin/install.php。该输出值可能会与以下值相似:

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

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

后续步骤

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

  • 声明资源及其属性。

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

  • 使用参数来使用户在创建堆栈期间指定这些值,使用约束来验证参数输入。

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

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

  • 使用输出值捕获有关堆栈的资源的信息。

在一个模板中没有涵盖两个顶级对象:AWSTemplateFormatVersion 和 描述。AWSTemplateFormatVersion 只是模板格式的版本 - 如果您不指定,CloudFormation 将使用最新版本。

Description 是任意有效的 JSON 或 YAML 字符串。此说明将显示在“Create Stack”向导的“Specify Parameters”页面上。有关更多信息,请参阅 格式版本描述

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

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

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

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

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

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