本文以使用伸縮組管理多台Elastic Compute Service為例,由簡入難地向您介紹如何編輯ROS模板。
方案概述
本方案使用阿里雲Resource Orchestration Service服務(ROS)通過 YAML 模板,一次性建立 VPC 網路、多台 ECS 執行個體和Auto Scaling組(ESS),並將 ECS 執行個體納入伸縮組管理,實現根據業務負載自動擴容或縮容。適用於需要彈性管理伺服器叢集的 Web 應用程式、微服務等情境。
業務情境
在阿里雲Virtual Private Cloud中大量建立 ECS 執行個體並加入伸縮組,配置伸縮規則後,伸縮組可根據業務負載自動增減 ECS 執行個體數量,實現伺服器叢集的彈性管理。
建立的資源清單
序號 | 資源名稱 | ROS 資源類型 | 用途說明 |
1 | Virtual Private Cloud |
| 提供隔離的網路環境。 |
2 | 交換器 |
| 在 VPC 中劃分子網網段,指定可用性區域。 |
3 | 安全性群組 |
| 控制 ECS 的網路訪問規則(入站/出站)。 |
4 | ECS 執行個體組 |
| 大量建立多台 ECS 雲端服務器(初始節點)。 |
5 | 伸縮組 |
| 管理 ECS 執行個體的Auto Scaling策略(最小/最大執行個體數)。 |
6 | 伸縮配置 |
| 定義伸縮組擴容時建立 ECS 的規格模板。 |
7 | 伸縮組啟用 |
| 啟用伸縮組並將已有 ECS 執行個體加入伸縮組。 |
部署完成後獲得的結果
模板成功執行後,將獲得:
一個完整的 VPC 網路環境(包含 VPC、交換器、安全性群組)。
一組 ECS 雲端服務器執行個體(數量由參數
ECSInstanceGroupCount指定,預設 3 台)。一個已啟用的Auto Scaling組,包含伸縮配置,可根據負載自動擴容至最大執行個體數。
所有 ECS 執行個體已自動加入伸縮組統一管理。
架構圖

