Todos os produtos
Search
Central de documentação

Resource Orchestration Service:Implante um cluster ECS com dimensionamento automático usando o ROS

Última atualização: Sep 15, 2026

Use o Alibaba Cloud Resource Orchestration Service (ROS) para provisionar uma rede VPC, um conjunto de instâncias ECS e um grupo do Auto Scaling (ESS) a partir de um único modelo YAML. Adicione as instâncias ECS ao grupo de dimensionamento para permitir scale out ou scale in automático conforme a carga de trabalho. Este tutorial é ideal para cenários que exigem gerenciamento elástico de clusters de servidores, como aplicações web e microsserviços.

Visão geral da solução

Cenário de negócios

Crie instâncias ECS em lote em uma Virtual Private Cloud (VPC) da Alibaba Cloud e adicione-as a um grupo de dimensionamento. Após configurar as regras de dimensionamento, o grupo aumenta ou diminui a quantidade de instâncias ECS de acordo com a demanda, proporcionando gerenciamento elástico dos clusters de servidores.

Recursos criados

Nome do recurso

Tipo de recurso ROS

Finalidade

1

VPC

ALIYUN::ECS::VPC

Fornece um ambiente de rede isolado.

2

VSwitch

ALIYUN::ECS::VSwitch

Aloca um bloco CIDR de sub-rede e especifica a zona na VPC.

3

SecurityGroup

ALIYUN::ECS::SecurityGroup

Controla as regras de acesso de entrada e saída para as instâncias ECS.

4

ECS InstanceGroup

ALIYUN::ECS::InstanceGroup

Cria as instâncias ECS iniciais em lote.

5

ScalingGroup

ALIYUN::ESS::ScalingGroup

Gerencia a política de dimensionamento elástico (quantidades mínima e máxima de instâncias).

6

ScalingConfiguration

ALIYUN::ESS::ScalingConfiguration

Define o modelo de especificação ECS usado durante o scale-out.

7

ScalingGroupEnable

ALIYUN::ESS::ScalingGroupEnable

Ativa o grupo de dimensionamento e adiciona as instâncias ECS existentes a ele.

Resultados esperados após a implantação

Após a implantação bem-sucedida do modelo, você terá:

  • Um ambiente de rede VPC completo, incluindo VPC, vSwitch e grupo de segurança.

  • Um conjunto de instâncias ECS (a quantidade é parametrizada por ECSInstanceGroupCount, com padrão 3).

  • Um grupo de dimensionamento ativo com configuração definida para scale-out automático.

  • Todas as instâncias ECS adicionadas ao grupo de dimensionamento.

Diagrama de arquitetura

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

Pré-requisitos

Antes de começar, confirme os seguintes itens:

  1. Conta e permissões: Uma conta Alibaba Cloud com permissões para criar recursos no ECS, ESS (Elastic Scaling) e VPC.

  2. Conhecimento prévio: Noções básicas sobre sintaxe e estrutura de modelos ROS. Para mais detalhes, consulte Quick start for templates.

Tutorial de criação de modelos

Este tutorial demonstra o processo de escrita do modelo em duas fases:

  • Fase 1 (versão básica): utiliza valores fixos para parâmetros e foca no entendimento das definições de recursos e suas dependências.

  • Fase 2 (versão avançada): parametriza todas as configurações variáveis e adiciona filtragem dinâmica e agrupamento de parâmetros.

Fase 1: Modelo básico — defina recursos e dependências

Passo 1: Defina os recursos básicos de rede (VPC + VSwitch + Security group)

Os recursos de rede formam a base para todos os demais e devem ser criados primeiro.

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

Pontos importantes:

  • Configurações personalizadas como VpcName, VSwitchName e SecurityGroupName podem usar pseudoparâmetros, facilitando a localização dos recursos implantados por uma stack específica após a implantação.

  • As regras de acesso do SecurityGroup são personalizáveis conforme suas necessidades de negócio. Por exemplo:

    • Para acessar um service web via Internet, abra a porta de entrada HTTP 80 ou 8080 no grupo de segurança.

    • Para conectar-se aos servidores via SSH, abra a porta de entrada 22 no grupo de segurança.

