本文以建立ECS執行個體組並掛載到傳統型負載平衡(CLB)執行個體為例,由簡入難的向您介紹如何編輯ROS模板。
方案概述
本方案使用阿里雲Resource Orchestration Service服務(ROS)通過 YAML 模板,一次性建立 VPC 網路、ECS 執行個體組並部署 Nginx 服務,然後建立傳統型負載平衡(CLB)執行個體並將 ECS 執行個體組掛載為後端伺服器,最後綁定彈性公網 IP(EIP)對外提供 HTTP 服務。適用於需要快速搭建高可用 Web 服務叢集的情境。
業務情境
在阿里雲Virtual Private Cloud中大量建立 ECS 執行個體,通過 ECS 雲助手自動安裝並啟動 Nginx 服務,等待服務初始化完成後將 ECS 執行個體掛載到 CLB 負載平衡器實現流量分發,並通過 EIP 對外暴露 HTTP 訪問地址。
建立的資源清單
序號 | 資源名稱 | ROS 資源類型 | 用途說明 |
1 | Virtual Private Cloud |
| 提供隔離的網路環境 |
2 | 交換器 |
| 在 VPC 中劃分子網網段,指定可用性區域 |
3 | 安全性群組 |
| 開放 HTTP 80 連接埠入站,允許所有出站 |
4 | ECS 執行個體組 |
| 大量建立多台 ECS,通過 CommandContent 自動部署 Nginx |
5 | 負載平衡 CLB |
| 傳統型Server Load Balancer執行個體,分發流量到後端 ECS |
6 | 負載平衡監聽 Listener |
| 配置 CLB 的 TCP/HTTP 監聽連接埠和健全狀態檢查 |
7 | 後端伺服器掛載 |
| 將 ECS 執行個體組掛載到 CLB 作為後端伺服器 |
8 | 彈性公網 IP EIP |
| 提供公網訪問入口 |
9 | EIP 綁定 |
| 將 EIP 綁定到 CLB 執行個體 |
部署完成後獲得的結果
模板成功執行後,您將獲得:
一個完整的 VPC 網路環境(包含 VPC、交換器、安全性群組,已開放 80 連接埠)。
一組 ECS 執行個體(預設 2 台),已自動完成資料盤掛載和 Nginx 服務部署。
一個 CLB Server Load Balancer執行個體,已配置 TCP 80 連接埠監聽和健全狀態檢查。
所有 ECS 執行個體已掛載到 CLB 後端伺服器組,支援按權重分發流量。
一個彈性公網 IP(EIP),已綁定到 CLB,可通過
http://<EIP地址>訪問 Nginx 服務。
架構圖

