Todos los productos
Search
Centro de documentos

Resource Orchestration Service:Despliegue de un clúster de ECS con escalado automático mediante ROS

Última actualización: Sep 17, 2026

Utilice Alibaba Cloud Resource Orchestration Service (ROS) para aprovisionar una red VPC, un grupo de instancias ECS y un grupo de Auto Scaling (ESS) a partir de una sola plantilla YAML. Agregue las instancias ECS al grupo de escalado para que este escale horizontalmente o reduzca su tamaño automáticamente según la carga del negocio. Este tutorial es adecuado para escenarios que requieren gestión elástica de clústeres de servidores, como aplicaciones web y microservices.

Descripción general de la solución

Escenario de negocio

Cree por lotes instancias ECS en una Virtual Private Cloud (VPC) de Alibaba Cloud y agréguelas a un grupo de escalado. Una vez configuradas las reglas de escalado, el grupo aumenta o disminuye la cantidad de instancias ECS según la carga del negocio. Esto le permite gestionar de forma elástica los clústeres de servidores.

Recursos creados

Núm.

Nombre del recurso

Tipo de recurso de ROS

Propósito

1

VPC

ALIYUN::ECS::VPC

Proporciona un entorno de red aislado.

2

VSwitch

ALIYUN::ECS::VSwitch

Asigna un bloque CIDR de subred y especifica la zona dentro de la VPC.

3

SecurityGroup

ALIYUN::ECS::SecurityGroup

Controla las reglas de acceso de red entrante y saliente para las instancias ECS.

4

ECS InstanceGroup

ALIYUN::ECS::InstanceGroup

Crea por lotes las instancias ECS iniciales.

5

ScalingGroup

ALIYUN::ESS::ScalingGroup

Gestiona la política de escalado elástico (cantidades mínima y máxima de instancias).

6

ScalingConfiguration

ALIYUN::ESS::ScalingConfiguration

Define la plantilla de especificaciones de ECS que se utiliza durante el escalado horizontal.

7

ScalingGroupEnable

ALIYUN::ESS::ScalingGroupEnable

Habilita el grupo de escalado y le agrega las instancias ECS existentes.

Resultados esperados tras el despliegue

Una vez que la plantilla se despliega correctamente, obtendrá lo siguiente:

  • Un entorno de red VPC completo que incluye la VPC, el VSwitch y el security group.

  • Un grupo de instancias ECS. La cantidad se define mediante el parámetro ECSInstanceGroupCount, cuyo valor predeterminado es 3.

  • Un grupo de escalado habilitado con una configuración de escalado para el escalado horizontal automático.

  • Todas las instancias ECS agregadas al grupo de escalado.

Diagrama de arquitectura

使用伸缩组管理多台云服务器-架构图

Requisitos previos

Antes de comenzar, confirme lo siguiente:

  1. Cuenta y permisos: una cuenta de Alibaba Cloud con permisos para crear recursos en ECS, ESS (escalado elástico) y VPC.

  2. Conocimientos previos: nociones básicas sobre la sintaxis y estructura de las plantillas de ROS. Para más detalles, consulte Quick start for templates.

Tutorial de creación de plantillas

Este tutorial muestra el proceso de creación de plantillas en dos fases:

  • Fase 1 (versión básica): utiliza valores de parámetros fijos y se centra en comprender las definiciones y dependencias de los recursos.

  • Fase 2 (versión avanzada): parametriza todas las configuraciones variables y añade filtrado dinámico y agrupación de parámetros.

Fase 1: plantilla básica — definición de recursos y sus dependencias

Paso 1: definir los recursos de red básicos (VPC + VSwitch + Security group)

Los recursos de red son la base de todos los demás recursos, por lo que deben crearse primero.

