AWS Cloudformation Template 学习(2)

前面简单的过了一遍模板的9大模块,这一节学习一下他的内置函数(Intrinsic function)。

官方文档链接 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

Fn::Base64

这个是返回一个字符串的base64格式,一般的使用场景是创建EC2 实例的时候配置 UserData使用的。注意Yaml格式2可以简写 Fn:: 为!,不要和其他语言里面的NOT操作符搞混了

JSON格式
{ "Fn::Base64" : valueToEncode }

YAML格式
*Fn::Base64: valueToEncode

YAML格式2
!Base64 valueToEncode

Fn::Cidr

这个是返回一个IP地址块

JSON格式
{ "Fn::Cidr" : [ipBlock, count, cidrBits]}

YAML格式
Fn::Cidr:

  • ipBlock
  • count
  • cidrBits

YAML格式2
!Cidr [ ipBlock, count, cidrBits ]

例子, 创建了一个192.168.0.0/24的地址快,然后在里面创建了6个子网掩码 为/27的CIDR块


{ "Fn::Cidr" : [ "192.168.0.0/24", "6", "5"] }

Fn::FindInMap

在一个两层的map里面返回对应的value,之前看过例子通过region来查找AMI ID

JSON格式
{ "Fn::FindInMap" : [ "MapName", "TopLevelKey", "SecondLevelKey"] }

YAML格式
Fn::FindInMap: [ MapName, TopLevelKey, SecondLevelKey ]

YAML格式2
!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]

Fn::GetAtt

这个是通过指定resource来返回他对应的属性值

JSON格式
{ "Fn::GetAtt" : [ "logicalNameOfResource", "attributeName" ] }

FN::GetAZs

这个指定一个region,返回他的所有的AZ的列表

JSON格式
{ "Fn::GetAZs" : "region" }

另外,当用户获取他所在的Region的时候, 这个Region的信息本身就是一个全局变量,不需要用户去指定,所以我们可以通过下面两张方式都可以获取当前用户所在的region的AZ

{ "Fn::GetAZs" : "" }
{ "Fn::GetAZs" : { "Ref" : "AWS::Region" } }

再比如这个片段, 通过Fn::GetAZs获取整个AZ的列表了,再通过Fn::select来获取第一个索引的元素


"mySubnet" : {
  "Type" : "AWS::EC2::Subnet",
  "Properties" : {
    "VpcId" : {
      "Ref" : "VPC"
    },
    "CidrBlock" : "10.0.0.0/24",
    "AvailabilityZone" : {
      "Fn::Select" : [
        "0",
        {
          "Fn::GetAZs" : ""
        }
      ]
    }
  }
}

Fn::ImportValue

这个可以从其他stack的output结果里面导入

JSON语法
{ "Fn::ImportValue" : sharedValueToImport }

Fn::Join
这个类似字符串的拼接,通过自定义的分隔符进行连接,如果分隔符是空的字符串,那么这些字符就直接连接

JSON语法
{ "Fn::Join" : [ "delimiter", [ comma-delimited list of values ] ] }

例如,我想拼接出一个arn来

{
  "Fn::Join": [
    "", [
      "arn:",
      {
        "Ref": "Partition"
      },
      ":s3:::elasticbeanstalk-*-",
      {
        "Ref": "AWS::AccountId"
      }
    ]
  ]
}

Fn::Select

这个函数可以通过指定索引,返回一个列表里面的元素对象

JSON格式
{ "Fn::Select" : [ index, listOfObjects ] }

YAML格式
Fn::Select: [ index, listOfObjects ]
!Select [ index, listOfObjects ]

例子:

"Parameters" : {
  "DbSubnetIpBlocks": {
    "Description": "Comma-delimited list of three CIDR blocks",
    "Type": "CommaDelimitedList",
      "Default": "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
  }
}

"Subnet0": {
  "Type": "AWS::EC2::Subnet",
    "Properties": {
      "VpcId": { "Ref": "VPC" },
      "CidrBlock": { "Fn::Select" : [ "0", {"Ref": "DbSubnetIpBlocks"} ] }
    }
}

Fn::Split

这个和join相反,是通过分隔符来分割字符串的

JSON语法
{ "Fn::Split" : [ "delimiter", "source string" ] }

YAML语法
Fn::Split: [ delimiter, source string ]
!Split [ delimiter, source string ]

例子,分割一条导入的子网记录,然后选择其中的第三个元素


{ "Fn::Select" : [ "2", { "Fn::Split": [",", {"Fn::ImportValue": "AccountSubnetIDs"}]}] }

Fn::Sub

替换字符串。他的一个常见的使用场景是在运行的时候,把实际的值传给我们自定义的变量

{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }

如果仅仅是替换Paramter,Resource的名字,或者Resource的某个属性名称,直接用字符串替换就是了
{ "Fn::Sub" : String }

下面看几个例子

${domain}是一个我自定义的变量,然后通过Ref获取真实的域名进行替换

{ "Fn::Sub": [ "www.${Domain}", { "Domain": {"Ref" : "RootDomainName" }} ]}