前提條件
在使用本模板前,請確認以下條件:
帳號許可權:阿里雲帳號需具有以下產品的建立許可權:ECS、ESS(Auto Scaling)、VPC。
基礎知識:瞭解 ROS 模板的基本文法和結構,請參見模板快速入門。
模板編寫教程
本教程分兩個階段示範模板編寫過程:
階段一(基礎版):使用固定參數值,專註於理解資源定義和依賴關係。
階段二(進階版):參數化所有可變更配置置,添加動態參數篩選和參數分組。
階段一:基礎模板——定義資源及其依賴關係
Step 1:定義基礎網路資源(VPC + VSwitch + 安全性群組)
網路資源是所有其他資源的基礎,需要最先建立。
Resources:
# ============================================================
# 基礎網路層:VPC → VSwitch → SecurityGroup
# ============================================================
Vpc:
Type: ALIYUN::ECS::VPC # 建立專用網路
Properties:
CidrBlock: 192.168.0.0/16 # VPC位址區段,可容納65534個內網IP
VpcName:
Ref: ALIYUN::StackName # 偽參數:使用資源棧名稱作為VPC名稱
VSwitch:
Type: ALIYUN::ECS::VSwitch # 在VPC中建立交換器(子網)
Properties:
VSwitchName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc # Ref引用資源:返回Vpc的VpcId(隱式依賴,ROS會先建立Vpc)
ZoneId: cn-beijing-h # 此情境以北京H可用性區域為樣本
CidrBlock: 192.168.0.0/24 # 子網位址區段,必須是VPC位址區段的子集
EcsSecurityGroup:
Type: ALIYUN::ECS::SecurityGroup # 建立安全性群組
Properties:
SecurityGroupName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc # 安全性群組綁定到同一VPC
# 入站規則:為簡化樣本開放所有入站流量,生產環境請按需收緊連接埠
SecurityGroupIngress:
- PortRange: '-1/-1'
Priority: 1
IpProtocol: all
SourceCidrIp: 0.0.0.0/0
NicType: intranet關鍵知識點:
類似
VpcName、VSwitchName、SecurityGroupName這類自訂配置可以使用偽參數進行配置,這樣可以在部署資源後快速找到屬於該資源棧部署的相關資源。SecurityGroup的訪問規則可以根據業務需求自訂配置,例如:需要在外部存取 Web 服務,可配置開啟安全性群組入方向的 HTTP 80 或 8080 連接埠訪問。
需要 SSH 登入伺服器,可配置開啟安全性群組入方向的 22 連接埠訪問。
Step 2:定義 ECS 執行個體組資源
使用 ALIYUN::ECS::InstanceGroup 可以一次建立多台相同配置的 ECS 執行個體,比多次使用 ALIYUN::ECS::Instance 更高效。
Resources:
# ============================================================
# 計算層:大量建立ECS執行個體
# ============================================================
EcsInstanceGroup:
Type: ALIYUN::ECS::InstanceGroup # 大量建立ECS執行個體
Properties:
VpcId:
Ref: Vpc
SecurityGroupId:
Ref: EcsSecurityGroup
VSwitchId:
Ref: VSwitch
ImageId: centos_7_9_x64_20G_alibase_20220727.vhd # CentOS 7.9鏡像
AllocatePublicIP: false # 不分配公網IP
InstanceType: ecs.c5.large # 執行個體規格:2vCPU 4GiB
SystemDiskSize: 200 # 系統硬碟200GiB
SystemDiskCategory: cloud_essd # ESSD雲端硬碟
MaxAmount: 3 # 建立3台ECS執行個體
Password: <YourPassword> # 部署時請替換為實際密碼(需含大小寫字母+數字+特殊字元)
InstanceName: # 執行個體名稱:使用棧名+序號,如 mystack-0001
Fn::Sub:
- ${StackName}-[1,4]
- StackName:
Ref: ALIYUN::StackName關鍵知識點與思考:
ALIYUN::ECS::InstanceGroup通過MaxAmount屬性指定建立的 ECS 執行個體數量。Fn::Sub函數用於字串拼接,[1,4]是 ROS 特有的序號預留位置,表示 4 位元字從 1 遞增(如 0001、0002...)。該資源的輸出屬性
InstanceIds是一個 ECS 執行個體 ID 列表,可被伸縮組引用。
Step 3:定義伸縮組資源(伸縮組 + 伸縮配置 + 啟用伸縮配置)
伸縮組由三個資源協同工作:ScalingGroup 定義伸縮策略,ScalingConfiguration 定義擴容時的 ECS 模板,ScalingGroupEnable 啟用伸縮組並加入已有執行個體。
Resources:
# ============================================================
# Auto Scaling層:伸縮組 + 伸縮配置 + 啟用伸縮組
# ============================================================
EssInstanceScalingGroup:
Type: ALIYUN::ESS::ScalingGroup # 建立伸縮組
Properties:
ScalingGroupName:
Ref: ALIYUN::StackName
RemovalPolicys:
- NewestInstance # 縮容策略:優先移除最新建立的執行個體
MinSize: 3 # 伸縮組最少保持3台執行個體
MaxSize: 50 # 伸縮組最多可擴容至50台執行個體
VSwitchId:
Ref: VSwitch # 伸縮組綁定交換器(決定擴容執行個體的網路位置)
DefaultCooldown: 300 # 冷卻時間300秒,避免頻繁觸發伸縮
EssInstanceScalingConfiguration:
Type: ALIYUN::ESS::ScalingConfiguration # 伸縮配置(擴容時的ECS模板)
Properties:
SecurityGroupId:
Ref: EcsSecurityGroup
ScalingGroupId:
Ref: EssInstanceScalingGroup # 關聯到上方的伸縮組
ScalingConfigurationName:
Fn::Sub: sc-${ALIYUN::StackName} # Fn::Sub直接替換偽參數變數
InstanceType: ecs.c5.large # 擴容時建立的ECS規格(應與初始ECS一致)
SystemDiskCategory: cloud_essd
SystemDiskSize: 200
ImageId: centos_7_9_x64_20G_alibase_20220727.vhd # 擴容時使用的鏡像(應與初始ECS一致)
EssInstanceScalingGroupEnable:
Type: ALIYUN::ESS::ScalingGroupEnable # 啟用伸縮組
Properties:
ScalingRuleArisExecuteVersion: '1'
ScalingConfigurationId:
Ref: EssInstanceScalingConfiguration # 指定生效的伸縮配置
InstanceIds:
# 將Step 2中建立的ECS執行個體加入伸縮組
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds # 擷取InstanceGroup的所有執行個體ID列表
ScalingGroupId:
Ref: EssInstanceScalingGroup關鍵知識點與思考:
伸縮組的
MinSize建議與ECSInstanceGroupCount(初始建立的執行個體數)保持一致,避免啟用後立即觸發縮容。可以為伸縮組添加伸縮規則(ALIYUN::ESS::ScalingRule)和警示觸發器(ALIYUN::ESS::AlarmTask),實現基於 CPU/記憶體等指標的自動調整。
Ref和Fn::GetAtt的區別:Ref返回資源的主標識符(如 VPC 的VpcId)。Fn::GetAtt返回資源的相關屬性(如EcsInstanceGroup的InstanceIds)。
基礎版完整模板
以下是將上述三個步驟合并後的完整可用模板:
ROSTemplateFormatVersion: '2015-09-01'
Description:
zh-cn: 建立VPC網路環境,批量部署ECS執行個體並加入伸縮組,實現彈性擴縮容管理
en: Create VPC network, deploy ECS instance group and manage them with ESS scaling group
Resources:
# === 基礎網路層 ===
Vpc:
Type: ALIYUN::ECS::VPC
Properties:
CidrBlock: 192.168.0.0/16
VpcName:
Ref: ALIYUN::StackName
VSwitch:
Type: ALIYUN::ECS::VSwitch
Properties:
VSwitchName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc
ZoneId: cn-beijing-h
CidrBlock: 192.168.0.0/24
EcsSecurityGroup:
Type: ALIYUN::ECS::SecurityGroup
Properties:
SecurityGroupName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc
# 入站規則:為簡化樣本開放所有入站流量,生產環境請按需收緊連接埠
SecurityGroupIngress:
- PortRange: '-1/-1'
Priority: 1
IpProtocol: all
SourceCidrIp: 0.0.0.0/0
NicType: intranet
# === 計算層 ===
EcsInstanceGroup:
Type: ALIYUN::ECS::InstanceGroup
Properties:
VpcId:
Ref: Vpc
SecurityGroupId:
Ref: EcsSecurityGroup
VSwitchId:
Ref: VSwitch
ImageId: centos_7_9_x64_20G_alibase_20220727.vhd
AllocatePublicIP: false
InstanceType: ecs.c5.large
SystemDiskSize: 200
SystemDiskCategory: cloud_essd
MaxAmount: 3
Password: <YourPassword> # 部署時請替換為實際密碼
InstanceName:
Fn::Sub:
- ${StackName}-[1,4]
- StackName:
Ref: ALIYUN::StackName
# === Auto Scaling層 ===
EssInstanceScalingGroup:
Type: ALIYUN::ESS::ScalingGroup
Properties:
ScalingGroupName:
Ref: ALIYUN::StackName
RemovalPolicys:
- NewestInstance
MinSize: 3
MaxSize: 50
VSwitchId:
Ref: VSwitch
DefaultCooldown: 300
EssInstanceScalingConfiguration:
Type: ALIYUN::ESS::ScalingConfiguration
Properties:
SecurityGroupId:
Ref: EcsSecurityGroup
ScalingGroupId:
Ref: EssInstanceScalingGroup
ScalingConfigurationName:
Fn::Sub: sc-${ALIYUN::StackName}
InstanceType: ecs.c5.large
SystemDiskCategory: cloud_essd
SystemDiskSize: 200
ImageId: centos_7_9_x64_20G_alibase_20220727.vhd
EssInstanceScalingGroupEnable:
Type: ALIYUN::ESS::ScalingGroupEnable
Properties:
ScalingRuleArisExecuteVersion: '1'
ScalingConfigurationId:
Ref: EssInstanceScalingConfiguration
InstanceIds:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
ScalingGroupId:
Ref: EssInstanceScalingGroup
Outputs:
ECSInstanceIds:
Label: ECS 執行個體 ID 列表
Value:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds關鍵知識點與思考:
模板建立完資源後,可以通過模板的 Outputs 資訊直接查詢對應資源的內部屬性資訊,例如 ECS 執行個體 ID 列表。
階段二:進階模板——參數化與動態配置
基礎版模板中 ECS 的 InstanceType、SystemDiskCategory、ImageId 和伸縮組的 MaxSize 等屬性使用了固定值。當需要在不同地區或不同規格下複用模板時,需要多次修改模板內容。而模板中多個參數之間往往存在依賴關係。例如:ECS 執行個體規格受限於可用性區域(不同可用性區域有不同規格庫存),系統硬碟類型又同時受限於可用性區域和執行個體規格。如果手動填寫這些參數,很容易選到停用組合,導致部署失敗。
通過以下最佳化,可以大幅提高模板的靈活性和可複用性:
參數化(Parameters):將可變更配置置抽取為參數,部署時動態填寫。
動態參數篩選(AssociationProperty):讓 ROS 控制台根據已選參數自動過濾可用選項。
參數分組(Metadata):在控制台上按邏輯分組展示參數,提升填寫體驗。
參數依賴關係圖
以下以 ECS 執行個體規格、系統硬碟類型為例,展示參數之間的依賴鏈路:
VSwitchZoneId(可用性區域) ← 基礎參數,無前置依賴
├──→ ECSInstanceType(ECS執行個體規格)
│ 依賴:ZoneId
│
└──→ ECSDiskCategory(系統硬碟類型)
依賴:ZoneId + InstanceType核心思路:先選可用性區域,再據此篩選 ECS 規格,最後根據可用性區域 + ECS 規格篩選磁碟類型。每一步都只展示當前條件下可用的選項,避免無效組合。
參數 AssociationProperty 原理詳解
1. VSwitchZoneId — 可用性區域(基礎參數)
定義 AssociationProperty 為 ALIYUN::ECS::ZoneId 列出當前地區下所有可用性區域。樣本:
VSwitchZoneId:
Type: String
Label:
zh-cn: 交換器可用性區域
en: VSwitch Availability Zone
Description:
zh-cn: 選擇交換器所在的可用性區域,ECS和伸縮組將部署在此可用性區域
en: Select the availability zone for VSwitch, ECS and scaling group will be deployed here
AssociationProperty: ALIYUN::ECS::ZoneId此參數是後續所有參數的篩選基礎,選擇特定可用性區域後,其他參數的選項列表會隨之更新。
2. ECSInstanceType — ECS 執行個體規格
定義 AssociationProperty 為 ALIYUN::ECS::Instance::InstanceType 列出可用的 ECS 執行個體規格,並通過關聯 ${VSwitchZoneId} 篩選對應可用性區域下可用的執行個體規格。樣本:
ECSInstanceType:
Type: String
Label:
zh-cn: ECS執行個體規格
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${VSwitchZoneId}不同可用性區域的執行個體規格庫存不同。如果不過濾,可能選到該可用性區域無貨的規格,導致建立失敗。
3. ECSDiskCategory — 系統硬碟類型
定義 AssociationProperty 為 ALIYUN::ECS::Disk::SystemDiskCategory 列出可選的系統硬碟類型,並通過關聯 ${VSwitchZoneId} 和 ${ECSInstanceType} 篩選對應可用性區域與 ECS 執行個體規格支援使用的 ECS 系統硬碟類型。樣本:
ECSDiskCategory:
Type: String
Description:
zh-cn: 選擇系統硬碟類型。可選值:cloud_essd(ESSD雲端硬碟)、cloud_ssd(SSD雲端硬碟)、cloud_efficiency(高效雲端硬碟)
en: "System disk type. Options: cloud_essd, cloud_ssd, cloud_efficiency"
AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
AssociationPropertyMetadata:
ZoneId: ${VSwitchZoneId}
InstanceType: ${ECSInstanceType}
Label:
en: System Disk Type
zh-cn: 系統硬碟類型系統硬碟類型的可用性同時取決於可用性區域(某些可用性區域不支援 ESSD)和執行個體規格(某些規格僅支援特定磁碟類型)。
動態參數篩選樣本
以動態擷取 ECS 執行個體規格與磁碟類型為例,配置 AssociationProperty 後的效果:
Parameters:
VSwitchZoneId:
Type: String
Label:
zh-cn: 交換器可用性區域
en: VSwitch Availability Zone
Description:
zh-cn: 選擇交換器所在的可用性區域,ECS和伸縮組將部署在此可用性區域
en: Select the availability zone for VSwitch, ECS and scaling group will be deployed here
AssociationProperty: ALIYUN::ECS::ZoneId
ECSInstanceType:
Type: String
Label:
zh-cn: ECS執行個體規格
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${VSwitchZoneId}
ECSDiskCategory:
Type: String
Label:
zh-cn: 系統硬碟類型
en: System Disk Category
Description:
zh-cn: 選擇系統硬碟類型。可選值:cloud_essd(ESSD雲端硬碟)、cloud_ssd(SSD雲端硬碟)、cloud_efficiency(高效雲端硬碟)
en: "System disk type. Options: cloud_essd, cloud_ssd, cloud_efficiency"
AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
AssociationPropertyMetadata:
ZoneId: ${VSwitchZoneId}
InstanceType: ${ECSInstanceType}參數 AssociationProperty 工作原理總結
使用者在 ROS 控制台建立資源棧時,參數的選擇過程是級聯觸發的:
選擇可用性區域(
VSwitchZoneId)。ECS 執行個體規格下拉框自動重新整理,僅顯示該可用性區域有庫存的規格。
選擇 ECS 執行個體規格後,系統硬碟類型下拉框自動重新整理,僅顯示該可用性區域與該規格共同支援的磁碟類型。
這樣,每一步選擇都只展示當前條件下可用的選項,從源頭避免因參數組合無效導致的部署失敗。
Metadata 參數分組
通過 Metadata 中的 ALIYUN::ROS::Interface 配置,可以將參數按邏輯分成多個組,每組帶一個標題,控制台上會分組展示,填寫體驗大幅提升。
Metadata 文法結構
Metadata:
ALIYUN::ROS::Interface:
ParameterGroups: # 參數分組列表(必填)
- Parameters: # 該組包含的參數名列表(必填)
- 參數名1
- 參數名2
Label: # 分組標題(必填)
default:
zh-cn: 中文標題
en: English TitleMetadata 文法規則:
ParameterGroups、Parameters、Label都是必填項。Parameters中列出的參數名必須與模板Parameters段中定義的參數名完全一致。未出現在任何分組中的參數,會在控制台顯示在未分組地區。
本情境的分組設計
本模板將 9 個參數按資源類型分成 3 個組:
┌─────────────────────────────────────────────┐
│ 基礎網路設定 │
│ ├── 交換器可用性區域 (VSwitchZoneId) │
│ ├── VPC網段 (VpcCidrBlock) │
│ └── 交換器網段 (VSwitchCidrBlock) │
├─────────────────────────────────────────────┤
│ ECS執行個體配置 │
│ ├── ECS執行個體規格 (ECSInstanceType) │
│ ├── ECS鏡像ID (ECSImageId) │
│ ├── 系統硬碟類型 (ECSDiskCategory) │
│ ├── ECS執行個體密碼 (EcsInstancePassword) │
│ └── ECS執行個體組數量 (ECSInstanceGroupCount) │
├─────────────────────────────────────────────┤
│ ESS伸縮組配置 │
│ └── 伸縮組最大執行個體數 (ESSGroupMaxSize) │
└─────────────────────────────────────────────┘Metadata 分組模板樣本
Metadata:
ALIYUN::ROS::Interface:
ParameterGroups:
- Parameters:
- VSwitchZoneId
- VpcCidrBlock
- VSwitchCidrBlock
Label:
default:
zh-cn: 基礎網路設定
en: Network Configuration
- Parameters:
- ECSInstanceType
- ECSDiskCategory
- ECSImageId
- EcsInstancePassword
- ECSInstanceGroupCount
Label:
default:
zh-cn: ECS執行個體配置
en: ECS Instance Configuration
- Parameters:
- ESSGroupMaxSize
Label:
default:
zh-cn: ESS伸縮組配置
en: Scaling Group Configuration進階版完整模板
ROSTemplateFormatVersion: '2015-09-01'
Description:
zh-cn: >-
參數化模板:大量建立ECS執行個體並通過Auto Scaling組管理,支援自動擴縮容。
支援動態選擇可用性區域、執行個體規格、磁碟類型和鏡像,適用於多地區複用。
en: >-
Parameterized template: Create ECS instance group managed by ESS scaling group.
Supports dynamic selection of zone, instance type, disk category and image.
Parameters:
# ─── 基礎網路參數 ───
VSwitchZoneId:
Type: String
Label:
zh-cn: 交換器可用性區域
en: VSwitch Availability Zone
Description:
zh-cn: 選擇交換器所在的可用性區域,ECS和伸縮組將部署在此可用性區域
en: Select the availability zone for VSwitch, ECS and scaling group will be deployed here
AssociationProperty: ALIYUN::ECS::ZoneId
VpcCidrBlock:
Type: String
Label:
zh-cn: VPC網段
en: VPC CIDR Block
Description:
zh-cn: VPC的IP位址區段範圍。推薦使用 10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16
en: VPC IP address range. Recommended 10.0.0.0/8, 172.16.0.0/12, or 192.168.0.0/16
Default: 192.168.0.0/16
VSwitchCidrBlock:
Type: String
Label:
zh-cn: 交換器網段
en: VSwitch CIDR Block
Description:
zh-cn: 必須是VPC網段的子網段,且不能與同VPC下其他交換器網段重疊
en: Must be a subnet of VPC CIDR and not overlap with other VSwitches
Default: 192.168.0.0/24
# ─── ECS執行個體參數 ───
ECSInstanceType:
Type: String
Label:
zh-cn: ECS執行個體規格
en: ECS Instance Type
Description:
zh-cn: 選擇ECS執行個體規格。列表已根據可用性區域自動過濾可用規格。
en: Select ECS instance type. List is filtered by selected availability zone.
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${VSwitchZoneId}
ECSDiskCategory:
Type: String
Label:
zh-cn: 系統硬碟類型
en: System Disk Category
Description:
zh-cn: 選擇系統硬碟類型。可選值:cloud_essd(ESSD雲端硬碟)、cloud_ssd(SSD雲端硬碟)、cloud_efficiency(高效雲端硬碟)
en: "System disk type. Options: cloud_essd, cloud_ssd, cloud_efficiency"
AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
AssociationPropertyMetadata:
ZoneId: ${VSwitchZoneId}
InstanceType: ${ECSInstanceType}
ECSImageId:
Type: String
Label:
zh-cn: ECS鏡像ID
en: Image ID
Description:
zh-cn: 選擇ECS執行個體使用的作業系統鏡像
en: Select the OS image for ECS instances
AssociationProperty: ALIYUN::ECS::Image::ImageId
ECSInstanceGroupCount:
Type: Number
Label:
zh-cn: ECS初始執行個體數量
en: Initial Instance Count
Description:
zh-cn: 初始建立的ECS執行個體數量,這些執行個體將加入伸縮組管理
en: Number of ECS instances to create initially, they will be added to scaling group
Default: 3
EcsInstancePassword:
Type: String
NoEcho: true
Label:
zh-cn: ECS執行個體密碼
en: ECS Instance Password
Description:
zh-cn: 長度8-30位,需包含大寫字母、小寫字母、數字、特殊字元中的至少三種
en: Length 8-30, must contain at least three of uppercase, lowercase, digits, special characters
MinLength: 8
MaxLength: 30
AssociationProperty: ALIYUN::ECS::Instance::Password
# ─── 伸縮組參數 ───
ESSGroupMaxSize:
Type: Number
Label:
zh-cn: 伸縮組最大執行個體數
en: Scaling Group Max Size
Description:
zh-cn: 伸縮組內ECS執行個體的最大數量,達到此上限後不再自動擴容
en: Maximum number of ECS instances in scaling group
Default: 50
Resources:
# === 基礎網路層 ===
Vpc:
Type: ALIYUN::ECS::VPC
Properties:
CidrBlock:
Ref: VpcCidrBlock
VpcName:
Ref: ALIYUN::StackName
VSwitch:
Type: ALIYUN::ECS::VSwitch
Properties:
VSwitchName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc
ZoneId:
Ref: VSwitchZoneId
CidrBlock:
Ref: VSwitchCidrBlock
EcsSecurityGroup:
Type: ALIYUN::ECS::SecurityGroup
Properties:
SecurityGroupName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc
# 入站規則:僅開放8080連接埠(Web應用),生產環境請根據業務需求調整
SecurityGroupIngress:
- PortRange: 8080/8080
Priority: 1
SourceCidrIp: 0.0.0.0/0
IpProtocol: tcp
NicType: internet
SecurityGroupEgress:
- PortRange: '-1/-1'
Priority: 1
IpProtocol: all
DestCidrIp: 0.0.0.0/0
NicType: internet
- PortRange: '-1/-1'
Priority: 1
IpProtocol: all
DestCidrIp: 0.0.0.0/0
NicType: intranet
# === 計算層 ===
EcsInstanceGroup:
Type: ALIYUN::ECS::InstanceGroup
Properties:
InstanceName:
Fn::Sub:
- ${StackName}-[1,4]
- StackName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc
VSwitchId:
Ref: VSwitch
SecurityGroupId:
Ref: EcsSecurityGroup
SystemDiskCategory:
Ref: ECSDiskCategory
SystemDiskSize: 200
MaxAmount:
Ref: ECSInstanceGroupCount
ImageId:
Ref: ECSImageId
InstanceType:
Ref: ECSInstanceType
Password:
Ref: EcsInstancePassword
AllocatePublicIP: false
# === Auto Scaling層 ===
EssInstanceScalingGroup:
Type: ALIYUN::ESS::ScalingGroup
Properties:
ScalingGroupName:
Ref: ALIYUN::StackName
RemovalPolicys:
- NewestInstance
MinSize:
Ref: ECSInstanceGroupCount
MaxSize:
Ref: ESSGroupMaxSize
VSwitchId:
Ref: VSwitch
DefaultCooldown: 300
EssInstanceScalingConfiguration:
Type: ALIYUN::ESS::ScalingConfiguration
Properties:
SecurityGroupId:
Ref: EcsSecurityGroup
ScalingGroupId:
Ref: EssInstanceScalingGroup
ScalingConfigurationName:
Fn::Sub: sc-${ALIYUN::StackName}
InstanceType:
Ref: ECSInstanceType
SystemDiskCategory:
Ref: ECSDiskCategory
SystemDiskSize: 200
ImageId:
Ref: ECSImageId
InstanceName:
Fn::Sub:
- ${StackName}-[index,1,4]
- StackName:
Ref: ALIYUN::StackName
EssInstanceScalingGroupEnable:
Type: ALIYUN::ESS::ScalingGroupEnable
Properties:
ScalingRuleArisExecuteVersion: '1'
ScalingConfigurationId:
Ref: EssInstanceScalingConfiguration
InstanceIds:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
ScalingGroupId:
Ref: EssInstanceScalingGroup
Outputs:
ECSInstanceIds:
Label: ECS 執行個體 ID 列表
Value:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
# === 中繼資料:控制台參數分組配置 ===
Metadata:
ALIYUN::ROS::Interface:
ParameterGroups:
- Parameters:
- VSwitchZoneId
- VpcCidrBlock
- VSwitchCidrBlock
Label:
default:
zh-cn: 基礎網路設定
en: Network Configuration
- Parameters:
- ECSInstanceType
- ECSDiskCategory
- ECSImageId
- EcsInstancePassword
- ECSInstanceGroupCount
Label:
default:
zh-cn: ECS執行個體配置
en: ECS Instance Configuration
- Parameters:
- ESSGroupMaxSize
Label:
default:
zh-cn: 伸縮組配置
en: Scaling Group Configuration本模板使用的 ROS 內建函數速查
函數 | 文法樣本 | 本模板中的用途 | 詳細說明 |
|
| 引用參數值或資源主標識符。 | 引用 Parameter 返回參數值;引用 Resource 返回其主標識符。 |
|
| 擷取 ECS 執行個體組的執行個體 ID 列表。 | 擷取資源建立後的輸出屬性(非主標識符)。 |
|
| 拼接伸縮配置名稱。 | 模板字串中用 |
部署環節
部署參數
必需輸入參數(部署時需填寫)
參數名 | 說明 | 約束 |
| 可用性區域 ID。 | 控制台動態選擇。 |
| ECS 執行個體規格。 | 根據可用性區域自動過濾可用規格。 |
| ECS 系統硬碟類型。 | 根據可用性區域與規格自動過濾。 |
| ECS 鏡像 ID。 | 控制台動態選擇。 |
可選配置參數(有預設值,可不填)
參數名 | 預設值 | 說明 |
| 192.168.0.0/16 | VPC 網段位址範圍。 |
| 192.168.0.0/24 | 交換器子網網段。 |
| 3 | 初始建立的 ECS 執行個體數量。 |
| 50 | ESS 伸縮組最大執行個體數。 |
| 無 | ECS 執行個體登入密碼,長度 8-30,需含大小寫、數字、特殊字元中至少三種。 |
部署方式
方式一:通過 ROS 控制台部署
在左側導覽列選擇資源棧 > 建立資源棧。
選擇選擇已有模板 > 輸入模板,將完整模板粘貼到編輯器中。
單擊下一步,按參數分組填寫各項配置參數。
確認配置後單擊建立,等待資源棧狀態變為
CREATE_COMPLETE。
方式二:通過 ROS IaC Code 部署
IaC Code 是面向雲基礎設施的 AI 基礎設施即代碼助手,通過自然語言提示詞產生、部署和管理基礎設施模板。架構設計面向多雲工作流程。以下為本方案的參考提示詞:
# Prompt
幫我部署一組ECS執行個體並使用Auto Scaling組進行管理,要求:
1.使用建立的VPC和VSwitch
2.初始建立3台ECS執行個體加入伸縮組
3.伸縮組最大執行個體數50,最小執行個體數3
4.縮容策略為優先移除最新執行個體
5.安全性群組開放入方向8080連接埠
6.VSwitchZoneId、ECSInstanceType、ECSDiskCategory、ECSImageId都需要使用AssociationProperty配置成控制台動態篩選方式常見問題
Q1:部署失敗,報錯 "The specified InstanceType is not available in the zone"
原因:所選 ECS 執行個體規格在指定可用性區域中沒有庫存。
解決方案:
在進階版模板中,
AssociationProperty會自動過濾可用規格,避免此問題。如果使用基礎版模板,請前往 Elastic Compute Service定價確認目標可用性區域的規格庫存,或更換可用性區域。
Q2:伸縮組啟用後立即觸發縮容
原因:MinSize 設定值大於實際加入的執行個體數量,或執行個體加入失敗。
解決方案:
確保
ECSInstanceGroupCount的值大於等於伸縮組的MinSize。檢查 ECS 執行個體是否正常 Running 狀態。
確認執行個體與伸縮組在同一 VPC 或 VSwitch 中。
Q3:擴容時建立的 ECS 執行個體配置與預期不符
原因:ScalingConfiguration 中的配置(InstanceType、ImageId 等)與初始 ECS 執行個體的配置不一致。
解決方案:
在進階版模板中,
ScalingConfiguration的參數(如InstanceType、ImageId)已引用與EcsInstanceGroup相同的參數,確保擴容配置一致。如需不同配置的擴容,可建立多個
ScalingConfiguration,通過權重控制比例。
Q4:如何?基於 CPU 使用率的自動調整?
方案:在模板中添加伸縮規則和警示任務:
# 擴容規則:每次增加2台執行個體
ScaleOutRule:
Type: ALIYUN::ESS::ScalingRule
Properties:
ScalingGroupId:
Ref: EssInstanceScalingGroup
ScalingRuleName: scale-out-2
ScalingRuleType: SimpleScalingRule
AdjustmentType: QuantityChangeInCapacity # 按數量調整
AdjustmentValue: 2 # 每次增加2台
# 警示觸發器:CPU > 80% 時觸發擴容
CpuAlarm:
Type: ALIYUN::ESS::AlarmTask
Properties:
AlarmTaskName: cpu-high-alarm
ScalingGroupId:
Ref: EssInstanceScalingGroup
MetricName: CpuUtilization
Threshold: 80
ComparisonOperator: '>='
EvaluationCount: 3 # 連續3次採樣超閾值才觸發
AlarmActions:
- Fn::GetAtt:
- ScaleOutRule
- ScalingRuleAriQ5:如何使用已有 VPC 而非建立?
方案:將 VPC 和 VSwitch 從 Resources 中移除,改為 Parameters傳入:
Parameters:
ExistingVpcId:
Type: String
Label:
zh-cn: 已有VPC ID
AssociationProperty: ALIYUN::ECS::VPC::VPCId
ExistingVSwitchId:
Type: String
Label:
zh-cn: 已有交換器ID
AssociationProperty: ALIYUN::VPC::VSwitch::VSwitchId
AssociationPropertyMetadata:
VpcId: ${ExistingVpcId}Q6:如何為伸縮組掛載 SLB 實現流量分發?
方案:在 ScalingGroup 的 Properties 中添加 LoadBalancerIds:
EssInstanceScalingGroup:
Type: ALIYUN::ESS::ScalingGroup
Properties:
ScalingGroupName:
Ref: ALIYUN::StackName
RemovalPolicys:
- NewestInstance
MinSize:
Ref: ECSInstanceGroupCount
MaxSize:
Ref: ESSGroupMaxSize
VSwitchId:
Ref: VSwitch
DefaultCooldown: 300
LoadBalancerIds:
- Ref: MyLoadBalancer # 引用已建立的SLB執行個體伸縮組新增或移除執行個體時,會自動將執行個體添加到或移出 SLB 後端伺服器組。
想要瞭解更多資源部署問題,可以查詢常見問題合集。