Resources:
  # ============================================================
  # Basic network layer: VPC → VSwitch → SecurityGroup
  # ============================================================
  
  Vpc:
    Type: ALIYUN::ECS::VPC  # Create the VPC
    Properties:
      CidrBlock: 192.168.0.0/16  # VPC CIDR block, which provides 65,534 private IP addresses
      VpcName:
        Ref: ALIYUN::StackName  # Pseudo parameter: uses the stack name as the VPC name

  VSwitch:
    Type: ALIYUN::ECS::VSwitch  # Create a VSwitch (subnet) in the VPC
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc  # Ref returns the VpcId of Vpc (an implicit dependency, so ROS creates Vpc first)
      ZoneId: cn-beijing-h # This scenario uses zone H in the China (Beijing) region as an example
      CidrBlock: 192.168.0.0/24  # Subnet CIDR block, which must be a subset of the VPC CIDR block

  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup  # Create the security group
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc  # Bind the security group to the same VPC
      # Inbound rule: this example allows all inbound traffic for simplicity. Restrict the ports as needed in production.
      SecurityGroupIngress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          SourceCidrIp: 0.0.0.0/0
          NicType: intranet

Puntos clave:

  • Las configuraciones personalizadas como VpcName, VSwitchName y SecurityGroupName pueden establecerse con pseudoparámetros. Esto facilita localizar rápidamente los recursos desplegados por una pila específica después del despliegue.

  • Las reglas de acceso de SecurityGroup pueden personalizarse según los requisitos de su negocio. Por ejemplo:

    • Para acceder a un servicio web desde Internet, abra el puerto entrante HTTP 80 u 8080 en el security group.

    • Para iniciar sesión en los servidores mediante SSH, abra el puerto entrante 22 en el security group.

Paso 2: definir el recurso ECS instance group

ALIYUN::ECS::InstanceGroup crea varias instancias ECS con la misma configuración de forma simultánea. Este método resulta más eficiente que declarar ALIYUN::ECS::Instance múltiples veces.

Resources:
  # ============================================================
  # Compute layer: batch-create ECS instances
  # ============================================================

  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup  # Batch-create ECS instances
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ImageId: centos_7_9_x64_20G_alibase_20220727.vhd  # CentOS 7.9 image
      AllocatePublicIP: false  # Do not allocate a public IP address
      InstanceType: ecs.c5.large  # Instance type: 2 vCPUs, 4 GiB
      SystemDiskSize: 200  # 200 GiB system disk
      SystemDiskCategory: cloud_essd  # ESSD cloud disk
      MaxAmount: 3  # Create 3 ECS instances
      Password: <YourPassword>  # Replace with an actual password at deployment time (must contain uppercase letters, lowercase letters, digits, and special characters)
      InstanceName:  # Instance name: stack name plus a sequence number, such as mystack-0001
        Fn::Sub:
           - ${StackName}-[1,4]
           - StackName:
               Ref: ALIYUN::StackName

Puntos clave:

  • ALIYUN::ECS::InstanceGroup utiliza la propiedad MaxAmount para especificar la cantidad de instancias ECS que se van a crear.

  • La función Fn::Sub concatena cadenas de texto. [1,4] es un marcador de posición de número secuencial específico de ROS. Indica un número de cuatro dígitos que se incrementa a partir de 1, como 0001 y 0002.

  • El atributo de salida InstanceIds de este recurso es una lista de identificadores de instancias ECS que el grupo de escalado puede referenciar.

Paso 3: definir los recursos del grupo de escalado (Scaling group+Scaling configuration+Enable scaling configuration)

Un grupo de escalado funciona mediante tres recursos: ScalingGroup define la política de escalado, ScalingConfiguration define la plantilla de ECS utilizada durante el escalado horizontal y ScalingGroupEnable habilita el grupo de escalado y le agrega las instancias existentes.