Passo 2: Defina o recurso ECS instance group

O tipo ALIYUN::ECS::InstanceGroup cria múltiplas instâncias ECS com a mesma configuração simultaneamente, sendo mais eficiente do que declarar ALIYUN::ECS::Instance várias vezes.

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

Pontos importantes:

  • O recurso ALIYUN::ECS::InstanceGroup usa a propriedade MaxAmount para definir quantas instâncias ECS serão criadas.

  • A função Fn::Sub concatena strings. O trecho [1,4] é um marcador de sequência numérica específico do ROS, indicando um número de 4 dígitos incrementado a partir de 1, como 0001 e 0002.

  • O atributo de saída InstanceIds deste recurso retorna uma lista de IDs das instâncias ECS, que pode ser referenciada pelo grupo de dimensionamento.

Passo 3: Defina os recursos do grupo de dimensionamento (Scaling group+Scaling configuration+Enable scaling configuration)

O funcionamento de um grupo de dimensionamento envolve três recursos: ScalingGroup define a política de dimensionamento, ScalingConfiguration estabelece o modelo ECS usado no scale-out, e ScalingGroupEnable ativa o grupo e adiciona as instâncias 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

Pontos importantes:

  • Defina o MinSize do grupo de dimensionamento com o mesmo valor de ECSInstanceGroupCount (quantidade inicial de instâncias) para evitar que o scale-in seja acionado imediatamente após a ativação do grupo.

  • É possível adicionar uma regra de dimensionamento (ALIYUN::ESS::ScalingRule) e uma tarefa de alarme (ALIYUN::ESS::AlarmTask) ao grupo para implementar dimensionamento automático baseado em métricas como utilização de CPU e memória.

  • Diferença entre Ref e Fn::GetAtt:

    • Ref retorna o identificador principal de um recurso, como o VpcId de uma VPC.

    • Fn::GetAtt retorna um atributo relacionado de um recurso, como os InstanceIds do EcsInstanceGroup.

Versão básica — modelo completo

Abaixo está o modelo completo e pronto para uso, combinando os três passos 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

Pontos importantes:

  • Após a criação dos recursos pelo modelo, consulte diretamente os atributos internos desses recursos na seção Outputs do modelo, como a lista de IDs das instâncias ECS.

Fase 2: Modelo avançado — parametrização e configuração dinâmica

No modelo básico, propriedades como InstanceType, SystemDiskCategory e ImageId das instâncias ECS, além do MaxSize do grupo de dimensionamento, usam valores fixos. Para reutilizar o modelo em outra região ou com especificações diferentes, seria necessário modificá-lo repetidamente. Além disso, os parâmetros frequentemente dependem uns dos outros. Por exemplo, o tipo de instância ECS varia conforme a zona (cada zona tem um estoque diferente), e a categoria do disco depende tanto da zona quanto do tipo de instância. A especificação manual desses parâmetros facilita a escolha de combinações indisponíveis, causando falhas na implantação.

As otimizações abaixo aumentam significativamente a flexibilidade e a reutilização do modelo:

  • Parametrização (Parameters): extraia configurações variáveis como parâmetros e especifique-os dinamicamente durante a implantação.

  • Filtragem dinâmica de parâmetros (AssociationProperty): permita que o console ROS filtre automaticamente as opções disponíveis com base nos parâmetros já selecionados.

  • Agrupamento de parâmetros (Metadata): organize os parâmetros em grupos lógicos no console para melhorar a experiência de preenchimento.

Diagrama de dependência de parâmetros

O exemplo a seguir usa o tipo de instância ECS e a categoria de disco do sistema para ilustrar a cadeia de dependências 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 central: selecione primeiro a zona, depois filtre os tipos de instância ECS disponíveis nessa zona e, por fim, filtre as categorias de disco suportadas pela combinação de zona e tipo de instância escolhidos. Cada etapa exibe apenas opções válidas nas condições atuais, prevenindo combinações inválidas.

Explicação sobre AssociationProperty

1. VSwitchZoneId — zona (parâmetro base)

