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

模板概述

本主题介绍了模板的关键部分,以及如何使用这些部分。

您可以通过此页面上的相应部分了解有关模板的以下内容:

  • 声明资源及其属性。

  • 使用 Ref 函数引用其他资源,以及使用 Fn::GetAtt 函数引用资源属性。

  • 使用参数来指定创建堆栈时将使用的值,以及使用约束来验证参数输入。

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

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

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

关于模板

CloudFormation 模板是对构成堆栈的 Amazon 资源的声明。该模板是一种文本文件,遵循使用 JavaScript 对象表示法(JSON)或 YAML 标准的特定格式规则。由于模板属于文本文件,因此可以在任何文本编辑器中进行创建和编辑,还可在源代码控制系统中连同其他源代码一起进行管理。

模板中会声明您要创建的 Amazon 资源。您可以使用所选格式(JSON 或 YAML)的语法规则,将每个资源定义为一组属性和值。

模板可以有不同的部分,唯一必须具备的部分是 Resources 部分,其中必须至少声明一种资源。

有关演示包含所有可用部分的模板完整结构的示例,请参阅模板格式。有关您可以使用 CloudFormation 创建的资源列表,请参阅 Amazon 资源和属性类型参考

资源:您好,存储桶!

Resources 部分是您要创建的资源的列表。每个资源必须有一个 Type 属性,用于定义 Amazon 资源的类型。该Type属性有一个特殊格式:

AWS::ProductIdentifier::ResourceType

例如,Amazon S3 桶的资源类型是 AWS::S3::Bucket

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

JSON

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

YAML

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

如果使用该模板创建堆栈,CloudFormation 将创建一个 Amazon S3 存储桶。鉴于 CloudFormation 可以在默认设置情况下创建存储桶,因此创建存储桶是比较简单的。对于 Amazon 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 资源具有 AccessControlWebsiteConfiguration 这两个属性。WebsiteConfiguration 属性具有 IndexDocumentErrorDocument 这两个子属性。以下模板将展示我们的具有附加属性的原有存储桶资源。

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::InstanceKeyName 属性是一个文本字符串 mykey。这就意味着,名为 mykey 的密钥对必须位于正在创建堆栈的区域;否则,由于不存在密钥对,堆栈创建将失败。您使用的密钥对因您创建堆栈的区域而异,还是您需要与其他人共享该模板,以便其能够通过其 Amazon Web Services 账户 账户使用该模板。如果是这样的话,您可使用输入参数以便在创建堆栈时指定密钥对名称。Ref 函数可引用在创建堆栈时指定的输入参数。以下模板添加了一个包含 KeyName 参数的 Parameters 部分,该参数用于指定 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 名,用来获取该存储桶的 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::GetAttFn::GetAtt 函数会在一个数组中列出这两个参数。对于采用多个参数的函数,可以使用数组来指定其参数。

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

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

您需要在模板的 Parameters 部分中声明参数。一个参数包含一系列属性,这些属性定义了其值但也限制了其值。唯一必须声明的属性是 Type,该属性可以是 StringNumber 或 Amazon 特定的类型。您还可以添加 Description 属性来描述要指定的值的类型。在创建堆栈向导中使用该模板时,参数的名称和描述会在指定参数页面中显示。

下列模板片段是一个 Parameters 部分,其中声明了在指定参数页面中使用的参数。

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 Web Services 账户以及用户创建堆栈所在区域中的现有值验证输入值,然后再创建任何堆栈资源。在示例模板中,KeyName 参数是 AWS::EC2::KeyPair::KeyName 的 Amazon 特定参数类型。在创建堆栈之前,CloudFormation 检查用户是否指定了有效的 EC2 密钥对名称。特定于 Amazon 的参数类型的另一个示例是 AWS::EC2::VPC::Id,该类型要求用户指定一个有效的 VPC ID。除了提前验证之外,在用户使用创建堆栈向导时,Amazon 控制台还将针对 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。有两种模板功能或可起到作用,即 Mappings 部分和 AWS::Region 伪参数。

AWS::Region 伪参数是一个用于 CloudFormation 解析创建堆栈所在区域的值。在创建堆栈时,CloudFormation 解析了这些伪参数。映射可让您把一个输入值用作确定另一个值的条件。类似于交换语句,一个映射将把一组值与另一组值联系起来。AWS::Region 参数与映射相结合使用,您能确保为该区域指定一个适当的 AMI ID。以下模板包含一个 Mappings 部分,其中具有一个名为 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 函数传递映射的名称、用于查找映射值的值,以及要返回的映射值的标签。在上例中,资源 Ec2InstanceImageId 属性通过将 Fn::FindInMap 指定为要使用的映射,将 RegionMap 指定为映射的输入值,将 AMI 指定为标签以标识要映射到的值,从而使用 AWS::Region 函数来确定其值。例如,假设该模板用于在美国西部(北加利福尼亚)区域创建一个堆栈,ImageId 将被设置为 ami-655a0a20

提示

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

已构建的值和输出值

创建堆栈时,参数和映射是一种传递或确定特定值的极好的方式,但可能存在一些情况,例如参数值或其他资源属性值仅仅是您所需要的值的一部分。例如,在以下 WordPress 模板片段中,Fn::Join 函数通过并置 WebServerPort 参数和其他文本字符串来形成所需的值,为 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,则 Target 属性将被设置为以下值:

HTTP:8888/

有关 Fn::Join 函数的更多信息,请参阅Fn::Join

Fn::Join 函数对于声明该堆栈的输出值也非常实用。模板中的 Outputs 部分包含您要在堆栈创建后使其可用的值的声明。输出是一个用于捕获有关您的资源或输入参数的重要信息的便捷方式。例如,我们可以为一个用于创建 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

每个输出值都有一个名称,一个包含将返回值声明为输出值的 Value 属性,以及一个对该值的可选描述。在前面的示例中,InstallURLFn::Join 函数调用返回的字符串,该字符串用于连接 http://、资源 ElasticLoadBalancer 的 DNS 名称和 /wp-admin/install.php。该输出值可能会与以下值相似:

http://mywptests-elasticl-1gb51l6sl8y5v-206169572.aws-region.elb.amazonaws.com/wp-admin/install.php

创建堆栈后,我们可以使用此链接转到已创建的 WordPress 博客的安装页面。CloudFormation 在完成创建堆栈后生成这些输出值。可以在 CloudFormation 控制台的 Outputs 选项卡中或使用 describe-stacks CLI 命令来查看输出值。

了解更多信息

我们刚刚详细介绍了一个模板的基本部分,以及如何使用它们。

我们并未阐述一个模板中的两个顶层部分:AWSTemplateFormatVersionDescription

AWSTemplateFormatVersion 只是模板格式的版本。如果不指定,CloudFormation 将使用最新版本。有关更多信息,请参阅 格式版本

Description 是任意有效的 JSON 或 YAML 字符串。此描述将在创建堆栈向导的指定参数页面上显示。有关更多信息,请参阅 描述

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

  • DependsOn – 此属性用于指定必须在一个资源创建之后才能创建另一个资源。

  • DeletionPolicy – 此属性用于指定 CloudFormation 如何处理资源删除的方式。

  • Metadata – 此属性用于指定资源的结构化数据。