Resources:
  # ============================================================
  # Auto Scaling layer: scaling group + scaling configuration + enable scaling group
  # ============================================================
  
  EssInstanceScalingGroup:
    Type: ALIYUN::ESS::ScalingGroup  # Create the scaling group
    Properties:
      ScalingGroupName:
        Ref: ALIYUN::StackName
      RemovalPolicys:
        - NewestInstance  # Scale-in policy: removes the most recently created instances first
      MinSize: 3  # The scaling group keeps at least 3 instances
      MaxSize: 50  # The scaling group can scale out to at most 50 instances
      VSwitchId:
        Ref: VSwitch  # Bind the scaling group to the VSwitch (determines the network location of instances added during scale-out)
      DefaultCooldown: 300  # A cooldown period of 300 seconds prevents frequent scaling

  EssInstanceScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration  # Scaling configuration (the ECS template used during scale-out)
    Properties:
      SecurityGroupId:
        Ref: EcsSecurityGroup
      ScalingGroupId:
        Ref: EssInstanceScalingGroup  # Associate with the scaling group defined above
      ScalingConfigurationName:
        Fn::Sub: sc-${ALIYUN::StackName}  # Fn::Sub substitutes the pseudo parameter variable directly
      InstanceType: ecs.c5.large  # ECS instance type created during scale-out (should match the initial ECS instances)
      SystemDiskCategory: cloud_essd
      SystemDiskSize: 200
      ImageId: centos_7_9_x64_20G_alibase_20220727.vhd  # Image used during scale-out (should match the initial ECS instances)

  EssInstanceScalingGroupEnable:
    Type: ALIYUN::ESS::ScalingGroupEnable  # Enable the scaling group
    Properties:
      ScalingRuleArisExecuteVersion: '1'
      ScalingConfigurationId:
        Ref: EssInstanceScalingConfiguration  # Specify the scaling configuration to take effect
      InstanceIds:
        # Add the ECS instances created in Step 2 to the scaling group
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds  # Obtain the list of all instance IDs of InstanceGroup
      ScalingGroupId:
        Ref: EssInstanceScalingGroup

Puntos clave:

  • Establezca MinSize del grupo de escalado con el mismo valor que ECSInstanceGroupCount (la cantidad de instancias creadas inicialmente). Así evitará que se active una reducción de escala inmediatamente después de habilitar el grupo.

  • Es posible agregar una regla de escalado (ALIYUN::ESS::ScalingRule) y una tarea de alarma (ALIYUN::ESS::AlarmTask) al grupo de escalado para implementar el escalado automático basado en métricas como el uso de CPU y de memoria.

  • Diferencia entre Ref y Fn::GetAtt:

    • Ref devuelve el identificador principal de un recurso, como el VpcId de una VPC.

    • Fn::GetAtt devuelve un atributo relacionado de un recurso, como los InstanceIds de EcsInstanceGroup.

Versión básica — plantilla completa

A continuación se muestra la plantilla completa y lista para usarse, que combina los tres pasos anteriores:

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:
  # === basic network layer ===
  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

  # === Computing layer ===
  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

  # === ESS layer ===
  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 instance ID list
    Value:
      Fn::GetAtt:
        - EcsInstanceGroup
        - InstanceIds

Puntos clave:

  • Después de que la plantilla cree los recursos, puede consultar directamente los atributos internos de dichos recursos desde la sección Outputs de la plantilla, como la lista de identificadores de instancias ECS.

Fase 2: plantilla avanzada — parametrización y configuración dinámica

En la plantilla básica, propiedades como InstanceType, SystemDiskCategory e ImageId de las instancias ECS, así como MaxSize del grupo de escalado, utilizan valores fijos. Para reutilizar la plantilla en otra región o con especificaciones distintas, tendría que modificarla repetidamente. Además, los parámetros de una plantilla suelen depender unos de otros. Por ejemplo, el tipo de instancia ECS está limitado por la zona (cada zona tiene inventarios distintos de tipos de instancia), y la categoría del disco del sistema depende tanto de la zona como del tipo de instancia. Si especifica estos parámetros manualmente, es fácil elegir una combinación no disponible, lo que provoca que el despliegue falle.

Las siguientes optimizaciones mejoran considerablemente la flexibilidad y reutilización de la plantilla:

  • Parametrización (Parameters): extraiga las configuraciones variables como parámetros y especifíquelas de forma dinámica durante el despliegue.

  • Filtrado dinámico de parámetros (AssociationProperty): permita que la consola de ROS filtre automáticamente las opciones disponibles según los parámetros ya seleccionados.

  • Agrupación de parámetros (Metadata): muestre los parámetros en grupos lógicos dentro de la consola para mejorar la experiencia de entrada de datos.

Diagrama de dependencias de parámetros

El siguiente ejemplo utiliza el tipo de instancia ECS y la categoría del disco del sistema para mostrar la cadena de dependencias entre parámetros:

VSwitchZoneId (zone)  ← base parameter, no prerequisite
    ├──→ ECSInstanceType (ECS instance type)
    │             Depends on: ZoneId
    │
    └──→ ECSDiskCategory (system disk category)
                  Depends on: ZoneId + InstanceType