Defina AssociationProperty como ALIYUN::ECS::ZoneId para listar todas as zonas da região atual. Exemplo:

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 serve como base de filtragem para todos os subsequentes. Ao selecionar uma zona, as listas de opções dos demais parâmetros são atualizadas automaticamente.

2. ECSInstanceType — tipo de instância ECS

Configure AssociationProperty como ALIYUN::ECS::Instance::InstanceType para listar os tipos de instância ECS disponíveis e associe ${VSwitchZoneId} para filtrar os tipos disponíveis na zona selecionada. Exemplo:

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

O estoque de tipos de instância varia por zona. Sem filtragem, você pode selecionar um tipo sem estoque na zona escolhida, resultando em falha na criação.

3. ECSDiskCategory — categoria de disco do sistema

Defina AssociationProperty como ALIYUN::ECS::Disk::SystemDiskCategory para listar as categorias de disco do sistema disponíveis e associe ${VSwitchZoneId} e ${ECSInstanceType} para filtrar as categorias suportadas pela zona e pelo tipo de instância ECS selecionados. Exemplo:

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}

A disponibilidade de uma categoria de disco do sistema depende tanto da zona (algumas não suportam ESSD) quanto do tipo de instância (alguns tipos aceitam apenas categorias específicas de disco).

Exemplo de filtragem dinâmica de parâmetros

O exemplo abaixo demonstra o efeito da configuração de AssociationProperty para obter dinamicamente tipos de instância ECS e categorias 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}

Funcionamento do AssociationProperty

Ao criar uma stack no console ROS, a seleção de parâmetros ocorre em cascata:

  1. Selecione uma zona (VSwitchZoneId).

  2. A lista suspensa de tipos de instância ECS é atualizada automaticamente, exibindo apenas os tipos com estoque naquela zona.

  3. Após escolher um tipo de instância ECS, a lista de categorias de disco do sistema é atualizada automaticamente, mostrando apenas as categorias suportadas tanto pela zona quanto pelo tipo de instância selecionado.

Dessa forma, cada etapa apresenta somente as opções disponíveis nas condições atuais, evitando falhas de implantação causadas por combinações inválidas de parâmetros.

Grupos de parâmetros via Metadata

Ao configurar ALIYUN::ROS::Interface em Metadata, divida os parâmetros em grupos lógicos, cada um com seu próprio título. O console exibirá os parâmetros organizados por grupo, melhorando consideravelmente a experiência de entrada de dados.

Estrutura de sintaxe do 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

Regras de sintaxe do Metadata:

  • ParameterGroups, Parameters e Label são obrigatórios.

  • Os nomes listados em Parameters devem corresponder exatamente aos nomes definidos na seção Parameters do modelo.

  • Parâmetros não incluídos em nenhum grupo aparecem em uma área sem agrupamento no console.

Design de grupos de parâmetros

Este modelo divide nove parâmetros em três grupos por 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)      │
└────────────────────────────────────────────────────┘
Exemplo de agrupamento via 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

Versão avançada — modelo completo

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

Referência rápida das funções integradas do ROS usadas neste modelo

Função

Exemplo de sintaxe

Uso neste modelo

Descrição

Ref

Ref: MyVpc

Referencia um valor de parâmetro ou o identificador principal de um recurso.

Referenciar um parâmetro retorna seu valor; referenciar um recurso retorna seu identificador principal.

Fn::GetAtt

Fn::GetAtt: [EcsInstanceGroup, InstanceIds]

Obtém a lista de IDs das instâncias do grupo ECS.

Recupera um atributo de saída de um recurso após a criação (não o identificador principal).

Fn::Sub

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

Concatena o nome da configuração de dimensionamento.

Use ${Var} em uma string de modelo para referenciar uma variável ou pseudoparâmetro.

Implantação

Parâmetros de implantação

Parâmetros obrigatórios (devem ser especificados na implantação)

Parâmetro

Descrição

Restrição

VSwitchZoneId

ID da zona.

Selecionado dinamicamente no console.

ECSInstanceType

Tipo de instância ECS.

