AWS CloudFormation 系列--(2)常用函数及字段

本文介绍了AWS CloudFormation中重要的DependsOn属性和常用内部函数,如Fn::Ref、Fn::GetAtt、Fn::Select等,强调了它们在创建、更新资源时的作用。此外,讨论了Parameters、Outputs、Mappings字段的使用,以提高模板的灵活性,并给出了实际应用场景。通过示例展示了如何结合参数和函数创建更灵活的CloudFormation模板。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AWS CloudFormation 系列–(2)常用函数及字段

B站视频链接: https://www.bilibili.com/video/BV1Pe411L7zL/?spm_id_from=333.999.list.card_archive.click
微信公众号: 自刘地


前面CloudFormation的快速入门,基本了解了如何使用这个服务来创建AWS资源。但是前面写的代码基本只能自己看看,没法分享给别人使用,比如代码里面明确写了EC2的密钥,别人账号里面肯定没有这个密钥,应该让使用者自己选择密钥信息。

所以需要创建更加灵活的CloudFormation模板,这里会介绍一些常见的字段和函数,了解了这些之后,基本上能看懂网络上大部分的CloudFormation代码。

这篇文章知识点比较多,我会先追个介绍,最后会通过一个实验把这些知识点整合起来。下面这个实验环境,和之前快速入门是一样的,但是会通过一些函数和字段,让这个模板更加灵活。

一、DependsOn属性

前面快速入门,讲过了模板里面最重要的资源(Resources)字段。资源字段内部一共有6种属性,这里只介绍最常用的DependsOn属性。

之前创建的环境比较简单,所以没有用到这个属性。如果在两个资源之间有依赖关系时,如果你希望其中一个资源先创建,然后再创建另外一个资源,就可以用DependsOn属性。

CreationPolicy attribute
DeletionPolicy attribute
DependsOn attribute
Metadata attribute
UpdatePolicy attribute
UpdateReplacePolicy attribute

这里通过一个场景,来看DependsOn属性的用法。例如需要在CloudFormation代码里面创建EC2和数据库,并且让EC2连接上数据库。那么肯定希望先创建数据,然后再创建EC2,否则肯定连接不上。这时候就可以在EC2资源下面,加上DependsOn属性,确保创建完数据之后再创建EC2。

Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    DependsOn: myDB
    Properties:
      ImageId: ami-003a3de8892ecbc45
  myDB:
    Type: AWS::RDS::DBInstance
    Properties:
      AllocatedStorage: '5'
      DBInstanceClass: db.t2.small
      Engine: MySQL
      EngineVersion: '5.5'
      MasterUsername: MyName
      MasterUserPassword: MyPassword

这里其实隐含了一个特性,就是AWS在创建、更新、删除资源的时候默认是并行的,也就是尽可能同时创建所有资源。使用DependsOn属性可以明确的指定资源创建的先后顺序。

另外!Ref!GetAtt 这两个内部函数具有隐式的依赖关系。例如之前使用过!Ref函数,在创建IGW时,使用Ref函数调用了VPC ID信息,这样也可以确保被调用的资源先创建,也就是创建VPC之后,才会创建IGW。

# IGW 关联VPC
  MyTestAttachIgw:
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties:
      VpcId: !Ref MyTestVpc
      InternetGatewayId: !Ref MyTestIgw

二、常用内部函数

下面介绍CloudFormation常见的一些内部函数。

只能在特定的模板字段下面使用内部函数,例如在resource propertiesoutputs、metadata attributes、update policy attributes这几个字段下面使用内部函数。下面是所有内部函数,这里只介绍几个常用的内部函数[参考链接1]。

Fn::Base64
Fn::Cidr
Condition functions
Fn::FindInMap
Fn::GetAtt
Fn::GetAZs
Fn::ImportValue
Fn::Join
Fn::Select
Fn::Split
Fn::Sub
Fn::Transform
Ref

Fn::Ref 函数

最常见的毫无疑问就是Ref函数,前面的模板使用过了Ref函数,一般情况下Ref函数返回资源的ID信息。有些资源会返回有重要意义的标识符,例如AWS::EC2::EIP[参考链接2]资源返回 IP 地址,AWS::EC2::Instance返回实例 ID。

完整函数名称的语法:

Ref: logicalName

短格式的语法:

!Ref logicalName

例如前面将IGW关联到VPC,就用到Ref函数,VPC ID使用了完成名称,IGW ID使用了短格式写法。一般我会使用短格式写法,写在一行更加简洁。

  MyTestAttachIgw:
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties:
      VpcId: 
        Ref: MyTestVpc
      InternetGatewayId: !Ref MyTestIgw

Fn::GetAtt 函数

Fn::GetAtt 函数返回模板中资源的属性值。例如你希望获取EC2实例的公网IP地址,就可以使用!GetAtt MyTestEc2Instance.PublicIp来获取EC2的公网IP地址。具体每个资源可以获取哪些属性值,可以查阅对应资源的文档,例如查看AWS::EC2::Instance有哪些属性值。

完整函数名称的语法:

Fn::GetAtt: [ logicalNameOfResource, attributeName ]

短格式的语法:

!GetAtt logicalNameOfResource.attributeName

例如输出EC2的公网IP地址,Fn::GetAtt 函数短格式写法为:

Outputs:
  MyTestEc2InstanceEip:
    Description: MyTestEc2InstanceEip
    Value: !GetAtt MyTestEc2Instance.PublicIp
    Export:
      Name: MyTestEc2InstanceEip

下面是对应的Fn::GetAtt 函数的完整写法。

Outputs:
  MyTestEc2InstanceEip:
    Description: MyTestEc2InstanceEip
    Value: 
      Fn::Getatt: [ MyTestEc2Instance, PublicIp ]
    Export:
      Name: MyTestEc2InstanceEip

Fn::Select 函数

Fn::Select函数通过索引,来获取列表中的某个对象。一般结合函数Fn::GetAZs使用。

完整函数名称的语法,index指定索引序号,listOfObjects表示对象的列表。

Fn::Select: [ index, listOfObjects ] 

短格式的语法:

!Select [ index, listOfObjects ]

为了更好理解这个函数的用法,这里通过一个伪代码来进行解释。例如变量Ec2TypeList是一个列表,想要设置EC2实例类型为t2.micro,通过Select函数,选择列表的第一个索引,即0号索引即可。

Ec2TypeList = [ t2.micro, t2.small, t2.large ]

  MyTestEc2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Select [ 0, Ec2TypeList ]

Fn::GetAZs 函数

Fn::GetAZs函数返回一个数组,该数组按字母顺序列出指定区域的可用区。

前面模板创建子网时,在模板里面硬编码了可用区信息AvailabilityZone: cn-northwest-1a,那么这个代码在宁夏以外的其他区域使用就会报错,因为其他区域没有cn-northwest-1a这个可用区。

下面案例中,AWS::Region伪参数[参考链接3]。伪参数是 AWS CloudFormation 内建的变量,调用AWS::Region会返回代码运行的区域值,即cn-northwest-1

进一步通过Fn::GetAZs函数来指定获取可用区信息,因为返回的结果是一个列表,所以可以用Select函数来选择单个对象,例如这里选择返回结果中的第一个可用区。

AvailabilityZone: !Select 
  - 0
  - Fn::GetAZs: !Ref 'AWS::Region'

这样前面子网的可用区信息就不用硬编码了,换成更加灵活的方式指定可用区,这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值