Lógica principal: seleccione primero la zona, luego filtre los tipos de instancia ECS disponibles en esa zona y, por último, filtre las categorías de disco compatibles con la zona y el tipo de instancia seleccionados. Cada paso muestra únicamente las opciones válidas bajo las condiciones actuales, lo que evita combinaciones incorrectas.

Explicación de AssociationProperty

1. VSwitchZoneId — zona (parámetro base)

Establezca AssociationProperty en ALIYUN::ECS::ZoneId para listar todas las zonas de la región actual. Ejemplo:

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

Este parámetro es la base de filtrado para todos los parámetros posteriores. Al seleccionar una zona, las listas de opciones de los demás parámetros se actualizan en consecuencia.

2. ECSInstanceType — tipo de instancia ECS

Establezca AssociationProperty en ALIYUN::ECS::Instance::InstanceType para listar los tipos de instancia ECS disponibles y asocie ${VSwitchZoneId} para filtrar los tipos de instancia disponibles en la zona seleccionada. Ejemplo:

ECSInstanceType:
    Type: String
    Label:
      zh-cn: ECS实例规格
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}

El inventario de tipos de instancia varía según la zona. Sin filtrado, podría seleccionar un tipo sin existencias en la zona elegida, lo que provocaría un error de creación.

3. ECSDiskCategory — categoría del disco del sistema

Establezca AssociationProperty en ALIYUN::ECS::Disk::SystemDiskCategory para listar las categorías de disco del sistema disponibles. Además, asocie ${VSwitchZoneId} y ${ECSInstanceType} para filtrar las categorías de disco del sistema compatibles con la zona y el tipo de instancia ECS seleccionados. Ejemplo:

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}

La disponibilidad de una categoría de disco del sistema depende tanto de la zona (algunas zonas no admiten ESSD) como del tipo de instancia (ciertos tipos solo admiten categorías específicas de disco).

Ejemplo de filtrado dinámico de parámetros

El siguiente ejemplo muestra el efecto de configurar AssociationProperty para obtener de forma dinámica los tipos de instancia ECS y las categorías de disco:

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}

Funcionamiento de AssociationProperty

Cuando se crea una pila en la consola de ROS, la selección de parámetros se activa en cascada:

  1. Seleccione una zona (VSwitchZoneId).

  2. La lista desplegable de tipos de instancia ECS se actualiza automáticamente y muestra solo los tipos con existencias en esa zona.

  3. Al seleccionar un tipo de instancia ECS, la lista desplegable de categorías de disco del sistema se actualiza automáticamente y muestra solo las categorías compatibles con esa zona y ese tipo de instancia.

De este modo, cada paso presenta únicamente las opciones disponibles bajo las condiciones actuales, lo que previene errores de despliegue causados por combinaciones de parámetros no válidas.

Grupos de parámetros en Metadata

Al configurar ALIYUN::ROS::Interface dentro de Metadata, puede dividir los parámetros en grupos lógicos, cada uno con su encabezado. La consola muestra los parámetros por grupo, lo que mejora significativamente la experiencia de entrada de datos.

Estructura de sintaxis de Metadata
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:           # List of parameter groups (required)
      - Parameters:            # List of parameter names in the group (required)
          - Parameter1
          - Parameter2
        Label:                 # Group heading (required)
          default:
            zh-cn: 中文标题
            en: English Title

Reglas de sintaxis de Metadata:

  • ParameterGroups, Parameters y Label son obligatorios.

  • Los nombres de parámetros listados en Parameters deben coincidir exactamente con los nombres definidos en la sección Parameters de la plantilla.

  • Los parámetros que no aparecen en ningún grupo se muestran en un área sin agrupar dentro de la consola.

Diseño de grupos de parámetros

Esta plantilla divide nueve parámetros en tres grupos según el tipo de recurso:

┌────────────────────────────────────────────────────┐
│  Network configuration                             │
│  ├── VSwitch zone (VSwitchZoneId)                  │
│  ├── VPC CIDR block (VpcCidrBlock)                 │
│  └── VSwitch CIDR block (VSwitchCidrBlock)         │
├────────────────────────────────────────────────────┤
│  ECS instance configuration                        │
│  ├── ECS instance type (ECSInstanceType)           │
│  ├── ECS image ID (ECSImageId)                     │
│  ├── System disk category (ECSDiskCategory)        │
│  ├── ECS instance password (EcsInstancePassword)   │
│  └── ECS instance count (ECSInstanceGroupCount)    │
├────────────────────────────────────────────────────┤
│  ESS scaling group configuration                   │
│  └── Maximum instance count (ESSGroupMaxSize)      │
└────────────────────────────────────────────────────┘
Ejemplo de agrupación en 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