前提條件
在使用本模板前,請確認以下條件:
帳號許可權:您的阿里雲帳號需要具有以下產品的建立許可權:ECS、CLB、VPC、EIP。
基礎知識:瞭解 ROS 模板的基本文法和結構,詳情請參見模板快速入門。
模板編寫教程
本教程分兩個階段示範模板編寫過程:
階段一(基礎版):使用固定參數值,專註於理解資源定義和 CLB 掛載關係。
階段二(進階版):參數化所有可變更配置置,添加動態參數篩選、付費類型條件顯示和參數分組。
階段一:基礎模板——定義資源及其依賴關係
Step 1:定義基礎網路資源(VPC + VSwitch + 安全性群組)
網路資源是所有其他資源的基礎,需要最先建立。安全性群組需開放 HTTP 80 連接埠入站以允許外部存取 Nginx。
Resources:
# ============================================================
# 基礎網路層:VPC → VSwitch → SecurityGroup
# ============================================================
Vpc:
Type: ALIYUN::ECS::VPC # 建立專用網路
Properties:
CidrBlock: 192.168.0.0/16
VpcName:
Ref: ALIYUN::StackName # 偽參數:使用資源棧名稱作為VPC名稱
VSwitch:
Type: ALIYUN::ECS::VSwitch # 在VPC中建立交換器(子網)
Properties:
VSwitchName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc # 隱式依賴:ROS會先建立Vpc
ZoneId: cn-beijing-h # 此情境以北京H可用性區域為樣本
CidrBlock: 192.168.0.0/24
EcsSecurityGroup:
Type: ALIYUN::ECS::SecurityGroup # 建立安全性群組
Properties:
SecurityGroupName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc
SecurityGroupIngress: # 入站規則:開放HTTP 80連接埠(Nginx服務對外)
- PortRange: 80/80
Priority: 1
SourceCidrIp: 0.0.0.0/0
IpProtocol: tcp
NicType: internet關鍵知識點與思考:
類似 VpcName、
VSwitchName、SecurityGroupName 這類自訂配置可以使用偽參數進行配置,這樣可以讓我們在部署資源後快速找到屬於該資源棧部署相關的資源。SecurityGroup 的訪問規則可以根據業務需求自訂配置,例如:
需要在外部存取 Web 服務,可配置開啟安全性群組入方向的 HTTP 80 或 8080 連接埠訪問。
需要 SSH 登入伺服器,可配置開啟安全性群組入方向的 22 連接埠訪問。
生產環境建議限制
SourceCidrIp為已知 IP 段,不建議使用0.0.0.0/0。
Step 2:定義CLB 負載平衡和彈性公網 IP資源
CLB Server Load Balancer執行個體負責將外部流量分發到多台後端 ECS。EIP 提供公網入口地址。
Resources:
# ============================================================
# 負載平衡層:CLB + Listener + EIP
# ============================================================
Slb:
Type: ALIYUN::SLB::LoadBalancer # 建立傳統型Server Load Balancer執行個體
Properties:
VpcId:
Ref: Vpc
VSwitchId:
Ref: VSwitch
LoadBalancerName:
Fn::Sub: slb-${ALIYUN::StackName} # Fn::Sub拼接字串
AddressType: intranet # 內網類型CLB(通過EIP提供公網訪問)
LoadBalancerSpec: slb.s1.small
AutoPay: true
SlbListener:
Type: ALIYUN::SLB::Listener # 配置CLB監聽
DependsOn:
- Slb # 顯式依賴:CLB建立後才能添加監聽
Properties:
LoadBalancerId:
Ref: Slb
ListenerPort: 80 # 前端監聽連接埠
BackendServerPort: 80 # 後端伺服器連接埠(Nginx預設80)
Protocol: tcp # 四層TCP協議轉寄
Bandwidth: -1 # -1表示不限頻寬,具體取值請根據CLB執行個體規格調整
Persistence: # 會話保持配置
StickySession: 'on'
StickySessionType: insert # 植入Cookie方式
CookieTimeout: 60
PersistenceTimeout: 180
HealthCheck: # 健全狀態檢查配置
HealthCheckType: tcp # TCP連接埠探測
Port: 80
Interval: 2 # 檢查間隔2秒
HealthyThreshold: 3 # 3次成功判定為健康
UnhealthyThreshold: 3 # 3次失敗判定為異常
Timeout: 5 # 探測逾時5秒
EipSlbAddress:
Type: ALIYUN::VPC::EIP # 建立Elastic IP Address
Properties:
Name:
Ref: ALIYUN::StackName
InternetChargeType: PayByTraffic # 按流量計費
Bandwidth: 10 # 頻寬上限10Mbps
EipSlbAddressAssociation:
Type: ALIYUN::VPC::EIPAssociation # 將EIP綁定到CLB
Properties:
InstanceId:
Ref: Slb # 繫結目標:CLB執行個體
AllocationId:
Ref: EipSlbAddress # EIP資源ID關鍵知識點與思考:
DependsOn的隱式關聯 vs 顯式依賴關聯:當使用
Ref或Fn::GetAtt引用了某個資源,ROS 會自動判斷依賴(隱式)。只有當兩個資源之間沒有直接參考關聯性,但業務上要求先後順序時,才需要DependsOn(顯式)。
CLB 使用
AddressType: intranet(內網類型),再通過ALIYUN::VPC::EIPAssociation綁定 EIP 實現公網訪問,這是推薦的架構模式。
Step 3:定義ECS 執行個體組和雲助手安裝Nginx 指令碼
ECS 執行個體通過雲助手執行初始化指令碼(資料盤掛載 + Nginx 安裝)。
Resources:
EcsInstanceGroup:
Type: ALIYUN::ECS::InstanceGroup
Properties:
VpcId:
Ref: Vpc
SecurityGroupId:
Ref: EcsSecurityGroup
VSwitchId:
Ref: VSwitch
ZoneId: cn-beijing-h
ImageId: centos_7
InstanceType: ecs.c5.large
MaxAmount: 2 # 建立2台ECS執行個體
AllocatePublicIP: false # 不分配公網IP(通過CLB+EIP對外)
IoOptimized: optimized
SystemDiskCategory: cloud_essd
SystemDiskSize: 40
DiskMappings: # 資料盤配置
- Category: cloud_essd
Size: 100
Password: <YourPassword> # 部署時請替換為實際密碼(需含大小寫字母+數字+特殊字元)
RunSetup:
Type: ALIYUN::ECS::RunCommand
DependsOn: EcsInstanceGroup
Properties:
InstanceIds:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
Type: RunShellScript
Sync: true
Timeout: 300
ContentEncoding: PlainText
CommandContent: |
#!/bin/bash
# === 資料盤初始化:分區、格式化、掛載到/disk1 ===
cat >> /root/InitDataDisk.sh << 'EOF'
#!/bin/bash
echo "p
n
p
w
" | fdisk -u /dev/vdb
EOF
/bin/bash /root/InitDataDisk.sh
rm -f /root/InitDataDisk.sh
mkfs -t ext4 /dev/vdb1
cp /etc/fstab /etc/fstab.bak
mkdir /disk1
echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab
mount -a
# === 安裝並啟動Nginx ===
yum install -y nginx
systemctl start nginx.service關鍵知識點與思考:
Ref和Fn::GetAtt的區別:Ref返回資源的主標識符(如 VPC 的VpcId)。Fn::GetAtt返回資源的相關屬性(如EcsInstanceGroup的InstanceIds)。
Step 4:定義 CLB 後端伺服器掛載——將 ECS 串連到 CLB
通過 ALIYUN::SLB::BackendServerAttachment 將 ECS 執行個體組掛載到 CLB 後端。
Resources:
# ============================================================
# 綁定層:將ECS執行個體組掛載到CLB後端伺服器
# ============================================================
SlbBackendServerAttachment:
Type: ALIYUN::SLB::BackendServerAttachment
DependsOn:
- EcsInstanceGroup # 顯式依賴:等待ECS建立完成
Properties:
LoadBalancerId:
Ref: Slb
BackendServerList:
# 擷取ECS執行個體組的所有執行個體ID列表
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
BackendServerWeightList: # 後端伺服器權重列表
- 100 # 第1台ECS權重100
- 100 # 第2台ECS權重100關鍵知識點:BackendServerWeightList 權重規則
權重值範圍 0~100,權重越高分配的流量越多。
如果
BackendServerWeightList長度小於BackendServerList,剩餘 ECS 執行個體使用列表中最後一個權重值。
基礎版完整模板
以下是將上述步驟合并後的完整可用模板:
ROSTemplateFormatVersion: '2015-09-01'
Description:
zh-cn: 建立VPC網路,部署ECS執行個體組並安裝Nginx,掛載到CLB負載平衡器,通過EIP對外提供HTTP服務
en: Create VPC, deploy ECS group with Nginx, attach to CLB, expose via EIP
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: 80/80
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:
VpcId:
Ref: Vpc
SecurityGroupId:
Ref: EcsSecurityGroup
VSwitchId:
Ref: VSwitch
ImageId: centos_7
InstanceType: ecs.c5.large
MaxAmount: 2
AllocatePublicIP: false
IoOptimized: optimized
SystemDiskCategory: cloud_essd
SystemDiskSize: 40
DiskMappings:
- Category: cloud_essd
Size: 100
Password: <YourPassword> # 部署時請替換為實際密碼
RunSetup:
Type: ALIYUN::ECS::RunCommand
DependsOn: EcsInstanceGroup
Properties:
InstanceIds:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
Type: RunShellScript
Sync: true
Timeout: 300
ContentEncoding: PlainText
CommandContent: |
#!/bin/bash
# === 資料盤初始化:分區、格式化、掛載到/disk1 ===
cat >> /root/InitDataDisk.sh << 'EOF'
#!/bin/bash
echo "p
n
p
w
" | fdisk -u /dev/vdb
EOF
/bin/bash /root/InitDataDisk.sh
rm -f /root/InitDataDisk.sh
mkfs -t ext4 /dev/vdb1
cp /etc/fstab /etc/fstab.bak
mkdir /disk1
echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab
mount -a
# === 安裝並啟動Nginx ===
yum install -y nginx
systemctl start nginx.service
# === 負載平衡層 ===
Slb:
Type: ALIYUN::SLB::LoadBalancer
Properties:
VpcId:
Ref: Vpc
VSwitchId:
Ref: VSwitch
LoadBalancerName:
Fn::Sub: slb-${ALIYUN::StackName}
AddressType: intranet
LoadBalancerSpec: slb.s1.small
AutoPay: true
SlbListener:
DependsOn:
- Slb
Type: ALIYUN::SLB::Listener
Properties:
LoadBalancerId:
Ref: Slb
ListenerPort: 80
BackendServerPort: 80
Protocol: tcp
Bandwidth: -1
Persistence:
StickySession: 'on'
StickySessionType: insert
CookieTimeout: 60
PersistenceTimeout: 180
HealthCheck:
HealthCheckType: tcp
Port: 80
Interval: 2
HealthyThreshold: 3
UnhealthyThreshold: 3
Timeout: 5
EipSlbAddress:
Type: ALIYUN::VPC::EIP
Properties:
Name:
Ref: ALIYUN::StackName
InternetChargeType: PayByTraffic
Bandwidth: 10
EipSlbAddressAssociation:
Type: ALIYUN::VPC::EIPAssociation
Properties:
InstanceId:
Ref: Slb
AllocationId:
Ref: EipSlbAddress
# === 綁定層 ===
SlbBackendServerAttachment:
DependsOn:
- EcsInstanceGroup
Type: ALIYUN::SLB::BackendServerAttachment
Properties:
BackendServerList:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
LoadBalancerId:
Ref: Slb
BackendServerWeightList:
- 100
- 100
Outputs:
Endpoint:
Description:
zh-cn: 對外暴露的公網訪問地址
en: Public HTTP endpoint
Value:
Fn::Sub:
- http://${ServerAddress}
- ServerAddress:
Fn::GetAtt:
- EipSlbAddress
- EipAddress關鍵知識點與思考:模板建立完資源後,可以通過模板的 Outputs 資訊直接查詢對應資源內部屬性資訊,例如 CLB 執行個體綁定的公網 IP 等資訊。
階段二:進階模板——參數化與動態配置
基礎版模板中 ECS 的 InstanceType、SystemDiskCategory 以及 CLB 的 LoadBalancerSpec 等屬性使用了固定值。通過參數化可以大幅提高模板的靈活性。
本模板的進階特性:
參數化(Parameters):將可變更配置置抽取為參數。
動態參數篩選(AssociationProperty):ROS 控制台根據已選參數自動過濾可用選項。
參數分組(Metadata):按邏輯分組展示參數。
參數依賴關係圖
以下以 ECS 執行個體規格、系統硬碟類型和 CLB 執行個體規格為例,展示參數之間的依賴鏈路:
ZoneId(可用性區域,核心過濾參數)
├── EcsInstanceType(執行個體規格,按可用性區域+付費類型過濾)
│ ├── SystemDiskCategory(系統硬碟類型,按可用性區域+執行個體規格過濾)
│ └── DataDiskCategory(資料盤類型,按可用性區域+執行個體規格過濾)
└── LoadBalancerSpec(CLB規格,按可用性區域過濾)
PayType(付費類型)
├── PayPeriodUnit(周期單位,僅PrePaid時顯示)
├── PayPeriod(購買時間長度,僅PrePaid時顯示)
└── EcsInstanceType(執行個體規格,按可用性區域+付費類型過濾)核心思路:先選可用性區域和 ECS 付費類型,再據此篩選 ECS 規格和 CLB 規格(當選擇預付費類型時需要選擇付費周期和購買時間長度),最後根據可用性區域 + ECS 規格篩選磁碟類型。每一步都只展示當前條件下可用的選項,避免無效組合。
參數 AssociationProperty 原理詳解
1. ZoneId — 可用性區域(基礎參數)
定義 AssociationProperty 為 ALIYUN::ECS::ZoneId 列出當前地區下所有可用性區域。樣本:
ZoneId:
Type: String
Label:
zh-cn: 交換器可用性區域
en: VSwitch Availability Zone
Description:
zh-cn: 選擇交換器所在的可用性區域,ECS和CLB將部署在此可用性區域
en: Select the availability zone for VSwitch, ECS and CLB will be deployed here
AssociationProperty: ALIYUN::ECS::ZoneId此參數是後續所有參數的篩選基礎,使用者選擇後,其他參數的選項列表會隨之更新。
2. PayType — ECS 付費類型
定義 PayType 參數,使用 AssociationPropertyMetadata.Visible.Condition 實現參數的條件動態切換——當使用者選擇訂用帳戶(PrePaid)時才顯示購買時間長度相關參數。樣本:
Parameters:
PayType:
Type: String
Label:
zh-cn: 付費類型
en: Charge Type
Default: PostPaid
AllowedValues:
- PostPaid
- PrePaid
AssociationProperty: ChargeType
AssociationPropertyMetadata:
LocaleKey: InstanceChargeType
PayPeriodUnit:
Type: String
Default: Month
AssociationProperty: PayPeriodUnit
AssociationPropertyMetadata:
Visible: # 條件顯示:僅當PayType不是PostPaid時才顯示此參數
Condition:
Fn::Not:
Fn::Equals:
- ${PayType}
- PostPaid
PayPeriod:
Type: Number
Label:
zh-cn: 購買資源時間長度
en: Period
Default: 1
AllowedValues:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
AssociationProperty: PayPeriod
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Not:
Fn::Equals:
- ${PayType}
- PostPaid當在 ROS 控制台選擇隨用隨付(PostPaid)時,購買時間長度相關參數自動隱藏;選擇訂用帳戶(PrePaid)時才顯示這些參數。
3. EcsInstanceType — ECS 執行個體規格
定義 AssociationProperty 為 ALIYUN::ECS::Instance::InstanceType 列出可用的 ECS 執行個體規格,並通過關聯 ${ZoneId} 和 ${PayType} 篩選對應可用性區域下對應付費類型支援的可用執行個體規格。樣本:
EcsInstanceType:
Type: String
Label:
zh-cn: ECS執行個體規格
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
InstanceChargeType: ${PayType}不同可用性區域的執行個體規格庫存不同。如果不過濾,可能選到該可用性區域無貨的規格,導致建立失敗。
4. SystemDiskCategory — 系統硬碟類型
定義 AssociationProperty 為 ALIYUN::ECS::Disk::SystemDiskCategory 列出可選的系統硬碟類型,並通過關聯 ${ZoneId} 和 ${EcsInstanceType} 篩選對應可用性區域與 ECS 執行個體規格支援使用的 ECS 系統硬碟類型。樣本:
SystemDiskCategory:
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: ${ZoneId}
InstanceType: ${EcsInstanceType}系統硬碟類型的可用性同時取決於可用性區域(某些可用性區域不支援 ESSD)和執行個體規格(某些規格僅支援特定磁碟類型)。
5. LoadBalancerSpec — CLB 執行個體規格
定義 AssociationProperty 為 ALIYUN::SLB::Instance::InstanceType 列出可用的 CLB 執行個體規格,並通過關聯 ${ZoneId} 篩選對應可用性區域支援的 CLB 執行個體規格。樣本:
LoadBalancerSpec:
Type: String
Label:
zh-cn: CLB執行個體規格
en: CLB Instance Spec
Description:
zh-cn: 選擇CLB執行個體規格,根據可用性區域自動過濾
en: Select CLB instance specification
AssociationProperty: ALIYUN::SLB::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${ZoneId}動態參數篩選模板樣本
Parameters:
ZoneId:
Type: String
Label:
zh-cn: 交換器可用性區域
en: VSwitch Availability Zone
Description:
zh-cn: 選擇交換器所在的可用性區域,ECS和CLB將部署在此可用性區域
en: Select the availability zone for deployment
AssociationProperty: ALIYUN::ECS::ZoneId
PayType:
Type: String
Label:
zh-cn: 付費類型
en: Charge Type
Default: PostPaid
AllowedValues:
- PostPaid
- PrePaid
AssociationProperty: ChargeType
AssociationPropertyMetadata:
LocaleKey: InstanceChargeType
PayPeriodUnit:
Type: String
Default: Month
AssociationProperty: PayPeriodUnit
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Not:
Fn::Equals:
- ${PayType}
- PostPaid
PayPeriod:
Type: Number
Label:
zh-cn: 購買資源時間長度
en: Period
Default: 1
AllowedValues:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
AssociationProperty: PayPeriod
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Not:
Fn::Equals:
- ${PayType}
- PostPaid
EcsInstanceType:
Type: String
Label:
zh-cn: ECS執行個體規格
en: ECS Instance Type
Description:
zh-cn: 選擇ECS執行個體規格。列表已根據可用性區域和付費類型自動過濾。
en: Select ECS instance type, filtered by zone and charge type.
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
InstanceChargeType: ${PayType}
SystemDiskCategory:
Type: String
Label:
zh-cn: 系統硬碟類型
en: System Disk Category
Description:
zh-cn: 選擇系統硬碟類型。可選值:cloud_essd(ESSD雲端硬碟)、cloud_ssd(SSD雲端硬碟)、cloud_efficiency(高效雲端硬碟)
en: System disk type
AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
InstanceType: ${EcsInstanceType}
DataDiskCategory:
Type: String
Label:
zh-cn: 資料盤類型
en: Data Disk Category
Description:
zh-cn: 選擇資料盤類型。可選值:cloud_essd、cloud_ssd、cloud_efficiency
en: Data disk type
AssociationProperty: ALIYUN::ECS::Disk::DataDiskCategory
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
InstanceType: ${EcsInstanceType}
LoadBalancerSpec:
Type: String
Label:
zh-cn: CLB執行個體規格
en: CLB Instance Spec
Description:
zh-cn: 選擇CLB執行個體規格,根據可用性區域自動過濾
en: Select CLB instance specification
AssociationProperty: ALIYUN::SLB::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${ZoneId}參數 AssociationProperty 工作原理總結
使用者在 ROS 控制台建立資源棧時,參數的選擇過程是級聯觸發的:
選擇可用性區域(
ZoneId)。選擇 ECS 付費類型(
PayType)。ECS 執行個體規格下拉框自動重新整理,僅顯示該可用性區域下所支援對應付費類型且具備庫存的規格。
CLB 執行個體規格下拉框自動重新整理,僅顯示該可用性區域支援的規格。
選擇 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都是必填項。Metadata.ALIYUN::ROS::Interface.ParameterGroups.Parameters中列出的參數名必須與模板Parameters段中定義的參數名完全一致。未出現在任何分組中的參數,會在控制台顯示在未分組地區。
本情境的分組設計
本模板將 14 個參數按資源類型分成 4 個組:
┌─────────────────────────────────────────────┐
│ 基礎網路設定 │
│ ├── 交換器可用性區域 (ZoneId) │
│ ├── VPC網段 (VpcCidrBlock) │
│ └── 交換器網段 (VSwitchCidrBlock) │
├─────────────────────────────────────────────┤
│ 付費模式配置 │
│ ├── ECS執行個體付費類型 (PayType) │
│ ├── ECS預付費購買資源周期 (PayPeriodUnit) │
│ └── ECS預付費購買資源時間長度 (PayPeriod) │
├─────────────────────────────────────────────┤
│ ECS執行個體配置 │
│ ├── ECS執行個體規格 (EcsInstanceType) │
│ ├── 系統硬碟類型 (SystemDiskCategory) │
│ ├── 系統硬碟大小 (SystemDiskSize) │
│ ├── 資料盤類型 (DataDiskCategory) │
│ ├── 資料盤大小 (DataDiskSize) │
│ └── ECS執行個體密碼 (InstancePassword) │
├─────────────────────────────────────────────┤
│ CLB負載平衡配置 │
│ ├── CLB執行個體規格 (LoadBalancerSpec) │
│ └── CLB綁定的EIP頻寬 (Bandwidth) │
└─────────────────────────────────────────────┘Metadata 分組模板樣本
Metadata:
ALIYUN::ROS::Interface:
ParameterGroups:
- Parameters:
- ZoneId
- VpcCidrBlock
- VSwitchCidrBlock
Label:
default:
zh-cn: 基礎網路設定
en: Network Configuration
- Parameters:
- PayType
- PayPeriodUnit
- PayPeriod
Label:
default:
zh-cn: 付費類型
en: Billing Configuration
- Parameters:
- EcsInstanceType
- SystemDiskCategory
- SystemDiskSize
- DataDiskCategory
- DataDiskSize
- InstancePassword
Label:
default:
zh-cn: ECS執行個體配置
en: ECS Instance Configuration
- Parameters:
- LoadBalancerSpec
- Bandwidth
Label:
default:
zh-cn: 負載平衡配置
en: CLB Configuration進階版完整模板
ROSTemplateFormatVersion: '2015-09-01'
Description:
zh-cn: >-
參數化模板:建立ECS執行個體組部署Nginx服務,掛載到CLB負載平衡器,通過EIP對外提供HTTP服務。
支援動態選擇可用性區域、執行個體規格、磁碟類型和CLB規格,支援按量/訂用帳戶付費模式切換。
en: >-
Parameterized template: Create ECS group with Nginx, attach to CLB, expose via EIP.
Supports dynamic selection and PayAsYouGo/Subscription billing switch.
Parameters:
# ─── 基礎網路參數 ───
ZoneId:
Type: String
Label:
zh-cn: 交換器可用性區域
en: VSwitch Availability Zone
Description:
zh-cn: 選擇交換器所在的可用性區域,ECS和CLB將部署在此可用性區域
en: Select the availability zone for deployment
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
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
Default: 192.168.0.0/24
# ─── 付費型別參數 ───
PayType:
Type: String
Label:
zh-cn: 付費類型
en: Charge Type
Default: PostPaid
AllowedValues:
- PostPaid
- PrePaid
AssociationProperty: ChargeType
AssociationPropertyMetadata:
LocaleKey: InstanceChargeType
PayPeriodUnit:
Type: String
Label:
zh-cn: 購買資源時間長度周期
en: Pay Period Unit
Description:
zh-cn: 訂用帳戶的周期單位。Month為月,Year為年。僅訂用帳戶時有效。
en: Subscription period unit. Only valid for PrePaid.
Default: Month
AllowedValues:
- Month
- Year
AssociationProperty: PayPeriodUnit
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Not:
Fn::Equals:
- ${PayType}
- PostPaid
PayPeriod:
Type: Number
Label:
zh-cn: 購買資源時間長度
en: Period
Default: 1
AllowedValues:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
AssociationProperty: PayPeriod
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Not:
Fn::Equals:
- ${PayType}
- PostPaid
# ─── ECS執行個體參數 ───
EcsInstanceType:
Type: String
Label:
zh-cn: ECS執行個體規格
en: ECS Instance Type
Description:
zh-cn: 選擇ECS執行個體規格。列表已根據可用性區域和付費類型自動過濾。
en: Select ECS instance type, filtered by zone and charge type.
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
InstanceChargeType: ${PayType}
SystemDiskCategory:
Type: String
Label:
zh-cn: 系統硬碟類型
en: System Disk Category
Description:
zh-cn: 選擇系統硬碟類型。可選值:cloud_essd(ESSD雲端硬碟)、cloud_ssd(SSD雲端硬碟)、cloud_efficiency(高效雲端硬碟)
en: System disk type
AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
InstanceType: ${EcsInstanceType}
SystemDiskSize:
Type: Number
Label:
zh-cn: 系統硬碟大小(GB)
en: System Disk Size (GB)
Description:
zh-cn: 系統硬碟大小,取值範圍40~500 GB
en: System disk size, range 40-500 GB
Default: 40
MinValue: 40
MaxValue: 500
DataDiskCategory:
Type: String
Label:
zh-cn: 資料盤類型
en: Data Disk Category
Description:
zh-cn: 選擇資料盤類型。可選值:cloud_essd、cloud_ssd、cloud_efficiency
en: Data disk type
AssociationProperty: ALIYUN::ECS::Disk::DataDiskCategory
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
InstanceType: ${EcsInstanceType}
DataDiskSize:
Type: Number
Label:
zh-cn: 資料盤大小(GB)
en: Data Disk Size (GB)
Description:
zh-cn: ECS資料盤大小,取值範圍20~32768 GB
en: Data disk size, range 20-32768 GB
Default: 100
MinValue: 20
MaxValue: 32768
InstancePassword:
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 character types
MinLength: 8
MaxLength: 30
AssociationProperty: ALIYUN::ECS::Instance::Password
# ─── 負載平衡參數 ───
LoadBalancerSpec:
Type: String
Label:
zh-cn: CLB執行個體規格
en: CLB Instance Spec
Description:
zh-cn: 選擇CLB執行個體規格,根據可用性區域自動過濾
en: Select CLB instance specification
AssociationProperty: ALIYUN::SLB::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
Bandwidth:
Type: Number
Label:
zh-cn: EIP頻寬(Mbps)
en: EIP Bandwidth (Mbps)
Description:
zh-cn: Elastic IP Address的頻寬上限,取值範圍1~1000 Mbps
en: EIP bandwidth cap, range 1-1000 Mbps
Default: 10
MinValue: 1
MaxValue: 1000
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: ZoneId
CidrBlock:
Ref: VSwitchCidrBlock
EcsSecurityGroup:
Type: ALIYUN::ECS::SecurityGroup
Properties:
SecurityGroupName:
Ref: ALIYUN::StackName
VpcId:
Ref: Vpc
SecurityGroupIngress:
- PortRange: 80/80
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:
InstanceChargeType:
Ref: PayType
PeriodUnit:
Ref: PayPeriodUnit
Period:
Ref: PayPeriod
IoOptimized: optimized
SystemDiskCategory:
Ref: SystemDiskCategory
SystemDiskSize:
Ref: SystemDiskSize
DiskMappings:
- Category:
Ref: DataDiskCategory
Size:
Ref: DataDiskSize
VpcId:
Ref: Vpc
SecurityGroupId:
Ref: EcsSecurityGroup
VSwitchId:
Ref: VSwitch
MaxAmount: 2
ImageId: centos_7
InstanceType:
Ref: EcsInstanceType
Password:
Ref: InstancePassword
AllocatePublicIP: false
RunSetup:
Type: ALIYUN::ECS::RunCommand
DependsOn: EcsInstanceGroup
Properties:
InstanceIds:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
Type: RunShellScript
Sync: true
Timeout: 300
ContentEncoding: PlainText
CommandContent: |
#!/bin/bash
# === 資料盤初始化:分區、格式化、掛載到/disk1 ===
cat >> /root/InitDataDisk.sh << 'EOF'
#!/bin/bash
echo "p
n
p
w
" | fdisk -u /dev/vdb
EOF
/bin/bash /root/InitDataDisk.sh
rm -f /root/InitDataDisk.sh
mkfs -t ext4 /dev/vdb1
cp /etc/fstab /etc/fstab.bak
mkdir /disk1
echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab
mount -a
# === 安裝並啟動Nginx ===
yum install -y nginx
systemctl start nginx.service
# === 負載平衡層 ===
Slb:
Type: ALIYUN::SLB::LoadBalancer
Properties:
VpcId:
Ref: Vpc
VSwitchId:
Ref: VSwitch
LoadBalancerName:
Fn::Sub: slb-${ALIYUN::StackName}
PayType:
Ref: PayType
PricingCycle:
Ref: PayPeriodUnit
Duration:
Ref: PayPeriod
AddressType: intranet
LoadBalancerSpec:
Ref: LoadBalancerSpec
AutoPay: true
EipSlbAddress:
Type: ALIYUN::VPC::EIP
Properties:
Name:
Ref: ALIYUN::StackName
InternetChargeType: PayByTraffic
Bandwidth:
Ref: Bandwidth
EipSlbAddressAssociation:
Type: ALIYUN::VPC::EIPAssociation
Properties:
InstanceId:
Ref: Slb
AllocationId:
Ref: EipSlbAddress
SlbBackendServerAttachment:
DependsOn:
- EcsInstanceGroup
Type: ALIYUN::SLB::BackendServerAttachment
Properties:
BackendServerList:
Fn::GetAtt:
- EcsInstanceGroup
- InstanceIds
LoadBalancerId:
Ref: Slb
BackendServerWeightList:
- 100
- 100
SlbListener:
DependsOn:
- Slb
Type: ALIYUN::SLB::Listener
Properties:
LoadBalancerId:
Ref: Slb
ListenerPort: 80
BackendServerPort: 80
Protocol: tcp
Bandwidth: -1
Persistence:
StickySession: 'on'
StickySessionType: insert
CookieTimeout: 60
PersistenceTimeout: 180
HealthCheck:
HealthCheckType: tcp
Port: 80
Interval: 2
HealthyThreshold: 3
UnhealthyThreshold: 3
Timeout: 5
Outputs:
Endpoint:
Description:
zh-cn: 對外暴露的公網訪問地址
en: Public HTTP endpoint
Value:
Fn::Sub:
- http://${ServerAddress}
- ServerAddress:
Fn::GetAtt:
- EipSlbAddress
- EipAddress
# === 中繼資料:控制台參數分組配置 ===
Metadata:
ALIYUN::ROS::Interface:
ParameterGroups:
- Parameters:
- ZoneId
- VpcCidrBlock
- VSwitchCidrBlock
Label:
default:
zh-cn: 基礎網路設定
en: Network Configuration
- Parameters:
- PayType
- PayPeriodUnit
- PayPeriod
Label:
default:
zh-cn: 付費類型
en: Billing Configuration
- Parameters:
- EcsInstanceType
- SystemDiskCategory
- SystemDiskSize
- DataDiskCategory
- DataDiskSize
- InstancePassword
Label:
default:
zh-cn: ECS執行個體配置
en: ECS Instance Configuration
- Parameters:
- LoadBalancerSpec
- Bandwidth
Label:
default:
zh-cn: 負載平衡配置
en: CLB Configuration本模板使用的 ROS 內建函數速查
函數 | 文法樣本 | 本模板中的用途 | 詳細說明 |
|
| 引用參數值或資源主標識符 | 引用 Parameter 返回參數值;引用 Resource 返回其主標識符 |
|
| 擷取 ECS 執行個體組的執行個體 ID 列表 | 擷取資源建立後的輸出屬性(非主標識符) |
|
| 拼接 CLB 名稱 | 模板字串中用 |
|
| 條件判斷:付費參數的條件顯示 | 邏輯取反 + 相等比較,用於 Visible 條件 |
部署環節
部署參數
必需輸入參數(部署時需填寫)
參數名 | 類型 | 說明 | 約束 |
| String | 可用性區域 ID | 控制台動態選擇 |
| String | ECS 執行個體規格 | 根據可用性區域+付費類型自動過濾 |
| String | 系統硬碟類型 | 根據可用性區域+規格自動過濾 |
| String | 資料盤類型 | 根據可用性區域+規格自動過濾 |
| String | CLB 執行個體規格 | 根據可用性區域自動過濾 |
可選配置參數(有預設值,可不填)
參數名 | 預設值 | 說明 |
| 192.168.0.0/16 | VPC 網段位址範圍 |
| 192.168.0.0/24 | 交換器子網網段 |
|
| 付費類型(按量/訂用帳戶) |
| Month | 購買時間長度單位(僅 |
| 1 | 購買時間長度(僅 |
| 40 | 系統硬碟大小(GB),範圍 40~500 |
| 100 | 資料盤大小(GB),範圍 20~32768 |
| 10 | EIP 頻寬上限(Mbps),範圍 1~1000 |
| — | ECS 執行個體登入密碼,長度 8-30,需含大小寫+數字+特殊字元中至少三種 |
部署方式
方式一:通過 ROS 控制台部署
在左側導覽列選擇資源棧 > 建立資源棧。
選擇選擇已有模板 > 輸入模板,將完整模板粘貼到編輯器中。
單擊下一步,按參數分組填寫各項配置參數。
確認配置後單擊建立,等待資源棧狀態變為
CREATE_COMPLETE。
方式二:通過 ROS IaC Code 部署
IaC Code 是面向雲基礎設施的 AI 基礎設施即代碼助手,通過自然語言提示詞產生、部署和管理基礎設施模板。架構設計面向多雲工作流程。以下為本方案的參考提示詞:
# Prompt
幫我部署一組ECS執行個體並掛載到CLB負載平衡器上,要求:
1.使用建立的VPC和VSwitch
2.建立2台ECS執行個體,通過CommandContent安裝並啟動Nginx
3.使用WaitCondition等待Nginx安裝完成後再掛載到CLB
4.CLB配置TCP 80連接埠監聽和健全狀態檢查
5.建立EIP綁定到CLB,對外提供HTTP訪問
6.安全性群組開放入方向80連接埠
7.ECS配置100GB資料盤並在CommandContent中自動分區掛載
8.ZoneId、EcsInstanceType、SystemDiskCategory、DataDiskCategory、LoadBalancerSpec都使用AssociationProperty配置成控制台動態篩選
9.付費類型支援按量和訂用帳戶切換,訂用帳戶參數使用條件顯示常見問題
Q1:CLB 健全狀態檢查一直失敗,後端 ECS 顯示異常
原因:ECS 上的 Nginx 服務未正常啟動,或安全性群組未開放 80 連接埠。
排查步驟:
登入 ECS執行
systemctl status nginx確認 Nginx 正在運行。確認安全性群組入站規則已開放 80 連接埠(
PortRange: 80/80)。檢查 CLB 健全狀態檢查配置的
Port是否與 Nginx 監聽連接埠一致。適當增大
HealthyThreshold(健康閾值)和Interval(檢查間隔)。
Q2:如何調整後端伺服器的流量分配比例?
方案:修改 SlbBackendServerAttachment 的 BackendServerWeightList:
BackendServerWeightList:
- 100 # 第1台ECS:接收約67%流量
- 50 # 第2台ECS:接收約33%流量權重比為 100:50,即第 1 台處理約 2/3 的請求。如果需要某台 ECS 暫停服務(灰階下線),將其權重設為 0 即可。
Q3:如何將 ECS::RunCommand 中的 Nginx 部署指令碼替換為自訂應用?
方案:修改 CommandContent 指令碼中"安裝並啟動"部分,保留資料盤初始化邏輯:
CommandContent:
Fn::Sub:
- |
#!/bin/bash
# ... 資料盤初始化代碼(保持不變)...
# === 替換為你的應用部署指令碼 ===
# 例如:部署Java SpringBoot應用
yum install -y java-11-openjdk
wget -P /disk1 https://your-oss-bucket.oss-cn-hangzhou.aliyuncs.com/app.jar
nohup java -jar /disk1/app.jar --server.port=80Q4:如何將 CLB 替換為 ALB(應用型負載平衡)?
改造要點:
將
ALIYUN::SLB::LoadBalancer替換為ALIYUN::ALB::LoadBalancer。使用
ALIYUN::ALB::ServerGroup建立伺服器組並添加後端 ECS。使用
ALIYUN::ALB::Listener+ALIYUN::ALB::Rule配置七層 HTTP/HTTPS 路由。ALB 原生支援公網,無需額外綁定 EIP。
Q5:如何使用已有 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}瞭解更多資源部署問題,可以查詢常見問題合集。