ALIYUN::ESS::ScalingConfiguration

更新时间:
复制 MD 格式

ALIYUN::ESS::ScalingConfiguration类型用于为伸缩组创建伸缩配置。

语法

{
  "Type": "ALIYUN::ESS::ScalingConfiguration",
  "Properties": {
    "PasswordInherit": Boolean,
    "DiskMappings": List,
    "RamRoleName": String,
    "IoOptimized": String,
    "InternetChargeType": String,
    "KeyPairName": String,
    "InstanceId": String,
    "InstanceTypes": List,
    "ImageId": String,
    "ResourceGroupId": String,
    "SpotStrategy": String,
    "InstanceType": String,
    "SystemDiskCategory": String,
    "SystemDiskSize": Integer,
    "SystemDiskAutoSnapshotPolicyId": String,
    "SystemDiskPerformanceLevel": String,
    "InternetMaxBandwidthOut": Integer,
    "InstanceName": String,
    "InternetMaxBandwidthIn": Integer,
    "ScalingConfigurationName": String,
    "UserData": String,
    "DeploymentSetId": String,
    "SecurityGroupId": String,
    "SpotPriceLimit": Number,
    "HpcClusterId": String,
    "ScalingGroupId": String,
    "SpotPriceLimitForInstanceType": Map,
    "TagList": List,
    "Ipv6AddressCount": Integer,
    "LoadBalancerWeight": Integer,
    "CreditSpecification": String,
    "ImageFamily": String,
    "CpuOptions": Map,
    "HostName": String,
    "Password": String,
    "SystemDiskBurstingEnabled": Boolean,
    "ImageOptionsLoginAsNonRoot": Boolean,
    "SystemDiskEncrypted": Boolean,
    "SystemDiskEncryptAlgorithm": String,
    "ZoneId": String,
    "Cpu": Integer,
    "SystemDiskProvisionedIops": Integer,
    "SystemDiskKMSKeyId": String,
    "InstancePatternInfos": List,
    "SpotInterruptionBehavior": String,
    "ImageName": String,
    "SystemDiskDescription": String,
    "SystemDiskDiskName": String,
    "InstanceTypeOverrides": List,
    "SystemDiskCategories": List,
    "Memory": Integer,
    "InstanceDescription": String,
    "SecurityGroupIds": List,
    "SpotDuration": Integer,
    "SecurityEnhancementStrategy": String,
    "Affinity": String,
    "Tenancy": String,
    "PrivatePoolOptions": Map,
    "DedicatedHostId": String
  }
}

属性

属性名称

类型

必须

允许更新

描述

约束

ScalingGroupId

String

是

否

伸缩配置所属的伸缩组ID。

无

Affinity

String

否

是

专有宿主机实例是否与专有宿主机关联。

取值范围:

  • default:实例不与专有宿主机关联。已启用节省停机模式的实例,停机后再次启动时,若原专有宿主机可用资源不足,则实例被放置在自动部署资源池的其它专有宿主机上。

  • host:实例与专有宿主机关联。已启用节省停机模式的实例,停机后再次启动时,仍放置在原专有宿主机上。若原专有宿主机可用资源不足,则实例重启失败。

Cpu

Integer

否

是

vCPU个数。

同时指定CPU和Memory可以定义实例规格范围,例如,CPU=2且Memory=16可以定义配置为2 vCPU和16 GiB的所有实例规格。弹性伸缩会结合IO优化、可用区等因素确定可用实例规格集合,并根据价格排序为您创建价格最低的实例。

CpuOptions

Map

否

是

CPU 选项。

更多信息,请参考CpuOptions属性。

CreditSpecification

String

否

是

突发性能实例的运行模式。

取值:

  • Unlimited(默认值):无性能约束模式。

  • Standard:标准模式。

关于实例性能的更多信息,请参见性能模式。

DedicatedHostId

String

否

是

是否在专有宿主机上创建ECS实例。

由于专有宿主机不支持创建抢占式实例,指定DedicatedHostId参数后,会自动忽略请求中的SpotStrategy和SpotPriceLimit设置。

您可以调用DescribeDedicatedHosts查询专有宿主机ID列表。

DeploymentSetId

String

否

否

部署集ID。

无

DiskMappings

List

否

是

需要挂载的磁盘。

最多支持16块磁盘。

更多信息,请参见DiskMappings属性。

HostName

String

否

是

云服务器的主机名。

半角句号(.)或短划线(-)不能作为首尾字符,不能连续使用半角句号(.)或短划线(-)。

不同类型实例的命名要求如下:

  • Windows实例:主机名长度为2~15,可以包含大小写字母、数字和短划线(-)。不能包含半角句号(.),不能全是数字。

  • 其他类型实例(Linux等):主机名长度为2~64,可以包含多个半角句号(.)。两个半角句号(.)之间为一段,每段可以包含大小写字母、数字和短划线(-)。

HpcClusterId

String

否

否

实例所属的EHPC集群ID。

无

ImageFamily

String

否

是

镜像族系名称。

通过设置该参数来获取当前镜像族系内最新可用镜像,用于创建实例。如果已经设置了参数ImageId,则不能设置该参数。

ImageId

String

否

是

实例的镜像ID,包括公共镜像、自定义镜像和云市场镜像。

更多信息,请参见公共镜像。

ImageName

String

否

是

镜像文件名称。

无

ImageOptionsLoginAsNonRoot

Boolean

否

否

ECS 实例是否使用ecs-user用户登录。

取值:

  • true:是。

  • false:否。

InstanceDescription

String

否

是

ECS实例的描述。

长度为2~256个英文或中文字符,不能以http://和https://开头。

InstanceId

String

否

否

伸缩配置的实例ID。

无

InstanceName

String

否

是

基于当前伸缩配置创建的实例的名称。

无

InstancePatternInfos

List

否

是

智能配置的信息集合。

更多信息,请参见InstancePatternInfos属性。

InstanceType

String

否

是

实例规格。

更多信息,请参见实例规格族。

InstanceTypeOverrides

List

否

是

用于指定的实例规格相关信息。

更多信息,请参见InstanceTypeOverrides属性

InstanceTypes

List

否

是

多实例规格参数。

如果指定了InstanceTypes,则InstanceType无效。

一个伸缩配置内最多可以设置10种实例规格,优先级按列表元素的顺序依次降低。当无法根据优先级较高的实例规格创建出实例时,弹性伸缩服务会自动选择下一优先级的实例规格来创建实例。

InternetChargeType

String

否

是

公网访问带宽计费方式。

取值:

  • PayByBandwidth:按固定带宽计费。

  • PayByTraffic(默认值):按流量计费。

InternetMaxBandwidthIn

Integer

否

否

公网最大入网带宽。

单位:Mbps。

取值范围:1~200。

如果您没有指定该参数,则入带宽将自动被设置为200 Mbps。实例的入数据流量免费,该参数在任何情况下都不涉及计费。

InternetMaxBandwidthOut

Integer

否

是

公网最大出网带宽。

取值范围:

  • 按固定带宽计费:0~100。默认值:0。

  • 按流量计费:0~100。此时,该参数为必选参数。

单位:Mbps。

IoOptimized

String

否

是

是否创建I/O优化实例。

取值:

  • none(默认值):非I/O优化。

  • optimized:I/O优化。

Ipv6AddressCount

Integer

否

是

为弹性网卡指定随机生成的IPv6地址数量。

无

KeyPairName

String

否

是

实例绑定的密钥对名称。

  • 如果实例类型为Windows实例,则此参数将被忽略,默认值为空。

  • 如果实例类型为Linux实例,则密码登录方式会被初始化成禁止。

LoadBalancerWeight

Integer

否

是

ECS实例作为负载均衡后端服务器时的权重。

取值范围:1~100。

默认值:50。

Memory

Integer

否

是

内存大小。

单位:GiB。

同时指定CPU和Memory可以定义实例规格范围。例如,CPU=2且Memory=16可以定义配置为2 vCPU和16 GiB的所有实例规格。弹性伸缩会结合IO优化、可用区等因素确定可用实例规格集合,并根据价格排序为您创建价格最低的实例。

Password

String

否

是

ECS实例的密码。

长度为8至30个字符,必须同时包含大小写英文字母、数字和特殊符号中的三类字符。特殊符号可以是:

()` ~!@#$%^&*-_+=\|{}[]:;'<>,.?/

Windows实例不能以斜线号(/)为密码首字符。

说明

如果传入Password参数,建议您使用HTTPS协议发送请求,避免密码泄露。

PasswordInherit

Boolean

否

是

是否使用镜像预设的密码。

如果使用镜像预设的密码,您需要确保所用镜像已经预设了密码。

PrivatePoolOptions

Map

否

是

实例启动的私有池配置

更多信息,请参见PrivatePoolOptions属性

RamRoleName

String

否

是

实例RAM角色名称。

您可以使用RAM API ListRoles查询实例RAM角色名称。更多信息,请参见创建角色和获取角色列表。

ResourceGroupId

String

否

是

实例所在的资源组ID。

无

ScalingConfigurationName

String

否

是

伸缩配置的名称。

长度为2~64个字符,以数字、英文字母或汉字开头,可包含数字、英文字母、汉字、下划线(_)、短划线(-)和半角句号(.)。

在同一地域下同一伸缩组内伸缩配置名称唯一。

如果您没有指定本参数,则默认使用伸缩配置的ID。

SecurityEnhancementStrategy

String

否

否

是否开启安全加固。

取值范围:

  • Active:启用安全加固,只对公共镜像生效。

  • Deactive:不启用安全加固,对所有镜像类型生效。

SecurityGroupId

String

否

是

实例所属的安全组。

无

SecurityGroupIds

List

否

是

将ECS实例同时加入多个安全组。

说明

不支持同时指定SecurityGroupId和SecurityGroupIds。

SpotDuration

Integer

否

是

抢占式实例的保留时长。

单位为小时。取值范围:

  • 1:创建后阿里云会保证实例运行1小时不会被自动释放;超过1小时后,系统会自动比较出价与市场价格、检查资源库存,来决定实例的保留或回收。

  • 0:创建后,阿里云不能保证实例运行1小时,系统会自动比较出价与市场价格、检查资源库存,来决定实例的保留或回收。

SpotInterruptionBehavior

String

否

是

抢占实例中断模式。

无

SpotPriceLimit

Number

否

是

实例每小时的最高价格。

支持最多3位小数。

当SpotStrategy取值为SpotWithPriceLimit时该参数生效,且取值会被SpotPriceLimitForInstanceType的取值所覆盖。

SpotPriceLimitForInstanceType

Map

否

是

抢占式实例的实例规格和对应的出价。

格式:{"<instance_type_1>": <price_limit_1>, ..., {"<instance_type_10>": <price_limit_10>}。

当SpotStrategy取值为SpotWithPriceLimit时该参数生效。

最多可设置10组实例和价格。

SpotStrategy

String

否

是

后付费实例的抢占策略。

取值:

  • NoSpot(默认值):正常按量付费实例。

  • SpotWithPriceLimit:设置上限价格的抢占式实例。

  • SpotAsPriceGo:系统自动出价,跟随当前市场实际价格。

SystemDiskAutoSnapshotPolicyId

String

否

是

系统盘使用的自动快照策略ID。

无

SystemDiskBurstingEnabled

Boolean

否

否

系统盘是否开启Burst(性能突发)。

取值:

  • true:开启。

  • false:未开启。

SystemDiskCategories

List

否

是

系统盘的多磁盘类型。

当无法使用高优先级的磁盘类型时,弹性伸缩自动尝试下一优先级的磁盘类型创建系统盘。取值范围:

  • cloud:普通云盘。

  • cloud_efficiency:高效云盘。

  • cloud_ssd:SSD云盘。

  • cloud_essd:ESSD云盘。

SystemDiskCategory

String

否

是

系统盘类型。

取值:

  • cloud:普通云盘。

  • cloud_efficiency:高效云盘。

  • cloud_ssd:SSD云盘。

  • ephemeral_ssd:本地SSD盘。

  • cloud_essd:ESSD云盘。

当InstanceType为I系列的实例规格且实例属于非I/O优化实例时,默认值为cloud,否则,默认值为cloud_efficiency。

SystemDiskDescription

String

否

是

系统盘的描述。

无

SystemDiskDiskName

String

否

是

系统盘的名称。

无

SystemDiskEncryptAlgorithm

String

否

是

系统盘采用的加密算法。

取值:

  • AES-256。

  • SM4-128。

SystemDiskEncrypted

Boolean

否

是

系统盘是否加密。

取值:

  • true:加密。

  • false:不加密。

SystemDiskKMSKeyId

String

否

是

系统盘使用的KMS密钥ID。

无

SystemDiskPerformanceLevel

String

否

是

创建ESSD云盘作为系统盘使用时,设置云盘的性能等级。

取值:

  • PL1(默认值):单盘最高随机读写IOPS为5万。

  • PL2:单盘最高随机读写IOPS为10万。

  • PL3:单盘最高随机读写IOPS为100万。

有关如何选择ESSD性能等级,请参见ESSD云盘。

SystemDiskProvisionedIops

Integer

否

是

系统盘预配置的IOPS(Input/Output Operations Per Second)性能指标。

无

SystemDiskSize

Integer

否

是

系统盘大小。

取值范围:20~500。

默认值:40。

单位:GiB。

如果使用自定义镜像创建系统盘,则系统盘大小必须大于等于自定义镜像大小。

TagList

List

否

是

实例标签。

标签以键值对方式传入,最多可以使用5组标签,格式为{"key1": "value1", "key2": "value2", ... "key5": "value5"}。

更多信息,请参见TagList属性。

Tenancy

String

否

是

是否在专有宿主机上创建实例。

取值范围:

  • default:创建非专有宿主机实例。

  • host:创建专有宿主机实例。若您不指定 DedicatedHostId,则由阿里云自动选择专有宿主机放置实例。

UserData

String

否

是

创建实例时传递的用户数据。

内容需要限制在16KB以内,无需Base64转码,特殊字符需要使用反斜线(\)转义。

ZoneId

String

否

是

实例所属的可用区ID。

无

DiskMappings语法

"DiskMappings": [
  {
    "Category": String,
    "DiskName": String,
    "Description": String,
    "AutoSnapshotPolicyId": String,
    "PerformanceLevel": String,
    "Encrypted": String,
    "KMSKeyId": String,
    "Device": String,
    "SnapshotId": String,
    "Size": String,
    "DeleteWithInstance": Boolean,
    "ProvisionedIops": Integer,
    "Categories": List,
    "BurstingEnabled": Boolean
  }
]

DiskMappings属性

属性名称

类型

必须

允许更新

描述

约束

AutoSnapshotPolicyId

String

否

否

数据盘使用的自动快照策略ID。

无

BurstingEnabled

Boolean

否

否

数据盘是否开启 Burst(性能突发)。

可能值:

  • true:开启。

  • false:未开启。

Categories

List

否

否

数据盘的多磁盘类型。

第一个磁盘类型优先级最高,其他磁盘类型的优先级依次递减。当无法使用高优先级的磁盘类型时,弹性伸缩自动尝试下一优先级的磁盘类型创建数据盘。取值范围:

  • cloud:普通云盘。随实例创建的普通云盘的 DeleteWithInstance 属性为 true。

  • cloud_efficiency:高效云盘。

  • cloud_ssd:SSD 云盘。

  • cloud_essd:ESSD 云盘。

Category

String

否

否

数据盘类型。

取值:

  • cloud:普通云盘。

  • cloud_efficiency(默认值):高效云盘。

  • cloud_ssd:SSD云盘。

  • ephemeral_ssd:本地SSD盘。

  • cloud_essd:ESSD云盘。

对于I/O优化实例,默认值为cloud_efficiency;对于非I/O优化实例,默认值为cloud。

DeleteWithInstance

Boolean

否

否

数据盘是否随实例释放。

取值范围:

  • true:释放实例时,该磁盘随实例一起释放。

  • false:释放实例时,该磁盘保留不释放。

Description

String

否

否

数据盘描述。

长度为2~256个字符。不能以http://或https://开头。

Device

String

否

否

数据盘挂载点。

如果该参数值未指定,则默认将在自动创建ECS实例时由系统分配,取值从/dev/xvdb开始,到/dev/xvdz结束。

DiskName

String

否

否

数据盘名称。

长度为2~128个字符。

必须以英文字母或汉字开头,不能以http://或https:// 开头。

可以包含数字、英文字母、汉字、半角冒号(:)、下划线(_)和短划线(-)。

Encrypted

String

否

否

数据盘是否加密。

取值:

  • true:加密。

  • false(默认值):不加密。

KMSKeyId

String

否

否

数据盘对应的KMS密钥ID。

无

PerformanceLevel

String

否

否

创建ESSD云盘作为数据盘使用时,设置云盘的性能等级。

取值:

  • PL1(默认值):单盘最高随机读写IOPS为5万。

  • PL2:单盘最高随机读写IOPS为10万。

  • PL3:单盘最高随机读写IOPS为100万。

有关如何选择ESSD性能等级,请参见ESSD云盘。

ProvisionedIops

Integer

否

否

数据盘预配置的 IOPS(Input/Output Operations Per Second)性能指标。

说明

IOPS(Input/Output Operations Per Second)指每秒能处理的 I/O 个数,表示块存储处理读写(输出/输入)的能力,单位为次。

Size

String

否

否

数据盘磁盘大小。

取值:

  • cloud:5~2000。

  • cloud_efficiency:20~32,768。

  • cloud_ssd:20~32,768。

  • cloud_essd:20~32,768。

  • ephemeral_ssd:5~800。

单位:GB。

指定该参数后,磁盘大小必须大于等于快照大小(快照通过SnapshotId指定)。

SnapshotId

String

否

否

创建数据盘时使用的快照。

指定该参数后,Size会被忽略,实际创建的磁盘大小为指定快照的大小。如果快照创建于2013年7月15日或之前,调用快照会被拒绝,返回参数中会提示InvalidSnapshot.TooOld。

PrivatePoolOptions语法

"PrivatePoolOptions": 
  {
    "MatchCriteria": String,
    "Id": String
  }

PrivatePoolOptions属性

属性名称

类型

必须

允许更新

描述

约束

Id

String

否

是

私有池ID。

即弹性保障服务ID或容量预定服务ID。

MatchCriteria

String

否

是

实例启动的私有池容量选项。

弹性保障服务或容量预定服务在生效后会生成私有池容量,供实例启动时选择。取值范围:

  • Open:开放模式。将自动匹配开放类型的私有池容量。如果没有符合条件的私有池容量,则使用公共池资源启动。该模式下无需设置PrivatePoolOptions.Id参数。

  • Target:指定模式。使用指定的私有池容量启动实例,如果该私有池容量不可用,则实例会启动失败。该模式下必须指定私有池ID,即PrivatePoolOptions.Id 参数为必填项。

  • None:不使用模式。实例启动将不使用私有池容量。

InstanceTypeOverrides语法

"InstanceTypeOverrides": [
  {
    "InstanceType": String,
    "WeightedCapacity": Integer
  }
]

InstanceTypeOverrides属性

属性名称

类型

必须

允许更新

描述

约束

InstanceType

String

否

是

指定实例规格。

当您需要伸缩组按照实例规格容量进行伸缩时,请同时指定本参数和 WeightedCapacity。

WeightedCapacity

Integer

否

是

指定实例规格的权重。

由于每个实例规格的vCPU 个数、内存大小等性能指标会有差异,您可以根据自身需求,给不同的实例规格配置不同的权重。

例如:

  • 当前容量:0。

  • 期望容量:6。

  • ecs.c5.xlarge 规格容量:4。

为满足期望容量,伸缩组将为用户扩容2台ecs.c5.xlarge实例。

InstancePatternInfos语法

"InstancePatternInfos": [
  {
    "BurstablePerformance": String,
    "Architectures": List,
    "InstanceFamilyLevel": String,
    "Memory": Number,
    "MaxPrice": Number,
    "ExcludedInstanceTypes": List,
    "Cores": Integer
  }
]

InstancePatternInfos属性

属性名称

类型

必须

允许更新

描述

约束

Architectures

List

否

是

实例规格所属的架构类型。

取值范围:

  • X86:X86计算。

  • Heterogeneous:异构计算,例如GPU或FPGA等。

  • BareMental:弹性裸金属服务器。

  • Arm:Arm计算。

默认值:包含所有架构类型。

BurstablePerformance

String

否

否

是否为性能突发实例规格。

取值范围:

  • Exclude:不包含性能突发实例规格。

  • Include:包含性能突发实例规格。

  • Required:只包含性能突发实例规格。

默认值:Include。

Cores

Integer

否

是

智能配置模式下,实例规格的vCPU内核数目。

用于筛选符合要求的实例规格范围。更多信息,请参见实例规格族。

请注意以下信息:

  • InstancePatternInfos 参数仅适用于伸缩组的网络类型为专有网络。

  • InstancePatternInfos 参数必须同时配置InstancePatternInfos.Cores和InstancePatternInfos.Memory。

  • 如果您已经通过InstanceType或InstanceTypes参数指定了实例规格,弹性伸缩优先使用您指定的实例规格扩容,当指定的实例规格无库存时,再从符合InstancePatternInfos参数值的实例规格中优先使用价格最低的实例规格扩容。

ExcludedInstanceTypes

List

否

是

需要排除的实例规格。

通过使用通配符(*)可以排除单个规格或者整个规格族。例如:

  • ecs.c6.large:表示排除 ecs.c6.large 实例规格。

  • ecs.c6.*:表示排除整个 c6 规格族的实例规格。

InstanceFamilyLevel

String

否

是

实例规格族级别。

用于筛选符合要求的实例规格范围,当CostOptimization开启时生效。取值范围:

  • EntryLevel:入门级,即共享型实例规格。成本更低,但是无法保证实例计算性能的稳定。适用于平时CPU使用率低的业务场景。更多信息,请参见共享型。

  • EnterpriseLevel:企业级。性能稳定且资源独享,适用于对稳定性要求高的业务场景。更多信息,请参见实例规格族。

  • CreditEntryLevel:积分入门级,即突发性能实例。通过CPU积分来保证计算性能,适用于平时CPU使用率低、偶有突发CPU使用率的业务场景。更多信息,请参见突发性能实例概述。

MaxPrice

Number

否

是

智能配置模式下,按量付费实例或者抢占式实例可接受的每小时最高价格。

无。

Memory

Number

否

是

智能配置模式下,实例规格的内存大小。

单位为GiB,用于筛选符合要求的实例规格范围。

CpuOptions语法

"CpuOptions": 
  {
    "NestedVirtualization": String
  }

CpuOptions属性

属性名称

类型

必须

允许更新

描述

约束

NestedVirtualization

String

否

是

是否启用嵌套虚拟化。取值:

  • enabled:启用嵌套虚拟化。

  • disabled:禁用嵌套虚拟化。

取值:enabled
disabled

  • enabled

  • disabled

TagList语法

"TagList": [
  {
    "Key": String,
    "Value": String
  }
]

TagList属性

属性名称

类型

必须

允许更新

描述

约束

Key

String

是

否

标签键。

长度为1~64个字符,不能以aliyun和acs:开头,不能包含http://或https://。

Value

String

否

否

标签值。

长度为0~128个字符,不能以aliyun和acs:开头,不能包含http://或https://。

返回值

Fn::GetAtt

  • ScalingConfigurationId:伸缩配置的ID。由系统生成,全局唯一。

  • ScalingGroupId:伸缩配置所属的伸缩组ID。

示例

场景 1 :为已有伸缩组创建伸缩配置。

ROSTemplateFormatVersion: '2015-09-01'
Description:
  zh-cn: 为已有伸缩组创建一个简单的伸缩配置,指定实例规格、镜像和安全组。
  en: Create a simple scaling configuration for an existing scaling group with specified instance type, image, and security group.
Parameters:
  AutoScalingGroupId:
    Type: String
    Label:
      zh-cn: 伸缩组ID
      en: Scaling Group ID
    Description:
      zh-cn: 选择已创建的伸缩组ID。
      en: Select an existing scaling group ID.
    AssociationProperty: ALIYUN::ESS::AutoScalingGroup::AutoScalingGroupId
  SecurityGroupId:
    Type: String
    Label:
      zh-cn: 安全组ID
      en: Security Group ID
    Description:
      zh-cn: 选择安全组ID。
      en: Select a security group ID.
    AssociationProperty: ALIYUN::ECS::SecurityGroup::SecurityGroupId
  ImageId:
    Type: String
    Label:
      zh-cn: 镜像ID
      en: Image ID
    Description:
      zh-cn: 选择用于创建实例的镜像。
      en: Select an image for creating instances.
    AssociationProperty: ALIYUN::ECS::Image::ImageId
    AssociationPropertyMetadata:
      SupportedImageOwnerAlias:
        - system
        - self
        - others
  InstanceType:
    Type: String
    Label:
      zh-cn: 实例规格
      en: Instance Type
    Description:
      zh-cn: 选择ECS实例规格。
      en: Select an ECS instance type.
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      InstanceChargeType: PostPaid
  SystemDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: System Disk Category
    Description:
      zh-cn: 选择系统盘类型。
      en: Select a system disk category.
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      InstanceType: ${InstanceType}
    Default: cloud_essd
Resources:
  ScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration
    Properties:
      ScalingGroupId:
        Ref: AutoScalingGroupId
      SecurityGroupId:
        Ref: SecurityGroupId
      ImageId:
        Ref: ImageId
      InstanceType:
        Ref: InstanceType
      SystemDiskCategory:
        Ref: SystemDiskCategory
      SystemDiskSize: 40
      ScalingConfigurationName:
        Ref: ALIYUN::StackName
      InternetMaxBandwidthOut: 5
      InternetChargeType: PayByTraffic
Outputs:
  ScalingConfigurationId:
    Description:
      zh-cn: 伸缩配置ID。
      en: Scaling configuration ID.
    Label:
      zh-cn: 伸缩配置ID
      en: Scaling Configuration ID
    Value:
      Fn::GetAtt:
        - ScalingConfiguration
        - ScalingConfigurationId
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - AutoScalingGroupId
          - SecurityGroupId
          - ImageId
          - InstanceType
          - SystemDiskCategory
{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Description": {
    "zh-cn": "为已有伸缩组创建一个简单的伸缩配置,指定实例规格、镜像和安全组。",
    "en": "Create a simple scaling configuration for an existing scaling group with specified instance type, image, and security group."
  },
  "Parameters": {
    "AutoScalingGroupId": {
      "Type": "String",
      "Label": {
        "zh-cn": "伸缩组ID",
        "en": "Scaling Group ID"
      },
      "Description": {
        "zh-cn": "选择已创建的伸缩组ID。",
        "en": "Select an existing scaling group ID."
      },
      "AssociationProperty": "ALIYUN::ESS::AutoScalingGroup::AutoScalingGroupId"
    },
    "SecurityGroupId": {
      "Type": "String",
      "Label": {
        "zh-cn": "安全组ID",
        "en": "Security Group ID"
      },
      "Description": {
        "zh-cn": "选择安全组ID。",
        "en": "Select a security group ID."
      },
      "AssociationProperty": "ALIYUN::ECS::SecurityGroup::SecurityGroupId"
    },
    "ImageId": {
      "Type": "String",
      "Label": {
        "zh-cn": "镜像ID",
        "en": "Image ID"
      },
      "Description": {
        "zh-cn": "选择用于创建实例的镜像。",
        "en": "Select an image for creating instances."
      },
      "AssociationProperty": "ALIYUN::ECS::Image::ImageId",
      "AssociationPropertyMetadata": {
        "SupportedImageOwnerAlias": [
          "system",
          "self",
          "others"
        ]
      }
    },
    "InstanceType": {
      "Type": "String",
      "Label": {
        "zh-cn": "实例规格",
        "en": "Instance Type"
      },
      "Description": {
        "zh-cn": "选择ECS实例规格。",
        "en": "Select an ECS instance type."
      },
      "AssociationProperty": "ALIYUN::ECS::Instance::InstanceType",
      "AssociationPropertyMetadata": {
        "InstanceChargeType": "PostPaid"
      }
    },
    "SystemDiskCategory": {
      "Type": "String",
      "Label": {
        "zh-cn": "系统盘类型",
        "en": "System Disk Category"
      },
      "Description": {
        "zh-cn": "选择系统盘类型。",
        "en": "Select a system disk category."
      },
      "AssociationProperty": "ALIYUN::ECS::Disk::SystemDiskCategory",
      "AssociationPropertyMetadata": {
        "InstanceType": "${InstanceType}"
      },
      "Default": "cloud_essd"
    }
  },
  "Resources": {
    "ScalingConfiguration": {
      "Type": "ALIYUN::ESS::ScalingConfiguration",
      "Properties": {
        "ScalingGroupId": {
          "Ref": "AutoScalingGroupId"
        },
        "SecurityGroupId": {
          "Ref": "SecurityGroupId"
        },
        "ImageId": {
          "Ref": "ImageId"
        },
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "SystemDiskCategory": {
          "Ref": "SystemDiskCategory"
        },
        "SystemDiskSize": 40,
        "ScalingConfigurationName": {
          "Ref": "ALIYUN::StackName"
        },
        "InternetMaxBandwidthOut": 5,
        "InternetChargeType": "PayByTraffic"
      }
    }
  },
  "Outputs": {
    "ScalingConfigurationId": {
      "Description": {
        "zh-cn": "伸缩配置ID。",
        "en": "Scaling configuration ID."
      },
      "Label": {
        "zh-cn": "伸缩配置ID",
        "en": "Scaling Configuration ID"
      },
      "Value": {
        "Fn::GetAtt": [
          "ScalingConfiguration",
          "ScalingConfigurationId"
        ]
      }
    }
  },
  "Metadata": {
    "ALIYUN::ROS::Interface": {
      "ParameterGroups": [
        {
          "Parameters": [
            "AutoScalingGroupId",
            "SecurityGroupId",
            "ImageId",
            "InstanceType",
            "SystemDiskCategory"
          ]
        }
      ]
    }
  }
}

场景 2 :创建 VPC 网络并构建完整伸缩组基础架构。

ROSTemplateFormatVersion: '2015-09-01'
Description:
  zh-cn: 创建VPC、交换机、安全组、伸缩组和伸缩配置,并启用伸缩组,实现完整的弹性伸缩基础架构。
  en: Create VPC, VSwitch, Security Group, Scaling Group and Scaling Configuration, then enable the scaling group to build a complete auto-scaling infrastructure.
Parameters:
  ZoneId:
    Type: String
    Label:
      zh-cn: 可用区
      en: Availability Zone
    Description:
      zh-cn: 选择可用区。
      en: Select an availability zone.
    AssociationProperty: ALIYUN::ECS::Instance::ZoneId
    AssociationPropertyMetadata:
      AutoSelectFirst: true
  InstanceType:
    Type: String
    Label:
      zh-cn: 实例规格
      en: Instance Type
    Description:
      zh-cn: 选择ECS实例规格。
      en: Select an ECS instance type.
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      InstanceChargeType: PostPaid
      ZoneId: ${ZoneId}
  ImageId:
    Type: String
    Label:
      zh-cn: 镜像ID
      en: Image ID
    Description:
      zh-cn: 选择用于创建实例的镜像。
      en: Select an image for creating instances.
    AssociationProperty: ALIYUN::ECS::Image::ImageId
    AssociationPropertyMetadata:
      SupportedImageOwnerAlias:
        - system
        - self
        - others
  SystemDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: System Disk Category
    Description:
      zh-cn: 选择系统盘类型。
      en: Select a system disk category.
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      InstanceType: ${InstanceType}
    Default: cloud_essd
  InstancePassword:
    Type: String
    Label:
      zh-cn: 实例密码
      en: Instance Password
    Description:
      zh-cn: 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、特殊符号)。
      en: Server login password, 8-30 characters, must contain three types (uppercase, lowercase, numbers, special symbols).
    NoEcho: true
    AssociationProperty: ALIYUN::ECS::Instance::Password
    ConstraintDescription:
      zh-cn: 长度8-30,必须包含三项(大写字母、小写字母、数字、特殊符号)。
      en: Length 8-30, must contain three types (uppercase, lowercase, numbers, special symbols).
  MaxSize:
    Type: Number
    Label:
      zh-cn: 最大实例数
      en: Max Size
    Description:
      zh-cn: 伸缩组内ECS实例个数的最大值。
      en: The maximum number of ECS instances in the scaling group.
    Default: 5
    MinValue: 0
    MaxValue: 1000
  MinSize:
    Type: Number
    Label:
      zh-cn: 最小实例数
      en: Min Size
    Description:
      zh-cn: 伸缩组内ECS实例个数的最小值。
      en: The minimum number of ECS instances in the scaling group.
    Default: 1
    MinValue: 0
    MaxValue: 1000
Resources:
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      VpcName:
        Fn::Sub: ${ALIYUN::StackName}-vpc
      CidrBlock: 192.168.0.0/16
  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VSwitchName:
        Fn::Sub: ${ALIYUN::StackName}-vsw
      VpcId:
        Ref: Vpc
      CidrBlock: 192.168.0.0/24
      ZoneId:
        Ref: ZoneId
  SecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Fn::Sub: ${ALIYUN::StackName}-sg
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:
        - PortRange: 22/22
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
        - PortRange: 80/80
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
        - PortRange: 443/443
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
      SecurityGroupEgress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: intranet
  ScalingGroup:
    Type: ALIYUN::ESS::ScalingGroup
    DependsOn: SecurityGroup
    Properties:
      MinSize:
        Ref: MinSize
      MaxSize:
        Ref: MaxSize
      DefaultCooldown: 300
      ScalingGroupName: web-autoscaling-group
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      HealthCheckType: ECS
      RemovalPolicys:
        - OldestInstance
        - NewestInstance
      GroupDeletionProtection: false
  ScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration
    DependsOn: ScalingGroup
    Properties:
      ScalingGroupId:
        Ref: ScalingGroup
      SecurityGroupId:
        Ref: SecurityGroup
      ImageId:
        Ref: ImageId
      InstanceType:
        Ref: InstanceType
      SystemDiskCategory:
        Ref: SystemDiskCategory
      SystemDiskSize: 40
      ScalingConfigurationName: web-scaling-config
      Password:
        Ref: InstancePassword
      InternetMaxBandwidthOut: 5
      InternetChargeType: PayByTraffic
      IoOptimized: optimized
      TagList:
        - Key: CreatedBy
          Value: ROS
  ScalingGroupEnable:
    Type: ALIYUN::ESS::ScalingGroupEnable
    Properties:
      ScalingGroupId:
        Ref: ScalingGroup
      ScalingConfigurationId:
        Ref: ScalingConfiguration
      ScalingRuleArisExecuteVersion: 0
Outputs:
  ScalingGroupId:
    Description:
      zh-cn: 伸缩组ID。
      en: Scaling group ID.
    Label:
      zh-cn: 伸缩组ID
      en: Scaling Group ID
    Value:
      Fn::GetAtt:
        - ScalingGroup
        - ScalingGroupId
  ScalingConfigurationId:
    Description:
      zh-cn: 伸缩配置ID。
      en: Scaling configuration ID.
    Label:
      zh-cn: 伸缩配置ID
      en: Scaling Configuration ID
    Value:
      Fn::GetAtt:
        - ScalingConfiguration
        - ScalingConfigurationId
  SecurityGroupId:
    Description:
      zh-cn: 安全组ID。
      en: Security group ID.
    Label:
      zh-cn: 安全组ID
      en: Security Group ID
    Value:
      Ref: SecurityGroup
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - ZoneId
          - InstanceType
          - ImageId
          - SystemDiskCategory
          - InstancePassword
      - Parameters:
          - MaxSize
          - MinSize
{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Description": {
    "zh-cn": "创建VPC、交换机、安全组、伸缩组和伸缩配置,并启用伸缩组,实现完整的弹性伸缩基础架构。",
    "en": "Create VPC, VSwitch, Security Group, Scaling Group and Scaling Configuration, then enable the scaling group to build a complete auto-scaling infrastructure."
  },
  "Parameters": {
    "ZoneId": {
      "Type": "String",
      "Label": {
        "zh-cn": "可用区",
        "en": "Availability Zone"
      },
      "Description": {
        "zh-cn": "选择可用区。",
        "en": "Select an availability zone."
      },
      "AssociationProperty": "ALIYUN::ECS::Instance::ZoneId",
      "AssociationPropertyMetadata": {
        "AutoSelectFirst": true
      }
    },
    "InstanceType": {
      "Type": "String",
      "Label": {
        "zh-cn": "实例规格",
        "en": "Instance Type"
      },
      "Description": {
        "zh-cn": "选择ECS实例规格。",
        "en": "Select an ECS instance type."
      },
      "AssociationProperty": "ALIYUN::ECS::Instance::InstanceType",
      "AssociationPropertyMetadata": {
        "InstanceChargeType": "PostPaid",
        "ZoneId": "${ZoneId}"
      }
    },
    "ImageId": {
      "Type": "String",
      "Label": {
        "zh-cn": "镜像ID",
        "en": "Image ID"
      },
      "Description": {
        "zh-cn": "选择用于创建实例的镜像。",
        "en": "Select an image for creating instances."
      },
      "AssociationProperty": "ALIYUN::ECS::Image::ImageId",
      "AssociationPropertyMetadata": {
        "SupportedImageOwnerAlias": [
          "system",
          "self",
          "others"
        ]
      }
    },
    "SystemDiskCategory": {
      "Type": "String",
      "Label": {
        "zh-cn": "系统盘类型",
        "en": "System Disk Category"
      },
      "Description": {
        "zh-cn": "选择系统盘类型。",
        "en": "Select a system disk category."
      },
      "AssociationProperty": "ALIYUN::ECS::Disk::SystemDiskCategory",
      "AssociationPropertyMetadata": {
        "InstanceType": "${InstanceType}"
      },
      "Default": "cloud_essd"
    },
    "InstancePassword": {
      "Type": "String",
      "Label": {
        "zh-cn": "实例密码",
        "en": "Instance Password"
      },
      "Description": {
        "zh-cn": "服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、特殊符号)。",
        "en": "Server login password, 8-30 characters, must contain three types (uppercase, lowercase, numbers, special symbols)."
      },
      "NoEcho": true,
      "AssociationProperty": "ALIYUN::ECS::Instance::Password",
      "ConstraintDescription": {
        "zh-cn": "长度8-30,必须包含三项(大写字母、小写字母、数字、特殊符号)。",
        "en": "Length 8-30, must contain three types (uppercase, lowercase, numbers, special symbols)."
      }
    },
    "MaxSize": {
      "Type": "Number",
      "Label": {
        "zh-cn": "最大实例数",
        "en": "Max Size"
      },
      "Description": {
        "zh-cn": "伸缩组内ECS实例个数的最大值。",
        "en": "The maximum number of ECS instances in the scaling group."
      },
      "Default": 5,
      "MinValue": 0,
      "MaxValue": 1000
    },
    "MinSize": {
      "Type": "Number",
      "Label": {
        "zh-cn": "最小实例数",
        "en": "Min Size"
      },
      "Description": {
        "zh-cn": "伸缩组内ECS实例个数的最小值。",
        "en": "The minimum number of ECS instances in the scaling group."
      },
      "Default": 1,
      "MinValue": 0,
      "MaxValue": 1000
    }
  },
  "Resources": {
    "Vpc": {
      "Type": "ALIYUN::ECS::VPC",
      "Properties": {
        "VpcName": {
          "Fn::Sub": "${ALIYUN::StackName}-vpc"
        },
        "CidrBlock": "192.168.0.0/16"
      }
    },
    "VSwitch": {
      "Type": "ALIYUN::ECS::VSwitch",
      "Properties": {
        "VSwitchName": {
          "Fn::Sub": "${ALIYUN::StackName}-vsw"
        },
        "VpcId": {
          "Ref": "Vpc"
        },
        "CidrBlock": "192.168.0.0/24",
        "ZoneId": {
          "Ref": "ZoneId"
        }
      }
    },
    "SecurityGroup": {
      "Type": "ALIYUN::ECS::SecurityGroup",
      "Properties": {
        "SecurityGroupName": {
          "Fn::Sub": "${ALIYUN::StackName}-sg"
        },
        "VpcId": {
          "Ref": "Vpc"
        },
        "SecurityGroupIngress": [
          {
            "PortRange": "22/22",
            "Priority": 1,
            "SourceCidrIp": "0.0.0.0/0",
            "IpProtocol": "tcp"
          },
          {
            "PortRange": "80/80",
            "Priority": 1,
            "SourceCidrIp": "0.0.0.0/0",
            "IpProtocol": "tcp"
          },
          {
            "PortRange": "443/443",
            "Priority": 1,
            "SourceCidrIp": "0.0.0.0/0",
            "IpProtocol": "tcp"
          }
        ],
        "SecurityGroupEgress": [
          {
            "PortRange": "-1/-1",
            "Priority": 1,
            "IpProtocol": "all",
            "DestCidrIp": "0.0.0.0/0",
            "NicType": "intranet"
          }
        ]
      }
    },
    "ScalingGroup": {
      "Type": "ALIYUN::ESS::ScalingGroup",
      "DependsOn": "SecurityGroup",
      "Properties": {
        "MinSize": {
          "Ref": "MinSize"
        },
        "MaxSize": {
          "Ref": "MaxSize"
        },
        "DefaultCooldown": 300,
        "ScalingGroupName": "web-autoscaling-group",
        "VpcId": {
          "Ref": "Vpc"
        },
        "VSwitchId": {
          "Ref": "VSwitch"
        },
        "HealthCheckType": "ECS",
        "RemovalPolicys": [
          "OldestInstance",
          "NewestInstance"
        ],
        "GroupDeletionProtection": false
      }
    },
    "ScalingConfiguration": {
      "Type": "ALIYUN::ESS::ScalingConfiguration",
      "DependsOn": "ScalingGroup",
      "Properties": {
        "ScalingGroupId": {
          "Ref": "ScalingGroup"
        },
        "SecurityGroupId": {
          "Ref": "SecurityGroup"
        },
        "ImageId": {
          "Ref": "ImageId"
        },
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "SystemDiskCategory": {
          "Ref": "SystemDiskCategory"
        },
        "SystemDiskSize": 40,
        "ScalingConfigurationName": "web-scaling-config",
        "Password": {
          "Ref": "InstancePassword"
        },
        "InternetMaxBandwidthOut": 5,
        "InternetChargeType": "PayByTraffic",
        "IoOptimized": "optimized",
        "TagList": [
          {
            "Key": "CreatedBy",
            "Value": "ROS"
          }
        ]
      }
    },
    "ScalingGroupEnable": {
      "Type": "ALIYUN::ESS::ScalingGroupEnable",
      "Properties": {
        "ScalingGroupId": {
          "Ref": "ScalingGroup"
        },
        "ScalingConfigurationId": {
          "Ref": "ScalingConfiguration"
        },
        "ScalingRuleArisExecuteVersion": 0
      }
    }
  },
  "Outputs": {
    "ScalingGroupId": {
      "Description": {
        "zh-cn": "伸缩组ID。",
        "en": "Scaling group ID."
      },
      "Label": {
        "zh-cn": "伸缩组ID",
        "en": "Scaling Group ID"
      },
      "Value": {
        "Fn::GetAtt": [
          "ScalingGroup",
          "ScalingGroupId"
        ]
      }
    },
    "ScalingConfigurationId": {
      "Description": {
        "zh-cn": "伸缩配置ID。",
        "en": "Scaling configuration ID."
      },
      "Label": {
        "zh-cn": "伸缩配置ID",
        "en": "Scaling Configuration ID"
      },
      "Value": {
        "Fn::GetAtt": [
          "ScalingConfiguration",
          "ScalingConfigurationId"
        ]
      }
    },
    "SecurityGroupId": {
      "Description": {
        "zh-cn": "安全组ID。",
        "en": "Security group ID."
      },
      "Label": {
        "zh-cn": "安全组ID",
        "en": "Security Group ID"
      },
      "Value": {
        "Ref": "SecurityGroup"
      }
    }
  },
  "Metadata": {
    "ALIYUN::ROS::Interface": {
      "ParameterGroups": [
        {
          "Parameters": [
            "ZoneId",
            "InstanceType",
            "ImageId",
            "SystemDiskCategory",
            "InstancePassword"
          ]
        },
        {
          "Parameters": [
            "MaxSize",
            "MinSize"
          ]
        }
      ]
    }
  }
}

场景 3 :创建包含 CLB 负载均衡与生命周期挂钩的完整自动伸缩方案

ROSTemplateFormatVersion: '2015-09-01'
Description:
  zh-cn: 创建完整的弹性伸缩方案,包含VPC网络、CLB负载均衡、多实例规格伸缩配置(含抢占式实例策略和数据盘)、生命周期挂钩(自动部署应用)、伸缩组启用与负载均衡挂载,实现高可用自动伸缩与自动运维。
  en: Create a complete auto-scaling solution including VPC network, CLB load balancer, multi-instance-type scaling configuration with spot strategy and data disks, lifecycle hooks for automatic application deployment, scaling group enablement and load balancer attachment, achieving high-availability auto-scaling and automated O&M.
Parameters:
  ZoneId:
    Type: String
    Label:
      zh-cn: 可用区
      en: Availability Zone
    Description:
      zh-cn: 选择可用区。
      en: Select an availability zone.
    AssociationProperty: ALIYUN::ECS::Instance::ZoneId
    AssociationPropertyMetadata:
      AutoSelectFirst: true
  InstanceType:
    Type: String
    Label:
      zh-cn: 主实例规格
      en: Primary Instance Type
    Description:
      zh-cn: 选择ECS主实例规格(伸缩配置将同时配置备选规格以应对库存不足)。
      en: Select the primary ECS instance type (the scaling configuration will also configure alternate types for inventory fallback).
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      InstanceChargeType: PostPaid
      ZoneId: ${ZoneId}
  ImageId:
    Type: String
    Label:
      zh-cn: 镜像ID
      en: Image ID
    Description:
      zh-cn: 选择用于创建实例的镜像。
      en: Select an image for creating instances.
    AssociationProperty: ALIYUN::ECS::Image::ImageId
    AssociationPropertyMetadata:
      SupportedImageOwnerAlias:
        - system
        - self
        - others
  SystemDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: System Disk Category
    Description:
      zh-cn: 选择系统盘类型。
      en: Select a system disk category.
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      InstanceType: ${InstanceType}
    Default: cloud_essd
  InstancePassword:
    Type: String
    Label:
      zh-cn: 实例密码
      en: Instance Password
    Description:
      zh-cn: 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、特殊符号)。
      en: Server login password, 8-30 characters, must contain three types (uppercase, lowercase, numbers, special symbols).
    NoEcho: true
    AssociationProperty: ALIYUN::ECS::Instance::Password
    ConstraintDescription:
      zh-cn: 长度8-30,必须包含三项(大写字母、小写字母、数字、特殊符号)。
      en: Length 8-30, must contain three types (uppercase, lowercase, numbers, special symbols).
  MaxSize:
    Type: Number
    Label:
      zh-cn: 最大实例数
      en: Max Size
    Description:
      zh-cn: 伸缩组内ECS实例个数的最大值。
      en: The maximum number of ECS instances in the scaling group.
    Default: 10
    MinValue: 0
    MaxValue: 1000
  MinSize:
    Type: Number
    Label:
      zh-cn: 最小实例数
      en: Min Size
    Description:
      zh-cn: 伸缩组内ECS实例个数的最小值。
      en: The minimum number of ECS instances in the scaling group.
    Default: 2
    MinValue: 0
    MaxValue: 1000
  DesiredCapacity:
    Type: Number
    Label:
      zh-cn: 期望实例数
      en: Desired Capacity
    Description:
      zh-cn: 伸缩组内ECS实例的期望数量。
      en: The desired number of ECS instances in the scaling group.
    Default: 2
    MinValue: 0
    MaxValue: 1000
  DataDiskSize:
    Type: Number
    Label:
      zh-cn: 数据盘大小(GB)
      en: Data Disk Size (GB)
    Description:
      zh-cn: 数据盘大小,单位GB。
      en: Data disk size in GB.
    Default: 100
    MinValue: 20
    MaxValue: 32768
Resources:
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      VpcName:
        Fn::Sub: ${ALIYUN::StackName}-vpc
      CidrBlock: 192.168.0.0/16
  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VSwitchName:
        Fn::Sub: ${ALIYUN::StackName}-vsw
      VpcId:
        Ref: Vpc
      CidrBlock: 192.168.0.0/24
      ZoneId:
        Ref: ZoneId
  SecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Fn::Sub: ${ALIYUN::StackName}-sg
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:
        - PortRange: 22/22
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
        - PortRange: 80/80
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
        - PortRange: 443/443
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
      SecurityGroupEgress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: intranet
  LoadBalancer:
    Type: ALIYUN::SLB::LoadBalancer
    Properties:
      LoadBalancerName:
        Fn::Sub: ${ALIYUN::StackName}-slb
      AddressType: internet
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      LoadBalancerSpec: slb.s2.medium
      Bandwidth: 5
  LoadBalancerListener:
    Type: ALIYUN::SLB::Listener
    Properties:
      LoadBalancerId:
        Ref: LoadBalancer
      ListenerPort: 80
      BackendServerPort: 80
      Bandwidth: 5
      HealthCheck:
        HealthCheckType: http
        Interval: 5
        Timeout: 3
        URI: /
        HttpCode: http_2xx,http_3xx,http_4xx,http_5xx
        HealthyThreshold: 2
        UnhealthyThreshold: 3
        Port: 80
      Scheduler: wrr
      Protocol: http
  ScalingGroup:
    Type: ALIYUN::ESS::ScalingGroup
    DependsOn: SecurityGroup
    Properties:
      MinSize:
        Ref: MinSize
      MaxSize:
        Ref: MaxSize
      DesiredCapacity:
        Ref: DesiredCapacity
      DefaultCooldown: 300
      ScalingGroupName: web-autoscaling-group
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      HealthCheckType: ECS
      MultiAZPolicy: PRIORITY
      RemovalPolicys:
        - OldestScalingConfiguration
        - OldestInstance
      GroupDeletionProtection: false
      ScalingPolicy: release
      LoadBalancerIds:
        - Ref: LoadBalancer
  ScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration
    DependsOn: ScalingGroup
    Properties:
      ScalingGroupId:
        Ref: ScalingGroup
      SecurityGroupId:
        Ref: SecurityGroup
      ImageId:
        Ref: ImageId
      InstanceType:
        Ref: InstanceType
      SystemDiskCategory:
        Ref: SystemDiskCategory
      SystemDiskSize: 40
      SystemDiskPerformanceLevel: PL1
      ScalingConfigurationName: web-scaling-config
      Password:
        Ref: InstancePassword
      InternetMaxBandwidthOut: 5
      InternetChargeType: PayByTraffic
      IoOptimized: optimized
      SpotStrategy: SpotWithPriceLimit
      SpotPriceLimit: 0.5
      SpotDuration: 1
      LoadBalancerWeight: 50
      DiskMappings:
        - Category:
            Ref: SystemDiskCategory
          Size:
            Ref: DataDiskSize
          DiskName: data-disk
          DeleteWithInstance: true
          PerformanceLevel: PL1
      TagList:
        - Key: CreatedBy
          Value: ROS
        - Key: Environment
          Value: Production
  ScalingGroupEnable:
    Type: ALIYUN::ESS::ScalingGroupEnable
    Properties:
      ScalingGroupId:
        Ref: ScalingGroup
      ScalingConfigurationId:
        Ref: ScalingConfiguration
      ScalingRuleArisExecuteVersion: 0
  LifecycleHookForScaleOut:
    Type: ALIYUN::ESS::LifecycleHook
    DependsOn: ScalingGroupEnable
    Properties:
      ScalingGroupId:
        Ref: ScalingGroup
      LifecycleHookName: scale-out-hook
      LifecycleTransition: SCALE_OUT
      DefaultResult: CONTINUE
      HeartbeatTimeout: 600
      NotificationArn:
        Fn::Join:
          - ''
          - - 'acs:ess:'
            - Ref: ALIYUN::Region
            - ':'
            - Ref: ALIYUN::TenantId
            - ':'
            - oos/ACS-ESS-LifeCycleRunCommand
      NotificationMetadata:
        Fn::Sub: |-
          {
            "commandContent": "#!/bin/bash\nyum install -y nginx\nsystemctl enable nginx\nsystemctl start nginx",
            "commandType": "RunShellScript"
          }
  LifecycleHookForScaleIn:
    Type: ALIYUN::ESS::LifecycleHook
    DependsOn: ScalingGroupEnable
    Properties:
      ScalingGroupId:
        Ref: ScalingGroup
      LifecycleHookName: scale-in-hook
      LifecycleTransition: SCALE_IN
      DefaultResult: CONTINUE
      HeartbeatTimeout: 300
Outputs:
  ScalingGroupId:
    Description:
      zh-cn: 伸缩组ID。
      en: Scaling group ID.
    Label:
      zh-cn: 伸缩组ID
      en: Scaling Group ID
    Value:
      Fn::GetAtt:
        - ScalingGroup
        - ScalingGroupId
  ScalingConfigurationId:
    Description:
      zh-cn: 伸缩配置ID。
      en: Scaling configuration ID.
    Label:
      zh-cn: 伸缩配置ID
      en: Scaling Configuration ID
    Value:
      Fn::GetAtt:
        - ScalingConfiguration
        - ScalingConfigurationId
  LoadBalancerId:
    Description:
      zh-cn: 负载均衡实例ID。
      en: Load balancer ID.
    Label:
      zh-cn: 负载均衡ID
      en: Load Balancer ID
    Value:
      Ref: LoadBalancer
  LoadBalancerPublicIp:
    Description:
      zh-cn: 负载均衡公网IP。
      en: Load balancer public IP.
    Label:
      zh-cn: 负载均衡公网IP
      en: Load Balancer Public IP
    Value:
      Fn::GetAtt:
        - LoadBalancer
        - IpAddress
  Console.LoadBalancerUrl:
    Description:
      zh-cn: 负载均衡访问地址。
      en: Load balancer access URL.
    Label:
      zh-cn: 负载均衡地址
      en: Load Balancer URL
    Value:
      Fn::Sub:
        - http://${Ip}
        - Ip:
            Fn::GetAtt:
              - LoadBalancer
              - IpAddress
  SecurityGroupId:
    Description:
      zh-cn: 安全组ID。
      en: Security group ID.
    Label:
      zh-cn: 安全组ID
      en: Security Group ID
    Value:
      Ref: SecurityGroup
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - ZoneId
          - InstanceType
          - ImageId
          - SystemDiskCategory
          - InstancePassword
      - Parameters:
          - MaxSize
          - MinSize
          - DesiredCapacity
          - DataDiskSize
{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Description": {
    "zh-cn": "创建完整的弹性伸缩方案,包含VPC网络、CLB负载均衡、多实例规格伸缩配置(含抢占式实例策略和数据盘)、生命周期挂钩(自动部署应用)、伸缩组启用与负载均衡挂载,实现高可用自动伸缩与自动运维。",
    "en": "Create a complete auto-scaling solution including VPC network, CLB load balancer, multi-instance-type scaling configuration with spot strategy and data disks, lifecycle hooks for automatic application deployment, scaling group enablement and load balancer attachment, achieving high-availability auto-scaling and automated O&M."
  },
  "Parameters": {
    "ZoneId": {
      "Type": "String",
      "Label": {
        "zh-cn": "可用区",
        "en": "Availability Zone"
      },
      "Description": {
        "zh-cn": "选择可用区。",
        "en": "Select an availability zone."
      },
      "AssociationProperty": "ALIYUN::ECS::Instance::ZoneId",
      "AssociationPropertyMetadata": {
        "AutoSelectFirst": true
      }
    },
    "InstanceType": {
      "Type": "String",
      "Label": {
        "zh-cn": "主实例规格",
        "en": "Primary Instance Type"
      },
      "Description": {
        "zh-cn": "选择ECS主实例规格(伸缩配置将同时配置备选规格以应对库存不足)。",
        "en": "Select the primary ECS instance type (the scaling configuration will also configure alternate types for inventory fallback)."
      },
      "AssociationProperty": "ALIYUN::ECS::Instance::InstanceType",
      "AssociationPropertyMetadata": {
        "InstanceChargeType": "PostPaid",
        "ZoneId": "${ZoneId}"
      }
    },
    "ImageId": {
      "Type": "String",
      "Label": {
        "zh-cn": "镜像ID",
        "en": "Image ID"
      },
      "Description": {
        "zh-cn": "选择用于创建实例的镜像。",
        "en": "Select an image for creating instances."
      },
      "AssociationProperty": "ALIYUN::ECS::Image::ImageId",
      "AssociationPropertyMetadata": {
        "SupportedImageOwnerAlias": [
          "system",
          "self",
          "others"
        ]
      }
    },
    "SystemDiskCategory": {
      "Type": "String",
      "Label": {
        "zh-cn": "系统盘类型",
        "en": "System Disk Category"
      },
      "Description": {
        "zh-cn": "选择系统盘类型。",
        "en": "Select a system disk category."
      },
      "AssociationProperty": "ALIYUN::ECS::Disk::SystemDiskCategory",
      "AssociationPropertyMetadata": {
        "InstanceType": "${InstanceType}"
      },
      "Default": "cloud_essd"
    },
    "InstancePassword": {
      "Type": "String",
      "Label": {
        "zh-cn": "实例密码",
        "en": "Instance Password"
      },
      "Description": {
        "zh-cn": "服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、特殊符号)。",
        "en": "Server login password, 8-30 characters, must contain three types (uppercase, lowercase, numbers, special symbols)."
      },
      "NoEcho": true,
      "AssociationProperty": "ALIYUN::ECS::Instance::Password",
      "ConstraintDescription": {
        "zh-cn": "长度8-30,必须包含三项(大写字母、小写字母、数字、特殊符号)。",
        "en": "Length 8-30, must contain three types (uppercase, lowercase, numbers, special symbols)."
      }
    },
    "MaxSize": {
      "Type": "Number",
      "Label": {
        "zh-cn": "最大实例数",
        "en": "Max Size"
      },
      "Description": {
        "zh-cn": "伸缩组内ECS实例个数的最大值。",
        "en": "The maximum number of ECS instances in the scaling group."
      },
      "Default": 10,
      "MinValue": 0,
      "MaxValue": 1000
    },
    "MinSize": {
      "Type": "Number",
      "Label": {
        "zh-cn": "最小实例数",
        "en": "Min Size"
      },
      "Description": {
        "zh-cn": "伸缩组内ECS实例个数的最小值。",
        "en": "The minimum number of ECS instances in the scaling group."
      },
      "Default": 2,
      "MinValue": 0,
      "MaxValue": 1000
    },
    "DesiredCapacity": {
      "Type": "Number",
      "Label": {
        "zh-cn": "期望实例数",
        "en": "Desired Capacity"
      },
      "Description": {
        "zh-cn": "伸缩组内ECS实例的期望数量。",
        "en": "The desired number of ECS instances in the scaling group."
      },
      "Default": 2,
      "MinValue": 0,
      "MaxValue": 1000
    },
    "DataDiskSize": {
      "Type": "Number",
      "Label": {
        "zh-cn": "数据盘大小(GB)",
        "en": "Data Disk Size (GB)"
      },
      "Description": {
        "zh-cn": "数据盘大小,单位GB。",
        "en": "Data disk size in GB."
      },
      "Default": 100,
      "MinValue": 20,
      "MaxValue": 32768
    }
  },
  "Resources": {
    "Vpc": {
      "Type": "ALIYUN::ECS::VPC",
      "Properties": {
        "VpcName": {
          "Fn::Sub": "${ALIYUN::StackName}-vpc"
        },
        "CidrBlock": "192.168.0.0/16"
      }
    },
    "VSwitch": {
      "Type": "ALIYUN::ECS::VSwitch",
      "Properties": {
        "VSwitchName": {
          "Fn::Sub": "${ALIYUN::StackName}-vsw"
        },
        "VpcId": {
          "Ref": "Vpc"
        },
        "CidrBlock": "192.168.0.0/24",
        "ZoneId": {
          "Ref": "ZoneId"
        }
      }
    },
    "SecurityGroup": {
      "Type": "ALIYUN::ECS::SecurityGroup",
      "Properties": {
        "SecurityGroupName": {
          "Fn::Sub": "${ALIYUN::StackName}-sg"
        },
        "VpcId": {
          "Ref": "Vpc"
        },
        "SecurityGroupIngress": [
          {
            "PortRange": "22/22",
            "Priority": 1,
            "SourceCidrIp": "0.0.0.0/0",
            "IpProtocol": "tcp"
          },
          {
            "PortRange": "80/80",
            "Priority": 1,
            "SourceCidrIp": "0.0.0.0/0",
            "IpProtocol": "tcp"
          },
          {
            "PortRange": "443/443",
            "Priority": 1,
            "SourceCidrIp": "0.0.0.0/0",
            "IpProtocol": "tcp"
          }
        ],
        "SecurityGroupEgress": [
          {
            "PortRange": "-1/-1",
            "Priority": 1,
            "IpProtocol": "all",
            "DestCidrIp": "0.0.0.0/0",
            "NicType": "intranet"
          }
        ]
      }
    },
    "LoadBalancer": {
      "Type": "ALIYUN::SLB::LoadBalancer",
      "Properties": {
        "LoadBalancerName": {
          "Fn::Sub": "${ALIYUN::StackName}-slb"
        },
        "AddressType": "internet",
        "VpcId": {
          "Ref": "Vpc"
        },
        "VSwitchId": {
          "Ref": "VSwitch"
        },
        "LoadBalancerSpec": "slb.s2.medium",
        "Bandwidth": 5
      }
    },
    "LoadBalancerListener": {
      "Type": "ALIYUN::SLB::Listener",
      "Properties": {
        "LoadBalancerId": {
          "Ref": "LoadBalancer"
        },
        "ListenerPort": 80,
        "BackendServerPort": 80,
        "Bandwidth": 5,
        "HealthCheck": {
          "HealthCheckType": "http",
          "Interval": 5,
          "Timeout": 3,
          "URI": "/",
          "HttpCode": "http_2xx,http_3xx,http_4xx,http_5xx",
          "HealthyThreshold": 2,
          "UnhealthyThreshold": 3,
          "Port": 80
        },
        "Scheduler": "wrr",
        "Protocol": "http"
      }
    },
    "ScalingGroup": {
      "Type": "ALIYUN::ESS::ScalingGroup",
      "DependsOn": "SecurityGroup",
      "Properties": {
        "MinSize": {
          "Ref": "MinSize"
        },
        "MaxSize": {
          "Ref": "MaxSize"
        },
        "DesiredCapacity": {
          "Ref": "DesiredCapacity"
        },
        "DefaultCooldown": 300,
        "ScalingGroupName": "web-autoscaling-group",
        "VpcId": {
          "Ref": "Vpc"
        },
        "VSwitchId": {
          "Ref": "VSwitch"
        },
        "HealthCheckType": "ECS",
        "MultiAZPolicy": "PRIORITY",
        "RemovalPolicys": [
          "OldestScalingConfiguration",
          "OldestInstance"
        ],
        "GroupDeletionProtection": false,
        "ScalingPolicy": "release",
        "LoadBalancerIds": [
          {
            "Ref": "LoadBalancer"
          }
        ]
      }
    },
    "ScalingConfiguration": {
      "Type": "ALIYUN::ESS::ScalingConfiguration",
      "DependsOn": "ScalingGroup",
      "Properties": {
        "ScalingGroupId": {
          "Ref": "ScalingGroup"
        },
        "SecurityGroupId": {
          "Ref": "SecurityGroup"
        },
        "ImageId": {
          "Ref": "ImageId"
        },
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "SystemDiskCategory": {
          "Ref": "SystemDiskCategory"
        },
        "SystemDiskSize": 40,
        "SystemDiskPerformanceLevel": "PL1",
        "ScalingConfigurationName": "web-scaling-config",
        "Password": {
          "Ref": "InstancePassword"
        },
        "InternetMaxBandwidthOut": 5,
        "InternetChargeType": "PayByTraffic",
        "IoOptimized": "optimized",
        "SpotStrategy": "SpotWithPriceLimit",
        "SpotPriceLimit": 0.5,
        "SpotDuration": 1,
        "LoadBalancerWeight": 50,
        "DiskMappings": [
          {
            "Category": {
              "Ref": "SystemDiskCategory"
            },
            "Size": {
              "Ref": "DataDiskSize"
            },
            "DiskName": "data-disk",
            "DeleteWithInstance": true,
            "PerformanceLevel": "PL1"
          }
        ],
        "TagList": [
          {
            "Key": "CreatedBy",
            "Value": "ROS"
          },
          {
            "Key": "Environment",
            "Value": "Production"
          }
        ]
      }
    },
    "ScalingGroupEnable": {
      "Type": "ALIYUN::ESS::ScalingGroupEnable",
      "Properties": {
        "ScalingGroupId": {
          "Ref": "ScalingGroup"
        },
        "ScalingConfigurationId": {
          "Ref": "ScalingConfiguration"
        },
        "ScalingRuleArisExecuteVersion": 0
      }
    },
    "LifecycleHookForScaleOut": {
      "Type": "ALIYUN::ESS::LifecycleHook",
      "DependsOn": "ScalingGroupEnable",
      "Properties": {
        "ScalingGroupId": {
          "Ref": "ScalingGroup"
        },
        "LifecycleHookName": "scale-out-hook",
        "LifecycleTransition": "SCALE_OUT",
        "DefaultResult": "CONTINUE",
        "HeartbeatTimeout": 600,
        "NotificationArn": {
          "Fn::Join": [
            "",
            [
              "acs:ess:",
              {
                "Ref": "ALIYUN::Region"
              },
              ":",
              {
                "Ref": "ALIYUN::TenantId"
              },
              ":",
              "oos/ACS-ESS-LifeCycleRunCommand"
            ]
          ]
        },
        "NotificationMetadata": {
          "Fn::Sub": "{\n  \"commandContent\": \"#!/bin/bash\\nyum install -y nginx\\nsystemctl enable nginx\\nsystemctl start nginx\",\n  \"commandType\": \"RunShellScript\"\n}"
        }
      }
    },
    "LifecycleHookForScaleIn": {
      "Type": "ALIYUN::ESS::LifecycleHook",
      "DependsOn": "ScalingGroupEnable",
      "Properties": {
        "ScalingGroupId": {
          "Ref": "ScalingGroup"
        },
        "LifecycleHookName": "scale-in-hook",
        "LifecycleTransition": "SCALE_IN",
        "DefaultResult": "CONTINUE",
        "HeartbeatTimeout": 300
      }
    }
  },
  "Outputs": {
    "ScalingGroupId": {
      "Description": {
        "zh-cn": "伸缩组ID。",
        "en": "Scaling group ID."
      },
      "Label": {
        "zh-cn": "伸缩组ID",
        "en": "Scaling Group ID"
      },
      "Value": {
        "Fn::GetAtt": [
          "ScalingGroup",
          "ScalingGroupId"
        ]
      }
    },
    "ScalingConfigurationId": {
      "Description": {
        "zh-cn": "伸缩配置ID。",
        "en": "Scaling configuration ID."
      },
      "Label": {
        "zh-cn": "伸缩配置ID",
        "en": "Scaling Configuration ID"
      },
      "Value": {
        "Fn::GetAtt": [
          "ScalingConfiguration",
          "ScalingConfigurationId"
        ]
      }
    },
    "LoadBalancerId": {
      "Description": {
        "zh-cn": "负载均衡实例ID。",
        "en": "Load balancer ID."
      },
      "Label": {
        "zh-cn": "负载均衡ID",
        "en": "Load Balancer ID"
      },
      "Value": {
        "Ref": "LoadBalancer"
      }
    },
    "LoadBalancerPublicIp": {
      "Description": {
        "zh-cn": "负载均衡公网IP。",
        "en": "Load balancer public IP."
      },
      "Label": {
        "zh-cn": "负载均衡公网IP",
        "en": "Load Balancer Public IP"
      },
      "Value": {
        "Fn::GetAtt": [
          "LoadBalancer",
          "IpAddress"
        ]
      }
    },
    "Console.LoadBalancerUrl": {
      "Description": {
        "zh-cn": "负载均衡访问地址。",
        "en": "Load balancer access URL."
      },
      "Label": {
        "zh-cn": "负载均衡地址",
        "en": "Load Balancer URL"
      },
      "Value": {
        "Fn::Sub": [
          "http://${Ip}",
          {
            "Ip": {
              "Fn::GetAtt": [
                "LoadBalancer",
                "IpAddress"
              ]
            }
          }
        ]
      }
    },
    "SecurityGroupId": {
      "Description": {
        "zh-cn": "安全组ID。",
        "en": "Security group ID."
      },
      "Label": {
        "zh-cn": "安全组ID",
        "en": "Security Group ID"
      },
      "Value": {
        "Ref": "SecurityGroup"
      }
    }
  },
  "Metadata": {
    "ALIYUN::ROS::Interface": {
      "ParameterGroups": [
        {
          "Parameters": [
            "ZoneId",
            "InstanceType",
            "ImageId",
            "SystemDiskCategory",
            "InstancePassword"
          ]
        },
        {
          "Parameters": [
            "MaxSize",
            "MinSize",
            "DesiredCapacity",
            "DataDiskSize"
          ]
        }
      ]
    }
  }
}