Versión avanzada — plantilla completa

ROSTemplateFormatVersion: '2015-09-01'
Description:
  zh-cn: >-
    参数化模板:批量创建ECS实例并通过弹性伸缩组管理,支持自动扩缩容。
    支持动态选择可用区、实例规格、磁盘类型和镜像,适用于多地域复用。
  en: >-
    Parameterized template: Create ECS instance group managed by ESS scaling group.
    Supports dynamic selection of zone, instance type, disk category and image.

Parameters:
  # ─── basic network 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 instance parameters ───
  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

  # ─── scaling group parameters ───
  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:
  # === basic network layer ===
  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
      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

  # === Computing layer ===
  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

  # === ESS layer ===
  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 ===
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

Referencia rápida de las funciones integradas de ROS utilizadas en esta plantilla

Función

Ejemplo de sintaxis

Uso en esta plantilla

Descripción

Ref

Ref: MyVpc

Referencia el valor de un parámetro o el identificador principal de un recurso.

Al referenciar un parámetro, devuelve su valor; al referenciar un recurso, devuelve su identificador principal.

Fn::GetAtt

Fn::GetAtt: [EcsInstanceGroup, InstanceIds]

Obtiene la lista de identificadores de instancia del grupo de instancias ECS.

Obtiene un atributo de salida de un recurso después de su creación (no el identificador principal).

Fn::Sub

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

Concatena el nombre de la configuración de escalado.

Utilice ${Var} en una cadena de plantilla para referenciar una variable o un pseudoparámetro.

Despliegue

Parámetros de despliegue

Parámetros obligatorios (deben especificarse durante el despliegue)

Parámetro

Descripción

Restricción

VSwitchZoneId

Identificador de la zona.

Se selecciona de forma dinámica en la consola.

ECSInstanceType

Tipo de instancia ECS.

Los tipos de instancia disponibles se filtran automáticamente según la zona.

ECSDiskCategory

Categoría del disco del sistema de ECS.

Se filtra automáticamente según la zona y el tipo de instancia.

ECSImageId

Identificador de la imagen de ECS.

Se selecciona de forma dinámica en la consola.

Parámetros opcionales (tienen valores predeterminados y pueden dejarse vacíos)

Parámetro

Valor predeterminado

Descripción

VpcCidrBlock

192.168.0.0/16

Bloque CIDR de la VPC.

VSwitchCidrBlock

192.168.0.0/24

Bloque CIDR de la subred del VSwitch.

ECSInstanceGroupCount

3

Cantidad de instancias ECS creadas inicialmente.

ESSGroupMaxSize

50

Cantidad máxima de instancias en el grupo de escalado de ESS.

EcsInstancePassword

Ninguna

Contraseña de inicio de sesión de las instancias ECS. Debe tener entre 8 y 30 caracteres e incluir como mínimo tres de los siguientes tipos: letras mayúsculas, letras minúsculas, dígitos y caracteres especiales.

Métodos de despliegue

Método 1: despliegue desde la consola de ROS

  1. Inicie sesión en la consola de ROS.

  2. En el panel de navegación izquierdo, elija Stacks > Create Stack.

  3. Seleccione Select an Existing Template > Enter Template Content y pegue la plantilla completa en el editor.

  4. Haga clic en Next y configure los parámetros por grupo.

  5. Tras confirmar la configuración, haga clic en Create y espere a que el estado de la pila cambie a CREATE_COMPLETE.

Método 2: despliegue mediante código IaC de ROS

IaC Code es un asistente de infraestructura como código basado en inteligencia artificial para infraestructura en la nube. Ayuda a los usuarios de recursos en la nube y a los ingenieros de operaciones a generar, desplegar y gestionar plantillas de infraestructura mediante un flujo de trabajo en terminal.

