本模版示例支持爲單/多個(最多3個)SLB添加所有創建的ECS做多個後端服務器
簡述:
模版中的ECS實例支持指定不同的實例名和主機名,並且可以選擇網絡類型爲VPC或CLASSIC,當選擇不創建VPC時,需要更換ECS實例規格類型,原因是能創建ECS的實例規格,與VPC網絡類型的實例規格不一樣;默認是新創建一個SLB實例,如果傳入SLB實例的ID,那麼需要更改下SLB的數量,原因是根據模版中SLB的數量值和SLB的ID來確認添加後端服務器的SLB實例數量,需要兩者保持一致(e.g. 用兩個已經創建的SLB的ID來做參數,那麼SLB數量值胥更改爲2)。
本模版目前最多支持往3個SLB實例附加後端服務器;
涉及資源:
ALIYUN::ECS::VPC (虛擬專有網絡)
ALIYUN::ECS::VSwitch (虛擬交換機)
ALIYUN::ECS::SecurityGroup (安全組)
ALIYUN::ECS::InstanceGroup (雲服務器組)
ALIYUN::SLB::LoadBalancer (負載均衡)
ALIYUN::SLB::BackendServerAttachment (爲負載均衡添加後端服務器)
1.創建ECS InstanceGroup
下面是創建VPC類型的ECS Instance代碼示例,實例中批量創建ECS指定不同的實例名和主機名。
e.g.
HostName[1,4]Test
HostName: 是ECS InstanceGroup主機命名規則的前綴;
[1,4]: 1爲起始數字,4爲數字的位數;
Test: 爲命名規則的尾綴;
結果創建的ECS的主機名分別爲:HostName0001, HostName002, HostName0003, .....
{
"Type": "ALIYUN::ECS::InstanceGroup",
"Condition": "IsCreateVpc",
"Properties": {
"IoOptimized": "optimized",
"ImageId": {
"Ref": "EcsGroupImageId"
},
"SecurityGroupId": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"SG",
"SecurityGroupId"
]
},
{
"Ref": "ALIYUN::NoValue"
}
]
},
"Password": {
"Ref": "EcsPassword"
},
"MinAmount": {
"Ref": "MaxAmount"
},
"SystemDiskCategory": {
"Ref": "EcsSystemDiskCategory"
},
"MaxAmount": {
"Ref": "MaxAmount"
},
"VSwitchId": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"VSwitch",
"VSwitchId"
]
},
{
"Ref": "ALIYUN::NoValue"
}
]
},
"VpcId": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"Vpc",
"VpcId"
]
},
{
"Ref": "ALIYUN::NoValue"
}
]
},
"InstanceType": {
"Ref": "EcsGroupInstanceType"
},
"InstanceName": {
"Fn::Join": [
"",
[
{
"Ref": "InstanceNamePrefix"
},
"[",
{
"Ref": "InstanceNameBeginNumber"
},
",4]",
{
"Ref": "InstanceNameSuffix"
}
]
]
},
"HostName": {
"Fn::Join": [
"",
[
"HostNameTest",
"[1,4]",
{
"Ref": "InstanceNameSuffix"
}
]
]
},
"AllocatePublicIP": {
"Fn::If": [
"IsCreateVpc",
false,
true
]
},
"UserData": {
"Fn::Join": [
"",
[
"#!/bin/sh\n",
"echo \"hello , create ecs group test\" > /tmp/create_test.log\n"
]
]
}
}
}
2.爲SLB實例添加後端服務器
下面示例代碼創建的附加後端服務器功能,用到的一些ROS的函數功能,以及自己定義的一些邏輯判斷,具體可根據方案模版查閱;
因爲考慮到要爲多個SLB實例添加後端服務器的情況,本方案用了Conditions及函數的功能配合完成了是爲單/多個SLB添加後端服務器。
{
"Type": "ALIYUN::SLB::BackendServerAttachment",
"Condition": "IsAttachment1",
"Properties": {
"LoadBalancerId": {
"Fn::If": [
"IsCreateSlb",
{
"Fn::GetAtt": [
"LoadBalancer",
"LoadBalancerId"
]
},
{
"Fn::Select": [
"0",
{
"Fn::Split": [
",",
{
"Ref": "LoadBalancerIds"
}
]
}
]
}
]
},
"BackendServerList": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"EcsInstanceGroupWithVpc",
"InstanceIds"
]
},
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"InstanceIds"
]
}
]
},
"BackendServerWeightList": {
"Fn::Split": [
",",
{
"Ref": "BackendServerWeightList"
}
]
}
}
}
3. 條件Code示例
請結合模版中的Paramters。
{
"IsAttachment1": {
"Fn::And": [
{
"Fn::Equals": [
1,
{
"Ref": "SlbCount"
}
]
},
{
"Fn::Or": [
"IsCreateSlb",
{
"Fn::Not": "IsCreateSlb"
}
]
}
]
},
"IsAttachment2": {
"Fn::And": [
{
"Fn::Equals": [
2,
{
"Ref": "SlbCount"
}
]
},
{
"Fn::Not": "IsCreateSlb"
}
]
},
"IsAttachment3": {
"Fn::And": [
{
"Fn::Equals": [
3,
{
"Ref": "SlbCount"
}
]
},
{
"Fn::Not": "IsCreateSlb"
}
]
},
"IsCreateSlb": {
"Fn::Equals": [
"None",
{
"Ref": "LoadBalancerIds"
}
]
},
"IsCreateVpc": {
"Fn::Equals": [
"Yes",
{
"Ref": "IsCreateVpc"
}
]
},
"NotUseVpc": {
"Fn::Equals": [
"No",
{
"Ref": "IsCreateVpc"
}
]
}
}
方案模版如下:
{
"ROSTemplateFormatVersion": "2015-09-01",
"Conditions": {
"IsAttachment1": {
"Fn::And": [
{
"Fn::Equals": [
1,
{
"Ref": "SlbCount"
}
]
},
{
"Fn::Or": [
"IsCreateSlb",
{
"Fn::Not": "IsCreateSlb"
}
]
}
]
},
"IsAttachment2": {
"Fn::And": [
{
"Fn::Equals": [
2,
{
"Ref": "SlbCount"
}
]
},
{
"Fn::Not": "IsCreateSlb"
}
]
},
"IsAttachment3": {
"Fn::And": [
{
"Fn::Equals": [
3,
{
"Ref": "SlbCount"
}
]
},
{
"Fn::Not": "IsCreateSlb"
}
]
},
"IsCreateSlb": {
"Fn::Equals": [
"None",
{
"Ref": "LoadBalancerIds"
}
]
},
"IsCreateVpc": {
"Fn::Equals": [
"Yes",
{
"Ref": "IsCreateVpc"
}
]
},
"NotUseVpc": {
"Fn::Equals": [
"No",
{
"Ref": "IsCreateVpc"
}
]
}
},
"Parameters": {
"SlbCount": {
"Type": "Number",
"Label": "Slb的數量(確認SLB數量)",
"Description": "需要添加的Slb實例的數量, 根據數量填寫《Slb實例Id》。",
"Default": 1,
"AllowedValues": [
1,
2,
3
]
},
"BackendServerWeightList": {
"Type": "String",
"Label": "Slb後端服務器權重",
"Description": "Slb後端服務器權重,允許單個或多個;如指定一個, 所有的Ecs權重都是此值;多個用','(英文逗號)隔開, 多個數量需對應《需要添加到Slb中的Ecs後端服務器》, 序號順序一一對應。 e.g. 20,30,100 ",
"Default": "100"
},
"LoadBalancerIds": {
"Type": "String",
"Label": "Slb實例Id",
"Description": "最多提供三個slb,多個slb需要存在於一個region內, 允許單個或多個, 多個用','(英文逗號)隔開, \ne.g. lb-bp183j4sfd02j02csd,lb-bid839fjn2j78bl,lb-sl39f8fvp6cbd4;\n如使用默認值(None)不指定,默認創建一個Slb實例。",
"Default": "None"
},
"IsCreateVpc": {
"Type": "String",
"Description": "是否創建Vpc,默認不創建。",
"Label": "是否創建Vpc",
"Default": "Yes",
"AllowedValues": [
"No",
"Yes"
]
},
"EcsGroupInstanceType": {
"Type": "String",
"Description": "創建ECS實例的規格,默認爲ecs.n1.large, 網絡爲classic類型可選用ecs.n1.large 或 ecs.n1.xlarge, 網絡爲Vpc類型可選用ecs.c5.large 或 ecs.g5.large",
"Label": "ECS實例規格",
"Default": "ecs.c5.large",
"AllowedValues": [
"ecs.n1.large",
"ecs.n1.xlarge",
"ecs.c5.large",
"ecs.g5.large"
]
},
"MaxAmount": {
"Type": "Number",
"Description": "一次需要創建ECS實例數量,與《ECS實例名稱的開始數字》可用值對應。",
"Label": "創建ECS實例數量",
"Default": 2
},
"EcsGroupImageId": {
"Type": "String",
"Description": "用於啓動ECS實例的鏡像ID。",
"Label": "ECS實例鏡像",
"Default": "centos_7_06_64_20G_alibase_20190218.vhd",
"AssociationProperty": "ALIYUN::ECS::Instance:ImageId"
},
"EcsPassword": {
"Type": "String",
"Description": "登陸ECS實例的密碼。",
"ConstraintDescription": "8-30個字符,字符,包括3種類型的大寫字母、小寫字母、數字或特殊字符。",
"Label": "ECS實例密碼",
"AllowedPattern": "[a-zA-Z0-9-\\(\\)\\`\\~\\!@\\#\\$%\\^&\\*-+=\\|\\{\\}\\[\\]\\:\\;\\‘\\,\\.\\?\\/]*",
"MaxLength": 30,
"MinLength": 8,
"NoEcho": true,
"Confirm": true
},
"EcsSystemDiskCategory": {
"Type": "String",
"Description": "系統磁盤類型: 高效雲盤(cloud_efficiency) or 普通雲盤(cloud_ssd)",
"Label": "ECS實例系統磁盤類型",
"Default": "cloud_ssd",
"AllowedValues": [
"cloud_efficiency",
"cloud_ssd"
]
},
"InstanceNamePrefix": {
"Type": "String",
"Description": "ECS實例名稱前綴, 必須要指定, 不能爲空。最長128個字符,可包含英文、中文、數字、(_)、(.)、(-)。",
"Label": "ECS實例名稱前綴",
"Default": "EcsGroup"
},
"InstanceNameBeginNumber": {
"Type": "String",
"Description": "ECS實例名稱的開始數字,默認爲0000,可用值分別是0000、0005、0010、0015、0020, 數字位數已經固定最長爲4位。",
"Label": "ECS實例名稱的開始數字",
"Default": "0"
},
"InstanceNameSuffix": {
"Type": "String",
"Description": "指定ECS實例名稱後綴(可選),默認爲空。",
"Label": "ECS實例名稱後綴",
"Default": "Test"
}
},
"Resources": {
"Vpc": {
"Type": "ALIYUN::ECS::VPC",
"Condition": "IsCreateVpc",
"Properties": {
"VpcName": {
"Fn::Join": [
"-",
[
{
"Ref": "ALIYUN::StackName"
},
"Vpc"
]
]
},
"CidrBlock": "192.168.0.0/16",
"Description": {
"Fn::Join": [
" ",
[
"Vpc of the",
{
"Ref": "ALIYUN::StackName"
}
]
]
}
}
},
"VSwitch": {
"Type": "ALIYUN::ECS::VSwitch",
"Condition": "IsCreateVpc",
"Properties": {
"VSwitchName": {
"Fn::Join": [
"-",
[
{
"Ref": "ALIYUN::StackName"
},
"VSwitch"
]
]
},
"VpcId": {
"Fn::GetAtt": [
"Vpc",
"VpcId"
]
},
"CidrBlock": "192.168.0.0/16",
"Description": {
"Fn::Join": [
" ",
[
"VSwitch of the",
{
"Ref": "ALIYUN::StackName"
}
]
]
},
"ZoneId": {
"Fn::Select": [
"0",
{
"Fn::GetAZs": {
"Ref": "ALIYUN::Region"
}
}
]
}
}
},
"SG": {
"Type": "ALIYUN::ECS::SecurityGroup",
"Condition": "IsCreateVpc",
"Properties": {
"VpcId": {
"Fn::GetAtt": [
"Vpc",
"VpcId"
]
},
"SecurityGroupName": {
"Fn::Join": [
"-",
[
{
"Ref": "ALIYUN::StackName"
},
"SG"
]
]
},
"SecurityGroupIngress": [
{
"PortRange": "-1/-1",
"Priority": 1,
"SourceCidrIp": "0.0.0.0/0",
"IpProtocol": "all",
"NicType": "intranet"
}
],
"SecurityGroupEgress": [
{
"PortRange": "-1/-1",
"Priority": 1,
"IpProtocol": "all",
"DestCidrIp": "0.0.0.0/0",
"NicType": "intranet"
}
]
}
},
"EcsInstanceGroupWithVpc": {
"Type": "ALIYUN::ECS::InstanceGroup",
"Condition": "IsCreateVpc",
"Properties": {
"IoOptimized": "optimized",
"ImageId": {
"Ref": "EcsGroupImageId"
},
"SecurityGroupId": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"SG",
"SecurityGroupId"
]
},
{
"Ref": "ALIYUN::NoValue"
}
]
},
"Password": {
"Ref": "EcsPassword"
},
"MinAmount": {
"Ref": "MaxAmount"
},
"SystemDiskCategory": {
"Ref": "EcsSystemDiskCategory"
},
"MaxAmount": {
"Ref": "MaxAmount"
},
"VSwitchId": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"VSwitch",
"VSwitchId"
]
},
{
"Ref": "ALIYUN::NoValue"
}
]
},
"VpcId": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"Vpc",
"VpcId"
]
},
{
"Ref": "ALIYUN::NoValue"
}
]
},
"InstanceType": {
"Ref": "EcsGroupInstanceType"
},
"InstanceName": {
"Fn::Join": [
"",
[
{
"Ref": "InstanceNamePrefix"
},
"[",
{
"Ref": "InstanceNameBeginNumber"
},
",4]",
{
"Ref": "InstanceNameSuffix"
}
]
]
},
"HostName": {
"Fn::Join": [
"",
[
"HostNameTest",
"[1,4]",
{
"Ref": "InstanceNameSuffix"
}
]
]
},
"AllocatePublicIP": {
"Fn::If": [
"IsCreateVpc",
false,
true
]
},
"UserData": {
"Fn::Join": [
"",
[
"#!/bin/sh\n",
"echo \"hello , create ecs group test\" > /tmp/create_test.log\n"
]
]
}
}
},
"EcsInstanceGroupNoVpc": {
"Type": "ALIYUN::ECS::InstanceGroup",
"Condition": "NotUseVpc",
"Properties": {
"IoOptimized": "optimized",
"ImageId": {
"Ref": "EcsGroupImageId"
},
"Password": {
"Ref": "EcsPassword"
},
"MinAmount": {
"Ref": "MaxAmount"
},
"SystemDiskCategory": {
"Ref": "EcsSystemDiskCategory"
},
"MaxAmount": {
"Ref": "MaxAmount"
},
"InstanceType": {
"Ref": "EcsGroupInstanceType"
},
"InstanceName": {
"Fn::Join": [
"",
[
{
"Ref": "InstanceNamePrefix"
},
"[",
{
"Ref": "InstanceNameBeginNumber"
},
",",
"4",
"]",
{
"Ref": "InstanceNameSuffix"
}
]
]
}
}
},
"LoadBalancer": {
"Condition": "IsCreateSlb",
"Type": "ALIYUN::SLB::LoadBalancer",
"Properties": {
"AddressType": "internet"
}
},
"BackendServerAttachment1": {
"Type": "ALIYUN::SLB::BackendServerAttachment",
"Condition": "IsAttachment1",
"Properties": {
"LoadBalancerId": {
"Fn::If": [
"IsCreateSlb",
{
"Fn::GetAtt": [
"LoadBalancer",
"LoadBalancerId"
]
},
{
"Fn::Select": [
"0",
{
"Fn::Split": [
",",
{
"Ref": "LoadBalancerIds"
}
]
}
]
}
]
},
"BackendServerList": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"EcsInstanceGroupWithVpc",
"InstanceIds"
]
},
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"InstanceIds"
]
}
]
},
"BackendServerWeightList": {
"Fn::Split": [
",",
{
"Ref": "BackendServerWeightList"
}
]
}
}
},
"BackendServerAttachment2-1": {
"Type": "ALIYUN::SLB::BackendServerAttachment",
"Condition": "IsAttachment2",
"Properties": {
"LoadBalancerId": {
"Fn::Select": [
"0",
{
"Fn::Split": [
",",
{
"Ref": "LoadBalancerIds"
}
]
}
]
},
"BackendServerList": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"EcsInstanceGroupWithVpc",
"InstanceIds"
]
},
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"InstanceIds"
]
}
]
},
"BackendServerWeightList": {
"Fn::Split": [
",",
{
"Ref": "BackendServerWeightList"
}
]
}
}
},
"BackendServerAttachment2-2": {
"Type": "ALIYUN::SLB::BackendServerAttachment",
"Condition": "IsAttachment2",
"Properties": {
"LoadBalancerId": {
"Fn::Select": [
"1",
{
"Fn::Split": [
",",
{
"Ref": "LoadBalancerIds"
}
]
}
]
},
"BackendServerList": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"EcsInstanceGroupWithVpc",
"InstanceIds"
]
},
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"InstanceIds"
]
}
]
},
"BackendServerWeightList": {
"Fn::Split": [
",",
{
"Ref": "BackendServerWeightList"
}
]
}
}
},
"BackendServerAttachment3-1": {
"Type": "ALIYUN::SLB::BackendServerAttachment",
"Condition": "IsAttachment3",
"Properties": {
"LoadBalancerId": {
"Fn::Select": [
"0",
{
"Fn::Split": [
",",
{
"Ref": "LoadBalancerIds"
}
]
}
]
},
"BackendServerList": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"EcsInstanceGroupWithVpc",
"InstanceIds"
]
},
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"InstanceIds"
]
}
]
},
"BackendServerWeightList": {
"Fn::Split": [
",",
{
"Ref": "BackendServerWeightList"
}
]
}
}
},
"BackendServerAttachment3-2": {
"Type": "ALIYUN::SLB::BackendServerAttachment",
"Condition": "IsAttachment3",
"Properties": {
"LoadBalancerId": {
"Fn::Select": [
"1",
{
"Fn::Split": [
",",
{
"Ref": "LoadBalancerIds"
}
]
}
]
},
"BackendServerList": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"EcsInstanceGroupWithVpc",
"InstanceIds"
]
},
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"InstanceIds"
]
}
]
},
"BackendServerWeightList": {
"Fn::Split": [
",",
{
"Ref": "BackendServerWeightList"
}
]
}
}
},
"BackendServerAttachment3-3": {
"Type": "ALIYUN::SLB::BackendServerAttachment",
"Condition": "IsAttachment3",
"Properties": {
"LoadBalancerId": {
"Fn::Select": [
"2",
{
"Fn::Split": [
",",
{
"Ref": "LoadBalancerIds"
}
]
}
]
},
"BackendServerList": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"EcsInstanceGroupWithVpc",
"InstanceIds"
]
},
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"InstanceIds"
]
}
]
},
"BackendServerWeightList": {
"Fn::Split": [
",",
{
"Ref": "BackendServerWeightList"
}
]
}
}
}
},
"Outputs": {
"EcsInstanceIds": {
"Description": "所有ECS實例的ID。",
"Value": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"EcsInstanceGroupWithVpc",
"InstanceIds"
]
},
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"InstanceIds"
]
}
]
}
},
"LoadBalancerIp": {
"Condition": "IsCreateSlb",
"Description": "SLB實例的IP。",
"Value": {
"Fn::GetAtt": [
"LoadBalancer",
"IpAddress"
]
}
},
"EcsPublicIps": {
"DependsOn": "NotUseVpc",
"Description": "所有ECS實例的公網IP列表",
"Value": {
"Fn::If": [
"IsCreateVpc",
"Vpc類型的ECS實例沒有公網IP",
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"PublicIps"
]
}
]
}
},
"EcsPrivateIps": {
"Description": "所有ECS實例的私網IP列表。",
"Value": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"EcsInstanceGroupWithVpc",
"PrivateIps"
]
},
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"InnerIps"
]
}
]
}
},
"EcsHostNames": {
"Description": "所有ECS實例的主機名稱列表。",
"Value": {
"Fn::If": [
"IsCreateVpc",
{
"Fn::GetAtt": [
"EcsInstanceGroupWithVpc",
"HostNames"
]
},
{
"Fn::GetAtt": [
"EcsInstanceGroupNoVpc",
"HostNames"
]
}
]
}
}
}
}