另外一个例子,通过全局变量和vpc的名字进行替换


{ "Fn::Sub": "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}" }

第三个例子,在userdata里面使用,通过替换来配置对应的bash命令,然后通过join拼成一个合法的bash文件,再转换成对应的base64格式

"UserData": { "Fn::Base64": { "Fn::Join": ["\n", [
  "#!/bin/bash -xe",
  "yum update -y aws-cfn-bootstrap",
  { "Fn::Sub": "/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}" },
  { "Fn::Sub": "/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}" }]]
}}

Fn::Transform

调用宏,这个后面会有详细例子

Fn::Ref

这个命令返回Parameter或者resoruce的值

JSON语法
{ "Ref" : "logicalName" }

YAML语法

Ref: logicalName
!Ref logicalName

例如:

"MyEIP" : {
   "Type" : "AWS::EC2::EIP",
   "Properties" : {
      "InstanceId" : { "Ref" : "MyEC2Instance" }
   }
}

原文地址:https://blog.51cto.com/beanxyz/2485693

时间: 2024-11-04 05:20:18

AWS Cloudformation Template 学习(2)的相关文章

AWS Cloudformation - Template 学习(1)

Cloudformation里面,整个架构都是在template里面定义的,然后通过这个template生成对应的Stack AWS官方提供了一个参考手册,https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html 非常的详细和有用,初看有些枯燥,但是细细品味很有意思,下面是豆子的学习笔记. 在template里面,他一共有9个section可以定义,但是只有resour

AWS CloudFormation入门实践

AWS cloudformation通过模板对AWS云资源进行编排和调用.并且可以通过模板代码层面的修改就可以对现有环境进行升级改造,云端业务的灵活便捷特点展现无疑.下面我们通过一个入门级的简单动手案例给大家展示cloudformation是如何使用的.希望大家也动手亲自实践体验. 创建cloudformation模板上图:进入webconsole控制台的cloudformation界面,点选create new stack.(新用户有1年的AWS free tier可以用来体验各种服务) 上图

AWS Cloudformation - Designer 的使用

今天豆子尝试着使用Cloudformation Designer来创建一个Template 文件.Designer对于初学者还是很有帮助的,一方面可以通过可视界面拖动Resource,另外可以按住Ctrl+Space 来提示对应的Property里面可以配置哪些东西.还可以直接拖动线条来实现依赖关系.当然最重要的一点是可以帮忙进行语法检测. 下面是一个小例子. 平常豆子需要经常创建S3的bucket进行备份,对于每个Bucket需要配置lifecycle rule,创建对应的user polic

AWS Cloudformation的相关概念

Cloudformation的相关概念AWS cloudformation是一项典型的基础架构即代码服务.通过编写模板对亚马逊云服务的资源进行调用和编排.借助cloudformation可以极大帮助DevOps提升工作效率,减少重复劳动,配置和部署相关服务的时间,并把更多的精力花在应用程序领域. 引用AWS官网https://docs.aws.amazon.com对cloudformation服务的优势总结: 简化基础设施管理 快速复制基础设施 轻松控制和跟踪基础设施层的变更 部署业务:传统环境

jQuery .tmpl(), .template()学习资料小结

昨晚无意中发现一个有趣的jQuery插件.tmpl(),其文档在这里.官方解释对该插件的说明:将匹配的第一个元素作为模板,render指定的数据,签名如下: .tmpl([data,][options]) 其中参数data的用途很明显:用于render的数据,可以是任意js类型,包括数组和对象.options一般情况下都是选项了,官方指出,此处的options是一个用户自定义的键值对的map,继承自tmplItem数据结构,适用于模板render动作期间. 在这里可以下载到最新的tmpl插件,值

C++ template学习一(函数模板和模板函数)

函数模板和模板函数(1)函数模板函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:template<typename(或class) T><返回类型><函数名>(参数表){ 函数体}其中,template是定义模板函数的关键字:template后面的尖括号不能省略:typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符

C++ template学习二 类模板定义及实例化

一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员.默写成员函数的参数.某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的). 如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的.实际的类,而是代表着一类类. //templatedemo.h#ifndef TEMPLATE_DEMO_HXX#define TEMPLATE_DEMO_HXX template

Elasticsearch template学习

https://www.cnblogs.com/forsaken627/articles/6512379.html Elasticsearch template Elasticsearch存在一个关键问题就是索引的设置及字段的属性指定,最常见的问题就是,某个字段我们并不希望ES对其进行分词,但如果使用自动模板创建索引,那么默认是所有string类型的字段都会被分词的,因此必须要显式指定字段的not_analyzed属性,其它的比如控制索引的备份数,分片数等,也可以通过模板的套用来实现,并且模板可

Road Crossing Game Template 学习

using UnityEngine; using System; namespace RoadCrossing.Types { /// <summary> /// 小路 /// </summary> [Serializable] public class Lane { /// <summary> /// 小路相关的游戏物体 /// </summary> public Transform laneObject; /// <summary> ///