全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网
资源编排

函数(Functions)

更新时间:2017-09-15 17:03:34

内部函数

编排服务提供多个内置函数帮助您管理您的堆栈。可以在资源和输出中使用内部函数。

Fn::Base64

内部函数 Fn::Base64 返回输入字符串的 Base64 编码结果。

声明

  1. "Fn::Base64" : stringToEncode

参数

stringToEncode

  1. 想转换成 Base64 的字符串。

返回值

用 Base64 表示方法的原始字符串。

示例

  1. "Fn::Base64" : "string to encode"

Fn::FindInMap

内部函数 Fn::FindInMap 返回与 Mappings 部分声明的双层映射中的键对应的值。

声明

  1. "Fn::FindInMap" : [ "MapName", "TopLevelKey", "SecondLevelKey"]

参数

MapName

  1. Mappings 部分中所声明映射的 ID,包含键和值。

TopLevelKey

  1. 第一级键,其值是一个键/值对列表。

SecondLevelKey

  1. 第二级键,其值是一个字符串或者数字。

返回值

分配给 SecondLevelKey 的值。

示例

下面的示例显示了如何使用 Fn::FindInMap:

  1. {
  2. "ROSTemplateFormatVersion": "2015-09-01",
  3. "Parameters": {
  4. "regionParam": {
  5. "Description": "选择创建 ECS 的区域",
  6. "Type": "String",
  7. "AllowedValues": ["hangzhou", "beijing"]
  8. }
  9. },
  10. "Mappings" : {
  11. "RegionMap" : {
  12. "hangzhou" : { "32" : "m-25l0rcfjo", "64" : "m-25l0rcfj1" },
  13. "beijing" : { "32" : "m-25l0rcfj2", "64" : "m-25l0rcfj3" }
  14. }
  15. },
  16. "Resources": {
  17. "WebServer": {
  18. "Type": "ALIYUN::ECS::Instance",
  19. "Properties": {
  20. "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "regionParam" }, "32"]},
  21. "InstanceType": "ecs.t1.small",
  22. "SecurityGroupId": "sg-25zwc3se0",
  23. "ZoneId": "cn-beijing-b",
  24. "Tags": [{
  25. "Key": "key1",
  26. "Value": "value1"
  27. },{
  28. "Key": "key2",
  29. "Value": "value2"
  30. }
  31. ]
  32. }
  33. }
  34. }
  35. }

在上面的示例中,在创建名为 WebServer 的资源时,需要指定 ImageId 属性。在 Mappings 部分描述了根据区域区分的 ImageId 映射。在 Parameters 部分描述了需要用户指定的区域。Fn::FindInMap 会根据用户指定的区域在 RegionMap 中查找对应的 ImageId 映射,然后在映射中找到 32 对应的 ImageId。

  • MapName 可按照个人意愿设置,在本例中为 “RegionMap”。

  • TopLevelKey 设置为创建堆栈的地区,通过使用 { “Ref” : “regionParam” } 由用户确定。

  • SecondLevelKey 设置为所需的架构,在本例中为 “32”。

支持的函数

您可以在 Fn::FindInMap 函数中使用以下函数:

  • Fn::FindInMap

  • Ref

Fn::GetAtt

内部函数 Fn::GetAtt 返回模板中的资源的属性值。

声明

  1. "Fn::GetAtt": [ "resourceID", "attributeName" ]

参数

resourceID

  1. 目标资源的 ID

attributeName

  1. 目标资源的属性名称。

返回值

属性值。

示例

此示例返回 Resource ID 为 MyEcsInstance 的 ImageId 属性。

  1. "Fn::GetAtt" : [ "MyEcsInstance" , "ImageID" ]

Fn::Join

内部函数 Fn::Join 将一组值连接起来,用特定分隔符隔开。

声明

  1. { "Fn::Join" : [ "delimiter", [ "string1", "string2", ... ]] }

参数