# Prompt
Deploy a group of ECS instances and manage them with an Auto Scaling group. Requirements:
1. Use a newly created VPC and VSwitch.
2. Create 3 ECS instances initially and add them to the scaling group.
3. Set the maximum number of instances in the scaling group to 50 and the minimum number to 3.
4. Set the scale-in policy to remove the newest instances first.
5. Open inbound port 8080 in the security group.
6. Configure VSwitchZoneId, ECSInstanceType, ECSDiskCategory, and ECSImageId with AssociationProperty so that they are dynamically filtered in the console.

Preguntas frecuentes

P1: El despliegue falla con el mensaje "The specified InstanceType is not available in the zone"

Causa: el tipo de instancia de ECS seleccionado no tiene existencias disponibles en la zona especificada.

Solución:

  • En la plantilla avanzada, AssociationProperty filtra automáticamente los tipos de instancia disponibles, lo que evita este problema.

  • Si utiliza la plantilla básica, vaya a Precios de Elastic Compute Service (ECS) para comprobar las existencias del tipo de instancia en la zona de destino o seleccione otra zona.

P2: El grupo de escalado activa una reducción de escala inmediatamente después de habilitarse

Causa: el valor de MinSize es mayor que la cantidad de instancias que realmente se unieron al grupo, o bien las instancias no lograron unirse.

Solución:

  1. Asegúrese de que el valor de ECSInstanceGroupCount sea mayor o igual que el valor de MinSize del grupo de escalado.

  2. Compruebe si las instancias de ECS están en estado Running.

  3. Confirme que las instancias y el grupo de escalado pertenezcan a la misma VPC o al mismo VSwitch.

P3: Las nuevas instancias de ECS creadas durante el escalado horizontal tienen una configuración inesperada

Causa: los valores de ScalingConfiguration, como InstanceType y ImageId, no coinciden con la configuración de las instancias de ECS iniciales.

Solución:

  • En la plantilla avanzada, los parámetros de ScalingConfiguration, como InstanceType y ImageId, ya hacen referencia a los mismos parámetros que EcsInstanceGroup. Esto mantiene consistente la configuración del escalado horizontal.

  • Si necesita escalar horizontalmente con configuraciones distintas, cree varios recursos ScalingConfiguration y controle sus proporciones mediante ponderación.

P4: ¿Cómo implemento el escalado automático basado en el uso de CPU?

Solución: agregue una regla de escalado y una tarea de alarma a la plantilla:

# Scale-out rule: adds 2 instances each time
ScaleOutRule:
  Type: ALIYUN::ESS::ScalingRule
  Properties:
    ScalingGroupId:
      Ref: EssInstanceScalingGroup
    ScalingRuleName: scale-out-2
    ScalingRuleType: SimpleScalingRule
    AdjustmentType: QuantityChangeInCapacity  # Adjust by quantity
    AdjustmentValue: 2  # Add 2 instances each time

# Alarm trigger: triggers scale-out when CPU utilization exceeds 80%
CpuAlarm:
  Type: ALIYUN::ESS::AlarmTask
  Properties:
    AlarmTaskName: cpu-high-alarm
    ScalingGroupId:
      Ref: EssInstanceScalingGroup
    MetricName: CpuUtilization
    Threshold: 80
    ComparisonOperator: '>='
    EvaluationCount: 3  # Triggers only after 3 consecutive samples exceed the threshold
    AlarmActions:
      - Fn::GetAtt:
          - ScaleOutRule
          - ScalingRuleAri

P5: ¿Cómo utilizo una VPC existente en lugar de crear una nueva?

Solución: elimine la VPC y el VSwitch de Resources y páselos mediante Parameters:

Parameters:
  ExistingVpcId:
    Type: String
    Label:
      en: Existing VPC ID
    AssociationProperty: ALIYUN::ECS::VPC::VPCId
  ExistingVSwitchId:
    Type: String
    Label:
      en: Existing VSwitch ID
    AssociationProperty: ALIYUN::VPC::VSwitch::VSwitchId
    AssociationPropertyMetadata:
      VpcId: ${ExistingVpcId}

P6: ¿Cómo asocio un SLB al grupo de escalado para distribuir el tráfico?

Solución: agregue LoadBalancerIds a Properties dentro de ScalingGroup:

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  # References an existing SLB instance

Cuando el grupo de escalado agrega o elimina instancias, estas se añaden o se quitan automáticamente del grupo de servidores del backend de SLB.

Para más preguntas sobre el despliegue de recursos, consulte FAQ collection.