Os tipos disponíveis são filtrados automaticamente com base na zona.

ECSDiskCategory

Categoria de disco do sistema ECS.

Filtrado automaticamente com base na zona e no tipo de instância.

ECSImageId

ID da imagem ECS.

Selecionado dinamicamente no console.

Parâmetros opcionais (possuem valores padrão e podem ficar vazios)

Parâmetro

Valor padrão

Descrição

VpcCidrBlock

192.168.0.0/16

Bloco CIDR da VPC.

VSwitchCidrBlock

192.168.0.0/24

Bloco CIDR da sub-rede do vSwitch.

ECSInstanceGroupCount

3

Quantidade de instâncias ECS criadas inicialmente.

ESSGroupMaxSize

50

Número máximo de instâncias no grupo de dimensionamento ESS.

EcsInstancePassword

Nenhum

Senha de login das instâncias ECS. Deve ter entre 8 e 30 caracteres e conter pelo menos três dos seguintes tipos: letras maiúsculas, letras minúsculas, dígitos e caracteres especiais.

Métodos de implantação

Método 1: Implantar pelo console ROS

  1. Faça login no console ROS.

  2. No painel de navegação à esquerda, escolha Stacks > Create Stack.

  3. Selecione Select an Existing Template > Enter Template Content e cole o modelo completo no editor.

  4. Clique em Next e configure os parâmetros por grupo.

  5. Após confirmar a configuração, clique em Create e aguarde até que o status da stack mude para CREATE_COMPLETE.

Método 2: Implantar via código ROS IaC

O IaC Code é um assistente de infraestrutura como código baseado em IA para infraestrutura cloud. Ele auxilia usuários de recursos cloud e engenheiros de O&M a gerar, implantar e gerenciar modelos de infraestrutura através de um fluxo de trabalho no 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.

Perguntas frequentes

P1: Falha na implantação com "The specified InstanceType is not available in the zone"

Causa: o tipo de instância ECS selecionado está sem estoque na zona especificada.

Solução:

  • No modelo avançado, o AssociationProperty filtra automaticamente os tipos de instância disponíveis, evitando esse problema.

  • Caso utilize o modelo básico, acesse Preços do Elastic Compute Service (ECS) para verificar o estoque de tipos de instância na zona desejada ou selecione outra zona.

P2: O grupo de dimensionamento aciona scale-in imediatamente após a ativação

Causa: o valor de MinSize é maior que a quantidade de instâncias que realmente entraram no grupo, ou as instâncias falharam ao ingressar.

Solução:

  1. Garanta que o valor de ECSInstanceGroupCount seja maior ou igual ao MinSize do grupo de dimensionamento.

  2. Verifique se as instâncias ECS estão no estado Running.

  3. Confirme se as instâncias e o grupo de dimensionamento estão na mesma VPC ou vSwitch.

P3: Novas instâncias ECS criadas durante o scale-out possuem configuração inesperada

Causa: as configurações em ScalingConfiguration, como InstanceType e ImageId, diferem das configurações das instâncias ECS iniciais.

Solução:

  • No modelo avançado, os parâmetros de ScalingConfiguration, como InstanceType e ImageId, já referenciam os mesmos parâmetros do EcsInstanceGroup, mantendo a consistência da configuração de scale-out.

  • Se precisar fazer scale-out com configurações diferentes, crie múltiplos recursos ScalingConfiguration e controle suas proporções por peso.

P4: Como implementar dimensionamento automático baseado em utilização de CPU?

Solução: adicione uma regra de dimensionamento e uma tarefa de alarme ao modelo:

# 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: Como usar uma VPC existente em vez de criar uma nova?

Solução: remova a VPC e o vSwitch da seção Resources e passe-os através de 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: Como anexar um SLB ao grupo de dimensionamento para distribuição de tráfego?

Solução: adicione LoadBalancerIds às Properties do 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

Quando o grupo de dimensionamento adiciona ou remove instâncias, elas são automaticamente incluídas ou removidas do grupo de servidores backend do SLB.

Para mais dúvidas sobre implantação de recursos, consulte FAQ collection.