delimiter

  1. 分隔符。分隔符可以为空,这样就将所有的值直接连接起来。

[ “string1”, “string2”, … ]

  1. 被连接起来的值列表。

返回值

被连接起来的字符串。

示例

“Fn::Join” : [ “,”, [ “a”, “b”, “c” ] ]

返回:”a,b,c”。

支持的函数

  • Fn::Base64

  • Fn::GetAtt

  • Fn::Join

  • Fn::Select

  • Ref

Fn::Select

内部函数 Fn::Select 通过索引返回数据元列表中的单个数据元。

声明

数据元列表可以是一个数组:

  1. "Fn::Select" : [ "index", [ "value1", "value2", ... ] ]

数据元列表也可以是一个映射表:

  1. "Fn::Select" : [ "index", { "key1": "value1", ... } ]

参数

index

  1. 待检索数据元的索引。如果数据元列表是一个数组,则索引是 0 N-1 之间的某个值,其中 N 代表阵列中元素的数量。如果数据元列表是一个映射表,则索引是映射表中的某个键。
  2. 如果根据找不到索引对应的值,则返回空字符串。

返回值

选定的数据元。

示例

如果数据元列表是一个数组:

  1. { "Fn::Select" : [ "1", [ "apples", "grapes", "oranges", "mangoes" ] ] }

此示例返回:”grapes”。

如果数据元列表是一个映射表:

  1. { "Fn::Select" : [ "key1", { "key1": "grapes", "key2": "mangoes" } ] }

此示例返回:”grapes”。

如果数据元列表是一个 CommaDelimitedList:

  1. "Parameters" : {
  2. "userParam": {
  3. "Type": "CommaDelimitedList",
  4. "Default": "10.0.100.0/24, 10.0.101.0/24, 10.0.102.0/24"
  5. }
  6. }
  7. "Resources": {
  8. "resourceID": {
  9. "Properties": {
  10. "CidrBlock": { "Fn::Select" : [ "0", {"Ref": "userParam"} ] }
  11. }
  12. }
  13. },

支持的函数

对于 Fn::Select 索引值,您可以使用 Ref 函数。

对于对象的 Fn::Select 列表,您可以使用以下函数:

  • Fn::Base64

  • Fn::FindInMap

  • Fn::GetAtt

  • Fn::Join

  • Fn::Select

  • Ref

Ref

内部函数 Ref 返回指定参数或资源的值。

  • 如果指定参数是 Resource ID,则返回资源的值。

  • 否则认为指定参数是参数,将尝试返回参数的值。

声明

  1. "Ref" : "logicalName"

参数

logicalName

  1. 您想引用的资源或参数之逻辑名称。

返回值

资源的值或者参数的值。

示例

使用 Ref 函数指定 regionParam 作为 WebServer 的 RegionMap 的区域参数:

  1. {
  2. "ROSTemplateFormatVersion": "2015-09-01",
  3. "Parameters": {
  4. "regionParam": {
  5. "Description": "选择创建 ECS 的区域",
  6. "Type": "String",
  7. "AllowedValues": ["hangzhou", "beijing"]
  8. }
  9. },
  10. "Mappings" : {
  11. "RegionMap" : {
  12. "hangzhou" : { "32" : "m-25l0rcfjo", "64" : "m-25l0rcfj1" },
  13. "beijing" : { "32" : "m-25l0rcfj2", "64" : "m-25l0rcfj3" }
  14. }
  15. },
  16. "Resources": {
  17. "WebServer": {
  18. "Type": "ALIYUN::ECS::Instance",
  19. "Properties": {
  20. "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "regionParam" }, "32"]},
  21. "InstanceType": "ecs.t1.small",
  22. "SecurityGroupId": "sg-25zwc3se0",
  23. "ZoneId": "cn-beijing-b",
  24. "Tags": [{
  25. "Key": "tiantt",
  26. "Value": "ros"
  27. },{
  28. "Key": "tiantt1",
  29. "Value": "ros1"
  30. }
  31. ]
  32. }
  33. }
  34. }
  35. }

