全部產品
Search
文件中心

Resource Orchestration Service:使用伸縮組管理多台Elastic Compute Service

更新時間:Sep 16, 2026

本文以使用伸縮組管理多台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

ALIYUN::ECS::VPC

提供隔離的網路環境。

2

交換器 VSwitch

ALIYUN::ECS::VSwitch

在 VPC 中劃分子網網段,指定可用性區域。

3

安全性群組 SecurityGroup

ALIYUN::ECS::SecurityGroup

控制 ECS 的網路訪問規則(入站/出站)。

4

ECS 執行個體組 InstanceGroup

ALIYUN::ECS::InstanceGroup

大量建立多台 ECS 雲端服務器(初始節點)。

5

伸縮組 ScalingGroup

ALIYUN::ESS::ScalingGroup

管理 ECS 執行個體的Auto Scaling策略(最小/最大執行個體數)。

6

伸縮配置 ScalingConfiguration

ALIYUN::ESS::ScalingConfiguration

定義伸縮組擴容時建立 ECS 的規格模板。

7

伸縮組啟用 ScalingGroupEnable

ALIYUN::ESS::ScalingGroupEnable

啟用伸縮組並將已有 ECS 執行個體加入伸縮組。

部署完成後獲得的結果

模板成功執行後,將獲得:

  • 一個完整的 VPC 網路環境(包含 VPC、交換器、安全性群組)。

  • 一組 ECS 雲端服務器執行個體(數量由參數 ECSInstanceGroupCount 指定,預設 3 台)。

  • 一個已啟用的Auto Scaling組,包含伸縮配置,可根據負載自動擴容至最大執行個體數。

  • 所有 ECS 執行個體已自動加入伸縮組統一管理。

架構圖

image

前提條件

在使用本模板前,請確認以下條件:

  1. 帳號許可權:阿里雲帳號需具有以下產品的建立許可權:ECS、ESS(Auto Scaling)、VPC。

  2. 基礎知識:瞭解 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 執行個體規格受限於可用性區域(不同可用性區域有不同規格庫存),系統硬碟類型又同時受限於可用性區域和執行個體規格。如果手動填寫這些參數,很容易選到停用組合,導致部署失敗。

通過以下最佳化,可以大幅提高模板的靈活性和可複用性:

  1. 參數化(Parameters):將可變更配置置抽取為參數,部署時動態填寫。

  2. 動態參數篩選(AssociationProperty):讓 ROS 控制台根據已選參數自動過濾可用選項。

  3. 參數分組(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 控制台建立資源棧時,參數的選擇過程是級聯觸發的:

  1. 選擇可用性區域(VSwitchZoneId)。

  2. ECS 執行個體規格下拉框自動重新整理,僅顯示該可用性區域有庫存的規格。

  3. 選擇 ECS 執行個體規格後,系統硬碟類型下拉框自動重新整理,僅顯示該可用性區域與該規格共同支援的磁碟類型。

這樣,每一步選擇都只展示當前條件下可用的選項,從源頭避免因參數組合無效導致的部署失敗。

Metadata 參數分組

通過 Metadata 中的 ALIYUN::ROS::Interface 配置,可以將參數按邏輯分成多個組,每組帶一個標題,控制台上會分組展示,填寫體驗大幅提升。

Metadata 文法結構
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:           # 參數分組列表(必填)
      - Parameters:            # 該組包含的參數名列表(必填)
          - 參數名1
          - 參數名2
        Label:                 # 分組標題(必填)
          default:
            zh-cn: 中文標題
            en: English Title

Metadata 文法規則:

  • 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 內建函數速查

函數

文法樣本

本模板中的用途

詳細說明

Ref

Ref: MyVpc

引用參數值或資源主標識符。

引用 Parameter 返回參數值;引用 Resource 返回其主標識符。

Fn::GetAtt

Fn::GetAtt: [EcsInstanceGroup, InstanceIds]

擷取 ECS 執行個體組的執行個體 ID 列表。

擷取資源建立後的輸出屬性(非主標識符)。

Fn::Sub

Fn::Sub: sc-${ALIYUN::StackName}

拼接伸縮配置名稱。

模板字串中用 ${Var} 引用變數或偽參數。

部署環節

部署參數

必需輸入參數(部署時需填寫)

參數名

說明

約束

VSwitchZoneId

可用性區域 ID。

控制台動態選擇。

ECSInstanceType

ECS 執行個體規格。

根據可用性區域自動過濾可用規格。

ECSDiskCategory

ECS 系統硬碟類型。

根據可用性區域與規格自動過濾。

ECSImageId

ECS 鏡像 ID。

控制台動態選擇。

可選配置參數(有預設值,可不填)

參數名

預設值

說明

VpcCidrBlock

192.168.0.0/16

VPC 網段位址範圍。

VSwitchCidrBlock

192.168.0.0/24

交換器子網網段。

ECSInstanceGroupCount

3

初始建立的 ECS 執行個體數量。

ESSGroupMaxSize

50

ESS 伸縮組最大執行個體數。

EcsInstancePassword

無

ECS 執行個體登入密碼,長度 8-30,需含大小寫、數字、特殊字元中至少三種。

部署方式

方式一:通過 ROS 控制台部署

  1. 登入Resource Orchestration Service控制台。

  2. 在左側導覽列選擇資源棧 > 建立資源棧。

  3. 選擇選擇已有模板 > 輸入模板,將完整模板粘貼到編輯器中。

  4. 單擊下一步,按參數分組填寫各項配置參數。

  5. 確認配置後單擊建立,等待資源棧狀態變為 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 設定值大於實際加入的執行個體數量,或執行個體加入失敗。

解決方案:

  1. 確保 ECSInstanceGroupCount 的值大於等於伸縮組的 MinSize。

  2. 檢查 ECS 執行個體是否正常 Running 狀態。

  3. 確認執行個體與伸縮組在同一 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
          - ScalingRuleAri

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}

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 後端伺服器組。

想要瞭解更多資源部署問題,可以查詢常見問題合集。