支持的函数

不能在 Ref 函数中使用任何函数。必须指定作为资源逻辑 ID 的字符串。

Fn::GetAZs

内部函数 Fn::GetAZs 返回指定 Region 的可用区列表。

声明

  1. "Fn::GetAZs": "region"

参数

region

  1. region ID

返回值

指定 Region 下的可用区列表。

示例

此示例在指定的 Region 的第一个可用区内创建一个 ECS 实例。

  1. {
  2. "ROSTemplateFormatVersion" : "2015-09-01",
  3. "Resources" : {
  4. "WebServer": {
  5. "Type": "ALIYUN::ECS::Instance",
  6. "Properties": {
  7. "ImageId" : "centos7u2_64_40G_cloudinit_20160728.raw",
  8. "InstanceType": "ecs.n1.tiny",
  9. "SecurityGroupId": "sg-2zedcm7ep5quses05fs4",
  10. "Password": "Ros12345",
  11. "AllocatePublicIP": true,
  12. "InternetChargeType": "PayByTraffic",
  13. "InternetMaxBandwidthIn": 100,
  14. "InternetMaxBandwidthOut": 100,
  15. "SystemDiskCategory": "cloud_efficiency",
  16. "IoOptimized": "optimized",
  17. "ZoneId": {"Fn::Select": ["0", {"Fn::GetAZs": {"Ref": "ALIYUN::Region"}}]}
  18. }
  19. }
  20. },
  21. "Outputs": {
  22. "InstanceId": {
  23. "Value" : {"Fn::GetAtt": ["WebServer","InstanceId"]}
  24. },
  25. "PublicIp": {
  26. "Value" : {"Fn::GetAtt": ["WebServer","PublicIp"]}
  27. }
  28. }
  29. }

支持的函数

  • Fn::Base64

  • Fn::FindInMap

  • Fn::GetAtt

  • Fn::Join

  • Fn::Select

  • Ref

Fn::Replace

内部函数 Fn::Replace 将字符串中的指定子字符串用新字符串替换。

声明

  1. { "Fn::Replace" : [ {"object_key": "object_value"}, "object_string"]

参数

{“object_key”: “object_value”}

  1. object_key 将要被替换的字符串。
  2. object_value 将要替换成的最终字符串。

object_string

  1. 将把 object_string 字符串中的所有 object_key 子字符串替换成 object_value 字符串。

返回值

被替换后的字符串。

示例

UserData 所指定的脚本中的 print 将被替换成 echo。

  1. {
  2. "ROSTemplateFormatVersion" : "2015-09-01",
  3. "Resources" : {
  4. "WebServer": {
  5. "Type": "ALIYUN::ECS::Instance",
  6. "Properties": {
  7. "ImageId" : "centos_7_2_64_40G_base_20170222.vhd",
  8. "InstanceType": "ecs.n1.medium",
  9. "SecurityGroupId": "sg-94q49gota",
  10. "Password": "MytestPassword1234",
  11. "IoOptimized": "optimized",
  12. "VSwitchId": "vsw-94vdvonyi",
  13. "VpcId": "vpc-949uzr8c9",
  14. "SystemDiskCategory": "cloud_ssd",
  15. "UserData": {"Fn::Replace": [{"print": "echo"},
  16. {"Fn::Join": ["\\n", [
  17. "#!/bin/sh",
  18. "mkdir ~/test_ros",
  19. "print hello > ~/1.txt"
  20. ]]}]}
  21. }
  22. }
  23. },
  24. "Outputs": {
  25. "InstanceId": {
  26. "Value" : {"Fn::GetAtt": ["WebServer","InstanceId"]}
  27. },
  28. "PublicIp": {
  29. "Value" : {"Fn::GetAtt": ["WebServer","PublicIp"]}
  30. }
  31. }
  32. }

支持的函数

  • Fn::Base64

  • Fn::GetAtt

  • Fn::Join

  • Fn::Select

  • Ref

Fn::Split

内部函数 Fn::Split 通过指定分隔符对字符串进行切片,返回所有切片组成的列表。

声明

  1. "Fn::Split" : [ "delim", "original_string" ]

参数

delim

  1. 分隔符, 例如: ',', ';', '\n', '\t' 等等。

original_string

  1. 将要被切片的字符串

返回值

返回切片后所有字符串组成的列表。

示例

如果数据元列表是一个数组:

  1. {"Fn::Split": [";", "foo; bar; achoo"]}

此示例返回:[“foo”, “ bar”, “achoo “]。

下面模板中使用 Fn::Split 对 InstanceIds 进行切片 :

  1. "Parameters" : {
  2. "InstanceIds": {
  3. "Type": "String",
  4. "Default": "instane1_id,instance2_id,instance2_id"
  5. }
  6. },
  7. "Resources": {
  8. "resourceID": {
  9. "Type": "ALIYUN::SLB::BackendServerAttachment":
  10. "Properties": {
  11. "BackendServerList": { "Fn::Split" : [ ",", {"Ref": "InstanceIds"} ] }
  12. }
  13. }
  14. }

支持的函数

  • Fn::Base64

  • Fn::FindInMap

  • Fn::GetAtt

  • Fn::Join

  • Fn::Select

  • Fn::Replace

  • Fn::GetAZs

  • Fn::If

  • Ref

Fn::Equals

比较两个值是否相等。如果两个值相等,则返回 true;如果不等,则返回 false。

声明

  1. {"Fn::Equals": ["value_1", "value_2"]}

参数

value

  1. 要比较的任意类型的值。

返回值

true 或 false。

示例

在 Conditions 中使用 Fn::Equals 定义条件。

  1. {
  2. "ROSTemplateFormatVersion" : "2015-09-01",
  3. "Parameters":{
  4. "EnvType":{
  5. "Default":"pre",
  6. "Type":"String"
  7. }
  8. },
  9. "Conditions": {
  10. "TestEqualsCond": {"Fn::Equals": ["prod", {"Ref": "EnvType"}]}
  11. }
  12. }

支持的函数

  • Fn::Or

  • Fn::Not

  • Fn::Equals

  • Fn::FindInMap

  • Fn::And

  • Ref

Fn::And

如果所有指定条件计算为 true,则返回 true;如果任意条件计算为 false,则返回 false。这代表 AND 运算符。最少可以包含两个条件。

声明

  1. {"Fn::And": ["condition", {...}]}

参数

condition

  1. 计算为 true false 的条件。

返回值

true 或 false。

示例

在 Conditions 中使用 Fn::And 定义一个条件。

  1. {
  2. "ROSTemplateFormatVersion" : "2015-09-01",
  3. "Parameters":{
  4. "EnvType":{
  5. "Default":"pre",
  6. "Type":"String"
  7. }
  8. },
  9. "Conditions": {
  10. "TestEqualsCond": {"Fn::Equals": ["prod", {"Ref": "EnvType"}]},
  11. "TestAndCond": {"Fn::And": ["TestEqualsCond", {"Fn::Equals": ["pre", {"Ref": "EnvType"}]}]}
  12. }
  13. }

支持的函数

  • Fn::Or

  • Fn::Not

  • Fn::Equals

  • Fn::FindInMap

  • Fn::And

  • Ref

Fn::Or

如果任意一个指定条件计算为 true,则返回 true;如果所有条件都计算为 false,则返回 false。这代表 OR 运算符。最少可以包含两个条件。

声明

  1. {"Fn::Or": ["condition", {...}]}

参数

condition

  1. 计算为 true false 的条件。

返回值

true 或 false。

示例

在 Conditions 中使用 Fn::Or 定义一个条件。

  1. {
  2. "ROSTemplateFormatVersion" : "2015-09-01",
  3. "Parameters":{
  4. "EnvType":{
  5. "Default":"pre",
  6. "Type":"String"
  7. }
  8. },
  9. "Conditions": {
  10. "TestEqualsCond": {"Fn::Equals": ["prod", {"Ref": "EnvType"}]},
  11. "TestOrCond": {"Fn::And": ["TestEqualsCond", {"Fn::Equals": ["pre", {"Ref": "EnvType"}]}]}
  12. }
  13. }

支持的函数

  • Fn::Or

  • Fn::Not

  • Fn::Equals

  • Fn::FindInMap

  • Fn::And

  • Ref

Fn::Not

对计算为 false 的条件返回 true;对计算为 true 的条件返回 false;这代表 NOT 运算符。

声明

  1. {"Fn::Not": "condition"}

参数

condition

  1. 计算为 true false 的条件。

返回值

true 或 false。

示例

在 Conditions 中使用 Fn::Not 定义一个条件。

  1. {
  2. "ROSTemplateFormatVersion" : "2015-09-01",
  3. "Parameters":{
  4. "EnvType":{
  5. "Default":"pre",
  6. "Type":"String"
  7. }
  8. },
  9. "Conditions": {
  10. "TestNotCond": {"Fn::Not": {"Fn::Equals": ["pre", {"Ref": "EnvType"}]}}
  11. }
  12. }

支持的函数

  • Fn::Or

  • Fn::Not

  • Fn::Equals

  • Fn::FindInMap

  • Fn::And

  • Ref

Fn::If

如果指定的条件计算为 true,则返回一个值;如果指定的条件计算为 false,则返回另一个值。在模板 Resources 和 Outputs 属性值中支持 Fn::If 内部函数。您可以使用 ALIYUN::NoValue 伪参数作为返回值来删除相应的属性。

声明

  1. {"Fn::If": ["condition_name", "value_if_true", "value_if_false"]}

参数

condition_name

  1. Conditions 中条件对应的条件名称。通过条件名称引用条件。

value_if_true

  1. 当指定的条件计算为 true 时,返回此值。

value_if_false

  1. 当指定的条件计算为 false 时,返回此值。

示例

根据输入的参数,确定是否创建数据盘。

  1. {
  2. "ROSTemplateFormatVersion":"2015-09-01",
  3. "Parameters":{
  4. "EnvType":{
  5. "Default":"pre",
  6. "Type":"String"
  7. }
  8. },
  9. "Conditions":{
  10. "CreateDisk":{
  11. "Fn::Equals":[
  12. "prod",
  13. {
  14. "Ref":"EnvType"
  15. }
  16. ]
  17. }
  18. },
  19. "Resources":{
  20. "WebServer":{
  21. "Type":"ALIYUN::ECS::Instance",
  22. "Properties":{
  23. "DiskMappings":{
  24. "Fn::If":[
  25. "CreateDisk",
  26. [
  27. {
  28. "Category":"cloud_efficiency",
  29. "DiskName":"FirstDataDiskName",
  30. "Size":40
  31. },
  32. {
  33. "Category":"cloud_ssd",
  34. "DiskName":"SecondDataDiskName",
  35. "Size":40
  36. }
  37. ],
  38. {
  39. "Ref":"ALIYUN::NoValue"
  40. }
  41. ]
  42. },
  43. "VpcId":"vpc-2zew9pxh2yirtzqxdboi1",
  44. "SystemDiskCategory":"cloud_efficiency",
  45. "SecurityGroupId":"sg-2zece6wcqriejf1v91sr",
  46. "SystemDiskSize":40,
  47. "ImageId":"centos_6_8_64_40G_base_20170222.vhd",
  48. "IoOptimized":"optimized",
  49. "VSwitchId":"vsw-2zed9txvy7h2srqo6jmgq",
  50. "InstanceType":"ecs.n1.medium"
  51. }
  52. }
  53. },
  54. "Outputs":{
  55. "InstanceId":{
  56. "Value":{
  57. "Fn::GetAtt":[
  58. "WebServer",
  59. "InstanceId"
  60. ]
  61. }
  62. },
  63. "ZoneId":{
  64. "Value":{
  65. "Fn::GetAtt":[
  66. "WebServer",
  67. "ZoneId"
  68. ]
  69. }
  70. }
  71. }
  72. }

支持的函数

  • Fn::Or

  • Fn::Not

  • Fn::Equals

  • Fn::FindInMap

  • Fn::And

  • Ref

Fn::ListMerge

合并多个列表为一个列表。

声明

  1. {"Fn::ListMerge": [["list_1_item_1", "list_1_imte_2", ...], ["list_2_item_1", "list_2_imte_2", ...]]}

参数

[“list_1_item_1”, “list_1_imte_2”, …]

  1. 将要合并的第一个列表

[“list_2_item_1”, “list_2_imte_2”, …]

  1. 将要和第一个列表合并的列表

示例

把两个 ECS 组挂载到同一个负载均衡实例。

  1. {
  2. "ROSTemplateFormatVersion" : "2015-09-01",
  3. "Resources" : {
  4. "LoadBalancer": {
  5. "Type": "ALIYUN::SLB::LoadBalancer",
  6. "Properties": {
  7. "LoadBalancerName": "ros",
  8. "AddressType": "internet",
  9. "InternetChargeType": "paybybandwidth",
  10. }
  11. },
  12. "BackendServer1": {
  13. "Type": "ALIYUN::ECS::InstanceGroup",
  14. "Properties": {
  15. "ImageId" : "m-2ze9uqi7wo61hwep5q52",
  16. "InstanceType": "ecs.t1.small",
  17. "SecurityGroupId": "sg-2ze8yxgempcdsq3iucsi",
  18. "MaxAmount": 1,
  19. "MinAmount": 1
  20. }
  21. },
  22. "BackendServer2": {
  23. "Type": "ALIYUN::ECS::InstanceGroup",
  24. "Properties": {
  25. "ImageId" : "m-2ze9uqi7wo61hwep5q52",
  26. "InstanceType": "ecs.t1.small",
  27. "SecurityGroupId": "sg-2ze8yxgempcdsq3iucsi",
  28. "MaxAmount": 1,
  29. "MinAmount": 1
  30. }
  31. },
  32. "Attachment": {
  33. "Type": "ALIYUN::SLB::BackendServerAttachment",
  34. "Properties": {
  35. "LoadBalancerId": {"Ref": "LoadBalancer"},
  36. "BackendServerList": { "Fn::ListMerge": [
  37. {"Fn::GetAtt": ["BackendServer1", "InstanceIds"]},
  38. {"Fn::GetAtt": ["BackendServer2", "InstanceIds"]}
  39. ]
  40. }
  41. }
  42. }
  43. }
  44. }

支持的函数

  • Fn::Base64

  • Fn::GetAtt

  • Fn::Join

  • Fn::Select

  • Ref

  • Fn::Join

  • Fn::If

Fn::GetJsonValue

解析 JSON 字符串,获取指定的 Key 在第一层所对应的值。

声明

  1. {"Fn::GetJsonValue": ["key", "json_string"]}

参数

key

  1. 键值

json_string

  1. 指定的需要解析的 JSON 字符串

示例

WebServer2 从 WebServer 实例执行完 UserData 返回的 JSON 字符串中,获取对应的值。

  1. {
  2. "ROSTemplateFormatVersion" : "2015-09-01",
  3. "Resources" : {
  4. "WebServer": {
  5. "Type": "ALIYUN::ECS::Instance",
  6. "Properties": {
  7. "ImageId" : "m-2ze45uwova5fedlufpz7",
  8. "InstanceType": "ecs.n1.medium",
  9. "SecurityGroupId": "sg-2ze7pxymaix640qrg3vu",
  10. "Password": "Wenqiao1234",
  11. "IoOptimized": "optimized",
  12. "VSwitchId": "vsw-2zei67xd9nhcqxzec7qt7",
  13. "VpcId": "vpc-2zevx9ios1rszqv0azijb",
  14. "SystemDiskCategory": "cloud_ssd",
  15. "UserData": {"Fn::Join": ["", [
  16. "#!/bin/sh\n",
  17. "mkdir ~/test_ros\n",
  18. "print hello > ~/1.txt\n",
  19. "Fn::GetAtt": ["WaitConHandle", "CurlCli"],
  20. "\n",
  21. "Fn::GetAtt": ["WaitConHandle", "CurlCli"],
  22. " -d '{\\"id\\" : \\"1\\", \\"data\\": [\\"1111\\", \\"2222\\"]}'\n"
  23. ]]},
  24. "PrivateIpAddress": "192.168.2.110",
  25. "HostName": "userdata-1"
  26. }
  27. },
  28. "WaitConHandle": {
  29. "Type": "ALIYUN::ROS::WaitConditionHandle"
  30. },
  31. "WaitCondition": {
  32. "Type": "ALIYUN::ROS::WaitCondition",
  33. "Properties": {
  34. "Handle": {"Ref": "WaitConHandle"},
  35. "Timeout": 900
  36. }
  37. },
  38. "WebServer2": {
  39. "Type": "ALIYUN::ECS::Instance",
  40. "Properties": {
  41. "ImageId" : "m-2ze45uwova5fedlufpz7",
  42. "InstanceType": "ecs.n1.medium",
  43. "SecurityGroupId": "sg-2ze7pxymaix640qrg3vu",
  44. "Password": "Wenqiao1234",
  45. "IoOptimized": "optimized",
  46. "VSwitchId": "vsw-2zei67xd9nhcqxzec7qt7",
  47. "VpcId": "vpc-2zevx9ios1rszqv0azijb",
  48. "SystemDiskCategory": "cloud_ssd",
  49. "UserData":
  50. {"Fn::Join": ["", [
  51. "#!/bin/sh\n",
  52. "mkdir ~/test_ros\n",
  53. "echo hello > ~/1.txt\n",
  54. "server_1_token=",
  55. {"Fn::GetJsonValue": ["1", { "Fn::GetAtt": ["WaitCondition", "Data"]}]},
  56. "\n"
  57. ]]},
  58. "PrivateIpAddress": "192.168.2.111",
  59. "HostName": "userdata-2"
  60. }
  61. },
  62. },
  63. "Outputs": {
  64. "InstanceId": {
  65. "Value" : {"Fn::GetAtt": ["WebServer","InstanceId"]}
  66. },
  67. "PublicIp": {
  68. "Value" : {"Fn::GetAtt": ["WebServer","PublicIp"]}
  69. }
  70. }
  71. }

支持的函数

  • Fn::Base64

  • Fn::GetAtt

  • Fn::Join

  • Fn::Select

  • Ref

  • Fn::Join

  • Fn::If

Fn::MergeMapToList

将多个 Mapping 合并成一个以 Mapping 为元素的列表。

声明

  1. {"Fn::MergeMapToList": [{"key_1": ["key_1_item_1", "key_1_item_2", ...]}, {"key_2":["key_2_item_1", "key_2_item_2", ...]}, ... ]}

参数

{“key_1”: [“key_1_item_1”, “key_1_item_2”, …]}

  1. 将要合并的第一个 Mapping"key_1" 所对应的值必须是一个列表。"key_1" 将是合并后的列表元素中每个 Mapping 的一个键,它对应的值在第一个 Mapping 中将是 "key_1_item_1",在第二个 Mapping 中是 "key_1_item_2" 第三第四 ... 以此类推。最终合并的列表长度是,所有将要合并的参数 Mapping 中,"key_x" 所对应的列表中最长的长度。如果有的 "key_y" 所对应的列表长度比较短,那么就会重复此列表的最后一个元素,使列表长度都达到最长。

{“key_2”: [“key_2_item_1”, “key_2_item_2”, …]}

  1. 将要合并的第二个 Mapping"key_2" 所对应的值必须是一个列表。"key_2" 将是合并后的列表元素中每个 Mapping 的一个键,它对应的值在第一个 Mapping 中将是 "key_2_item_1",在第二个 Mapping 中是 "key_2_item_2" 第三第四 ... 以此类推。

示例

合并三个 Mapping, 每个 Mapping 中键值对应的列表长度一致:

  1. {
  2. "Fn::MeregMapToList": [
  3. {"key_1": ["kye_1_item_1", "kye_1_item_2"]},
  4. {"key_2": ["kye_2_item_1", "kye_2_item_2"]},
  5. {"key_3": ["kye_3_item_1", "kye_3_item_2"]}
  6. ]
  7. }

最终的合并结果是:

  1. [
  2. {
  3. "key_1": "kye_1_item_1",
  4. "key_2": "kye_2_item_1",
  5. "key_3": "kye_3_item_1"
  6. },
  7. {
  8. "key_1": "kye_1_item_2",
  9. "key_2": "kye_2_item_2",
  10. "key_3": "kye_3_item_2"
  11. }
  12. ]

合并三个 Mapping,每个 Mapping 中键值对应的列表长度不一致:

  1. {
  2. "Fn::MeregMapToList": [
  3. {"key_1": ["kye_1_item_1", "kye_1_item_2"]},
  4. {"key_2": ["kye_2_item_1", "kye_2_item_2", "key_2_item_3"]},
  5. {"key_3": ["kye_3_item_1", "kye_3_item_2"]}
  6. ]
  7. }

最终的合并结果是:

  1. [
  2. {
  3. "key_1": "kye_1_item_1",
  4. "key_2": "kye_2_item_1",
  5. "key_3": "kye_3_item_1"
  6. },
  7. {
  8. "key_1": "kye_1_item_2",
  9. "key_2": "kye_2_item_2",
  10. "key_3": "kye_3_item_2"
  11. },
  12. {
  13. "key_1": "kye_1_item_2",
  14. "key_2": "kye_2_item_3",
  15. "key_3": "kye_3_item_2"
  16. }
  17. ]

下面的模板把 WebServer 中创建的所有实例,都加入到一个负载均衡的虚拟服务器组中。

  1. {
  2. "ROSTemplateFormatVersion": "2015-09-01",
  3. "Resources": {
  4. "WebServer": {
  5. "Type": "ALIYUN::ECS::InstanceGroupClone",
  6. "Properties": {
  7. "SourceInstanceId": "i-xxxxx",
  8. "Password": "Hello1234",
  9. "MinAmount": 1,
  10. "MaxAmount": 1
  11. }
  12. },
  13. "CreateVServerGroup": {
  14. "Type": "ALIYUN::SLB::VServerGroup",
  15. "Properties": {
  16. "LoadBalancerId": "lb-yyyy",
  17. "VServerGroupName": "VServerGroup-test",
  18. "BackendServers": {
  19. "Fn::MergeMapToList": [
  20. {"Port": [6666, 9090, 8080]},
  21. {"ServerId": {"Fn::GetAtt": ["WebServer", "InstanceIds"]}},
  22. {"Weight": [20, 100]}
  23. ]
  24. }
  25. }
  26. }
  27. }
  28. }

支持的函数

  • Fn::Base64

  • Fn::GetAtt

  • Fn::Join

  • Fn::Select

  • Ref

  • Fn::Join

  • Fn::If

  • Fn::ListMerge

  • Fn::GetJsonValue

本文导读目录