Todos os produtos
Search
Central de documentação

Resource Orchestration Service:Criar um grupo de instâncias ECS e anexá-lo a uma instância CLB

Última atualização: Aug 18, 2026

Esta solução demonstra como usar o Alibaba Cloud Resource Orchestration Service (ROS) para criar um cluster completo de service web com um único modelo YAML. O modelo provisiona uma VPC, um grupo de instâncias ECS com Nginx instalado, um Classic Load Balancer (CLB) e um endereço IP elástico (EIP) em uma única criação de stack. Esta solução é ideal para cenários que exigem implantação rápida de clusters de service web de alta disponibilidade (HA).

Visão geral da solução

Cenário de negócios

Em uma virtual private cloud (VPC) do Alibaba Cloud, crie instâncias ECS em massa. Use o ECS Cloud Assistant para instalar e iniciar o Nginx automaticamente. Após a inicialização, anexe as instâncias ECS a uma instância CLB para distribuição de tráfego e exponha o endpoint de acesso HTTP por meio de um EIP.

Recursos criados

Recurso

Tipo de recurso ROS

Finalidade

1

VPC

ALIYUN::ECS::VPC

Fornece um ambiente de rede isolado.

2

vSwitch

ALIYUN::ECS::VSwitch

Divide sub-redes dentro da VPC e especifica zonas.

3

Grupo de segurança

ALIYUN::ECS::SecurityGroup

Abre a porta HTTP de entrada 80 e permite todo o tráfego de saída.

4

Grupo de instâncias ECS

ALIYUN::ECS::InstanceGroup

Cria múltiplas instâncias ECS e implanta o Nginx automaticamente via CommandContent.

5

Instância CLB

ALIYUN::SLB::LoadBalancer

Instância de Classic Load Balancer que distribui tráfego para as instâncias ECS de backend.

6

Listener CLB

ALIYUN::SLB::Listener

Configura a porta do listener TCP/HTTP do CLB e as verificações de integridade.

7

Anexação de servidor de backend

ALIYUN::SLB::BackendServerAttachment

Anexa o grupo de instâncias ECS ao CLB como servidores de backend.

8

EIP

ALIYUN::VPC::EIP

Fornece um ponto de entrada de acesso à rede pública.

9

Associação de EIP

ALIYUN::VPC::EIPAssociation

Associa o EIP à instância CLB.

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 com a porta 80 aberta).

  • Um grupo de instâncias ECS (2 instâncias por padrão) com montagem de disco de dados e Nginx implantado automaticamente.

  • Uma instância CLB configurada com um listener na porta TCP 80 e verificações de integridade.

  • Todas as instâncias ECS anexadas ao grupo de servidores de backend do CLB, com distribuição de tráfego por peso.

  • Um EIP associado ao CLB, acessível via http://<EIP address>.

Diagrama de arquitetura

创建ECS实例组并挂载到CLB实例

Pré-requisitos

Antes de usar este modelo, confirme os seguintes itens:

  1. Permissões da conta: Sua conta Alibaba Cloud deve ter permissões de criação para ECS, CLB, VPC e EIP.

  2. Conhecimento básico: Familiaridade com a sintaxe e estrutura básicas dos modelos ROS. Para mais informações, consulte ROS Template Getting Started.

Tutorial de escrita de modelos

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

  • Fase 1 (Modelo básico): Usa valores de parâmetros fixos para focar no entendimento das definições de recursos e nas relações de anexação do CLB.

  • Fase 2 (Modelo avançado): Parametriza todas as configurações variáveis e adiciona filtragem dinâmica de parâmetros, exibição condicional para tipo de faturamento e agrupamento de parâmetros.

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

Etapa 1: Definir recursos básicos de rede (VPC + vSwitch + security group)

Os recursos de rede são a base para todos os outros recursos e devem ser criados primeiro. O grupo de segurança deve abrir a porta HTTP de entrada 80 para permitir acesso externo ao Nginx.

Resources:
  # ============================================================
  # Network Layer: VPC → vSwitch → SecurityGroup
  # ============================================================

  Vpc:
    Type: ALIYUN::ECS::VPC  # Create a VPC
    Properties:
      CidrBlock: 192.168.0.0/16
      VpcName:
        Ref: ALIYUN::StackName  # Pseudo parameter: use the stack name as the VPC name

  VSwitch:
    Type: ALIYUN::ECS::VSwitch  # Create a vSwitch (subnet) within the VPC
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc  # Implicit dependency: ROS creates Vpc first
      ZoneId: cn-beijing-h  # This example uses Beijing zone H
      CidrBlock: 192.168.0.0/24

  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup  # Create a security group
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:  # Inbound rule: open HTTP port 80 for Nginx
        - PortRange: 80/80
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
          NicType: internet

Conceitos principais

  • Para nomes personalizados como VpcName, VSwitchName e SecurityGroupName, use pseudoparâmetros para localizar rapidamente os recursos pertencentes a esta stack após a implantação.

  • As regras do grupo de segurança podem ser personalizadas conforme suas necessidades:

    • Para permitir acesso externo a um service web, abra a porta HTTP de entrada 80 ou 8080.

    • Para permitir login SSH, abra a porta de entrada 22.

  • Em ambientes de produção, restrinja o SourceCidrIp a intervalos de IP conhecidos em vez de 0.0.0.0/0.

Etapa 2: Definir recursos CLB e EIP

A instância CLB distribui o tráfego recebido para múltiplas instâncias ECS de backend. O EIP fornece o ponto de entrada público.

Resources:
  # ============================================================
  # Load Balancing Layer: CLB + Listener + EIP
  # ============================================================

  Slb:
    Type: ALIYUN::SLB::LoadBalancer  # Create a Classic Load Balancer instance
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      LoadBalancerName:
        Fn::Sub: slb-${ALIYUN::StackName}  # Fn::Sub concatenates strings
      AddressType: intranet  # Internal network CLB (public access via EIP)
      LoadBalancerSpec: slb.s1.small
      AutoPay: true

  SlbListener:
    Type: ALIYUN::SLB::Listener  # Configure CLB listener
    DependsOn:
      - Slb  # Explicit dependency: CLB must be created before adding a listener
    Properties:
      LoadBalancerId:
        Ref: Slb
      ListenerPort: 80          # Frontend listener port
      BackendServerPort: 80     # Backend server port (Nginx default: 80)
      Protocol: tcp             # Layer 4 TCP forwarding
      Bandwidth: -1             # -1 = unlimited; adjust based on CLB spec
      Persistence:              # Session persistence configuration
        StickySession: 'on'
        StickySessionType: insert  # Cookie insertion
        CookieTimeout: 60
        PersistenceTimeout: 180
      HealthCheck:              # Health check configuration
        HealthCheckType: tcp    # TCP port probe
        Port: 80
        Interval: 2             # Check interval: 2 seconds
        HealthyThreshold: 3     # 3 successes = healthy
        UnhealthyThreshold: 3   # 3 failures = unhealthy
        Timeout: 5              # Probe timeout: 5 seconds

  EipSlbAddress:
    Type: ALIYUN::VPC::EIP  # Create an EIP
    Properties:
      Name:
        Ref: ALIYUN::StackName
      InternetChargeType: PayByTraffic  # Pay by traffic
      Bandwidth: 10             # Bandwidth cap: 10 Mbps

  EipSlbAddressAssociation:
    Type: ALIYUN::VPC::EIPAssociation  # Associate EIP with CLB
    Properties:
      InstanceId:
        Ref: Slb                # Target: CLB instance
      AllocationId:
        Ref: EipSlbAddress      # EIP resource ID

Conceitos principais:

  • Dependências implícitas versus explícitas:

    • Ao referenciar um recurso usando Ref ou Fn::GetAtt, o ROS determina automaticamente a dependência (implícita).

    • Use DependsOn apenas quando não houver referência direta entre dois recursos, mas a lógica de negócios exigir uma ordem específica de criação.

  • O CLB usa AddressType: intranet (rede interna) e é vinculado a um EIP via ALIYUN::VPC::EIPAssociation para fornecer acesso público. Este é o padrão de arquitetura recomendado.

Etapa 3: Definir o ECS instance group e usar Cloud Assistant para instalar o Nginx

As instâncias ECS executam um script de inicialização via Cloud Assistant para montar o disco de dados e instalar o Nginx.

Resources:
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ZoneId: cn-beijing-h
      ImageId: centos_7
      InstanceType: ecs.c5.large
      MaxAmount: 2       # Create 2 ECS instances
      AllocatePublicIP: false  # No public IP (access via CLB + EIP)
      IoOptimized: optimized
      SystemDiskCategory: cloud_essd
      SystemDiskSize: 40
      DiskMappings:      # Data disk configuration
        - Category: cloud_essd
          Size: 100
      Password: <YourPassword>  # Replace with actual password during deployment

  RunSetup:
    Type: ALIYUN::ECS::RunCommand
    DependsOn: EcsInstanceGroup
    Properties:
      InstanceIds:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      Type: RunShellScript
      Sync: true
      Timeout: 300
      ContentEncoding: PlainText
      CommandContent: |
        #!/bin/bash
        # === Data disk initialization: partition, format, mount to /disk1 ===
        cat >> /root/InitDataDisk.sh << 'EOF'
        #!/bin/bash
        echo "p
        n
        p
        w
        " |  fdisk -u /dev/vdb
        EOF
        /bin/bash /root/InitDataDisk.sh
        rm -f /root/InitDataDisk.sh
        mkfs -t ext4 /dev/vdb1
        cp /etc/fstab /etc/fstab.bak
        mkdir /disk1
        echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab
        mount -a

        # === Install and start Nginx ===
        yum install -y nginx
        systemctl start nginx.service

Conceitos principais

  • Ref versus Fn::GetAtt:

    • Ref → retorna o identificador principal do recurso (por exemplo, o VpcId de uma VPC).

    • Fn::GetAtt → retorna outros atributos do recurso (por exemplo, os InstanceIds de um grupo de instâncias ECS).

Etapa 4: Definir backend server attachment do CLB — Conectar instâncias ECS ao CLB

Use ALIYUN::SLB::BackendServerAttachment para anexar o grupo de instâncias ECS ao backend do CLB.

Resources:
  # ============================================================
  # Binding Layer: Attach ECS instance group to CLB backend servers
  # ============================================================

  SlbBackendServerAttachment:
    Type: ALIYUN::SLB::BackendServerAttachment
    DependsOn:
      - EcsInstanceGroup  # Explicit dependency: wait for ECS creation
    Properties:
      LoadBalancerId:
        Ref: Slb
      BackendServerList:
        # Get all instance IDs from the ECS instance group
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      BackendServerWeightList:  # Backend server weight list
        - 100  # ECS instance 1: weight 100
        - 100  # ECS instance 2: weight 100

Conceitos principais: Regras da BackendServerWeightList

  • Os valores de peso variam de 0 a 100. A instância com maior peso recebe mais tráfego.

  • Se a BackendServerWeightList tiver menos entradas do que a BackendServerList, as instâncias ECS restantes usarão o último valor de peso da lista.

Modelo básico completo

A seguir está o modelo completo e pronto para implantação que combina todas as etapas acima:

ROSTemplateFormatVersion: '2015-09-01'
Description:
  zh-cn: Create VPC, deploy ECS with Nginx, attach to CLB, expose via EIP
  en: Create VPC, deploy ECS group with Nginx, attach to CLB, expose via EIP

Resources:
  # === 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: 80/80
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
          NicType: internet
      SecurityGroupEgress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: internet
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: intranet

  # === Compute Layer ===
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ImageId: centos_7
      InstanceType: ecs.c5.large
      MaxAmount: 2
      AllocatePublicIP: false
      IoOptimized: optimized
      SystemDiskCategory: cloud_essd
      SystemDiskSize: 40
      DiskMappings:
        - Category: cloud_essd
          Size: 100
      Password: <YourPassword>  # Replace with actual password during deployment
  RunSetup:
    Type: ALIYUN::ECS::RunCommand
    DependsOn: EcsInstanceGroup
    Properties:
      InstanceIds:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      Type: RunShellScript
      Sync: true
      Timeout: 300
      ContentEncoding: PlainText
      CommandContent: |
        #!/bin/bash
        # === Data disk initialization: partition, format, mount to /disk1 ===
        cat >> /root/InitDataDisk.sh << 'EOF'
        #!/bin/bash
        echo "p
        n
        p
        w
        " |  fdisk -u /dev/vdb
        EOF
        /bin/bash /root/InitDataDisk.sh
        rm -f /root/InitDataDisk.sh
        mkfs -t ext4 /dev/vdb1
        cp /etc/fstab /etc/fstab.bak
        mkdir /disk1
        echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab
        mount -a

        # === Install and start Nginx ===
        yum install -y nginx
        systemctl start nginx.service

  # === Load Balancing Layer ===
  Slb:
    Type: ALIYUN::SLB::LoadBalancer
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      LoadBalancerName:
        Fn::Sub: slb-${ALIYUN::StackName}
      AddressType: intranet
      LoadBalancerSpec: slb.s1.small
      AutoPay: true
  SlbListener:
    DependsOn:
      - Slb
    Type: ALIYUN::SLB::Listener
    Properties:
      LoadBalancerId:
        Ref: Slb
      ListenerPort: 80
      BackendServerPort: 80
      Protocol: tcp
      Bandwidth: -1
      Persistence:
        StickySession: 'on'
        StickySessionType: insert
        CookieTimeout: 60
        PersistenceTimeout: 180
      HealthCheck:
        HealthCheckType: tcp
        Port: 80
        Interval: 2
        HealthyThreshold: 3
        UnhealthyThreshold: 3
        Timeout: 5
  EipSlbAddress:
    Type: ALIYUN::VPC::EIP
    Properties:
      Name:
        Ref: ALIYUN::StackName
      InternetChargeType: PayByTraffic
      Bandwidth: 10
  EipSlbAddressAssociation:
    Type: ALIYUN::VPC::EIPAssociation
    Properties:
      InstanceId:
        Ref: Slb
      AllocationId:
        Ref: EipSlbAddress

  # === Binding Layer ===
  SlbBackendServerAttachment:
    DependsOn:
      - EcsInstanceGroup
    Type: ALIYUN::SLB::BackendServerAttachment
    Properties:
      BackendServerList:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      LoadBalancerId:
        Ref: Slb
      BackendServerWeightList:
        - 100
        - 100

Outputs:
  Endpoint:
    Description:
      zh-cn: Public HTTP endpoint
      en: Public HTTP endpoint
    Value:
      Fn::Sub:
        - http://${ServerAddress}
        - ServerAddress:
            Fn::GetAtt:
              - EipSlbAddress
              - EipAddress

Conceitos principais:

Após o modelo criar os recursos, use a seção Outputs para consultar atributos de recursos, como o endereço EIP vinculado ao CLB.

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

O modelo básico usa valores fixos para InstanceType do ECS, SystemDiskCategory e LoadBalancerSpec do CLB. Parametrizar esses valores melhora significativamente a flexibilidade do modelo.

Este modelo introduz os seguintes recursos avançados:

  1. Parametrização (Parameters) : Extrai configurações variáveis como parâmetros preenchidos dinamicamente no momento da implantação.

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

  3. Agrupamento de parâmetros (Metadata): Agrupa parâmetros por categoria lógica no console para melhorar a experiência de configuração.

Diagrama de dependência de parâmetros

O diagrama a seguir mostra a cadeia de dependências entre o tipo de instância ECS, o tipo de disco do sistema e a especificação da instância CLB:

ZoneId (zone — core filter parameter)
  ├── EcsInstanceType (filtered by zone + billing type)
  │     ├── SystemDiskCategory (filtered by zone + instance type)
  │     └── DataDiskCategory (filtered by zone + instance type)
  └── LoadBalancerSpec (filtered by zone)

PayType (billing type)
  ├── PayPeriodUnit (shown only when PrePaid)
  ├── PayPeriod (shown only when PrePaid)
  └── EcsInstanceType (filtered by zone + billing type)

Lógica principal: Selecione primeiro a zona e o tipo de faturamento do ECS e, em seguida, filtre os tipos de instância ECS e as especificações do CLB de acordo. Quando o faturamento por assinatura for selecionado, forneça a unidade e a duração do período de faturamento. Por fim, filtre os tipos de disco com base na zona e no tipo de instância ECS. Cada etapa mostra apenas as opções válidas nas condições atuais, evitando combinações inválidas de parâmetros.

Explicação sobre AssociationProperty

1. ZoneId — Zona de disponibilidade (Parâmetro base)

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

ZoneId:
    Type: String
    Label:
      zh-cn: VSwitch Zone
      en: VSwitch Availability Zone
    Description:
      zh-cn: Select zone for VSwitch, ECS and CLB
      en: Select the availability zone for VSwitch, ECS and CLB will be deployed here
    AssociationProperty: ALIYUN::ECS::ZoneId

Este parâmetro é a base de filtragem para todos os parâmetros subsequentes. Após selecionar uma zona, as listas de opções de todos os outros parâmetros são atualizadas automaticamente.

2. PayType — Tipo de faturamento do ECS

Defina o parâmetro PayType e use AssociationPropertyMetadata.Visible.Condition para mostrar os parâmetros de duração de faturamento apenas quando Subscription (PrePaid) for selecionado:

Parameters:
  PayType:
    Type: String
    Label:
      zh-cn: 付费类型
      en: Charge Type
    Default: PostPaid
    AllowedValues:
      - PostPaid
      - PrePaid
    AssociationProperty: ChargeType
    AssociationPropertyMetadata:
      LocaleKey: InstanceChargeType
  PayPeriodUnit:
    Type: String
    Default: Month
    AssociationProperty: PayPeriodUnit
    AssociationPropertyMetadata:
      Visible:  # Conditional display: show only when PayType is not PostPaid
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
  PayPeriod:
    Type: Number
    Label:
      zh-cn: 购买资源时长
      en: Period
    Default: 1
    AllowedValues:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
    AssociationProperty: PayPeriod
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid

Quando Subscription (PostPaid) é selecionado no console ROS, os parâmetros de duração de faturamento são ocultados automaticamente. Eles aparecem apenas quando o usuário seleciona Subscription (PrePaid).

3. EcsInstanceType — Tipo de instância ECS

Defina AssociationProperty como ALIYUN::ECS::Instance::InstanceType para listar os tipos de instância ECS disponíveis, filtrados por ${ZoneId} e ${PayType}:

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

A disponibilidade do tipo de instância varia por zona. Sem filtragem, os usuários podem selecionar um tipo de instância sem estoque disponível na zona escolhida, causando falha na criação da stack.

4. SystemDiskCategory — Tipo de disco do sistema

Defina AssociationProperty como ALIYUN::ECS::Disk::SystemDiskCategory para listar os tipos de disco do sistema disponíveis, filtrados por ${ZoneId} e ${EcsInstanceType}:

SystemDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: System Disk Category
    Description:
      zh-cn: 选择系统盘类型。可选值:cloud_essd(ESSD云盘)、cloud_ssd(SSD云盘)、cloud_efficiency(高效云盘)
      en: "System disk type. Options: cloud_essd, cloud_ssd, cloud_efficiency"
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}

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

5. LoadBalancerSpec — Especificação da instância CLB

Defina AssociationProperty como ALIYUN::SLB::Instance::InstanceType para listar as especificações de CLB disponíveis, filtradas por ${ZoneId}:

LoadBalancerSpec:
    Type: String
    Label:
      zh-cn: CLB实例规格
      en: CLB Instance Spec
    Description:
      zh-cn: 选择CLB实例规格,根据可用区自动过滤
      en: Select CLB instance specification
    AssociationProperty: ALIYUN::SLB::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}

Modelo de filtragem dinâmica de parâmetros

Parameters:
  ZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch Availability Zone
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和CLB将部署在此可用区
      en: Select the availability zone for deployment
    AssociationProperty: ALIYUN::ECS::ZoneId
  PayType:
    Type: String
    Label:
      zh-cn: 付费类型
      en: Charge Type
    Default: PostPaid
    AllowedValues:
      - PostPaid
      - PrePaid
    AssociationProperty: ChargeType
    AssociationPropertyMetadata:
      LocaleKey: InstanceChargeType
  PayPeriodUnit:
    Type: String
    Default: Month
    AssociationProperty: PayPeriodUnit
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
  PayPeriod:
    Type: Number
    Label:
      zh-cn: 购买资源时长
      en: Period
    Default: 1
    AllowedValues:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
    AssociationProperty: PayPeriod
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
  EcsInstanceType:
    Type: String
    Label:
      zh-cn: ECS实例规格
      en: ECS Instance Type
    Description:
      zh-cn: 选择ECS实例规格。列表已根据可用区和付费类型自动过滤。
      en: Select ECS instance type, filtered by zone and charge type.
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceChargeType: ${PayType}
  SystemDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: System Disk Category
    Description:
      zh-cn: 选择系统盘类型。可选值:cloud_essd(ESSD云盘)、cloud_ssd(SSD云盘)、cloud_efficiency(高效云盘)
      en: System disk type
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}
  DataDiskCategory:
    Type: String
    Label:
      zh-cn: 数据盘类型
      en: Data Disk Category
    Description:
      zh-cn: 选择数据盘类型。可选值:cloud_essd、cloud_ssd、cloud_efficiency
      en: Data disk type
    AssociationProperty: ALIYUN::ECS::Disk::DataDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}
  LoadBalancerSpec:
    Type: String
    Label:
      zh-cn: CLB实例规格
      en: CLB Instance Spec
    Description:
      zh-cn: 选择CLB实例规格,根据可用区自动过滤
      en: Select CLB instance specification
    AssociationProperty: ALIYUN::SLB::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}

Como funciona o AssociationProperty

Quando um usuário cria uma stack no console ROS, a seleção de parâmetros ocorre em cascata:

  1. Seleção da zona (ZoneId).

  2. Seleção do tipo de faturamento do ECS (PayType).

  3. Atualização automática da lista suspensa de tipos de instância ECS, mostrando apenas tipos com estoque disponível na zona selecionada que suportam o tipo de faturamento escolhido.

  4. Atualização automática da lista suspensa de especificações de instância CLB, mostrando apenas especificações suportadas na zona selecionada.

  5. Após a seleção de um tipo de instância ECS, atualização automática das listas suspensas de tipo de disco do sistema e tipo de disco de dados, mostrando apenas tipos suportados tanto pela zona quanto pelo tipo de instância selecionados.

Essa abordagem garante que cada seleção mostre apenas opções válidas nas condições atuais, evitando falhas de implantação decorrentes de combinações inválidas de parâmetros desde a origem.

Agrupamento de parâmetros com Metadata

Usando ALIYUN::ROS::Interface em Metadata, você pode organizar parâmetros em grupos lógicos com rótulos. O console ROS exibe os parâmetros em grupos, melhorando significativamente a experiência de configuração.

Sintaxe de Metadata

Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:           # Parameter group list (required)
      - Parameters:            # List of parameter names in this group (required)
          - paramName1
          - paramName2
        Label:                 # Group label (required)
          default:
            zh-cn: Chinese label
            en: English label

Regras de sintaxe de Metadata:

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

  • Os nomes de parâmetros listados em Metadata.ALIYUN::ROS::Interface.ParameterGroups.Parameters devem corresponder exatamente aos nomes definidos na seção Parameters do modelo.

  • Parâmetros não incluídos em nenhum grupo são exibidos na área desagrupada do console.

Design de grupos de parâmetros para este modelo

Este modelo organiza 14 parâmetros em 4 grupos:

┌─────────────────────────────────────────────────┐
│  Network Configuration                          │
│  ├── VSwitch Availability Zone (ZoneId)         │
│  ├── VPC CIDR Block (VpcCidrBlock)              │
│  └── vSwitch CIDR Block (VSwitchCidrBlock)      │
├─────────────────────────────────────────────────┤
│  Billing Configuration                          │
│  ├── Charge Type (PayType)                      │
│  ├── Pay Period Unit (PayPeriodUnit)             │
│  └── Period (PayPeriod)                         │
├─────────────────────────────────────────────────┤
│  ECS Instance Configuration                     │
│  ├── ECS Instance Type (EcsInstanceType)        │
│  ├── System Disk Category (SystemDiskCategory)  │
│  ├── System Disk Size (SystemDiskSize)          │
│  ├── Data Disk Category (DataDiskCategory)      │
│  ├── Data Disk Size (DataDiskSize)              │
│  └── ECS Instance Password (InstancePassword)  │
├─────────────────────────────────────────────────┤
│  CLB Configuration                              │
│  ├── CLB Instance Spec (LoadBalancerSpec)       │
│  └── EIP Bandwidth (Bandwidth)                  │
└─────────────────────────────────────────────────┘

Modelo de grupo de parâmetros de Metadata

Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - ZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            zh-cn: Network Configuration
            en: Network Configuration
      - Parameters:
          - PayType
          - PayPeriodUnit
          - PayPeriod
        Label:
          default:
            zh-cn: Charge Type
            en: Billing Configuration
      - Parameters:
          - EcsInstanceType
          - SystemDiskCategory
          - SystemDiskSize
          - DataDiskCategory
          - DataDiskSize
          - InstancePassword
        Label:
          default:
            zh-cn: ECS Instance Configuration
            en: ECS Instance Configuration
      - Parameters:
          - LoadBalancerSpec
          - Bandwidth
        Label:
          default:
            zh-cn: CLB Configuration
            en: CLB Configuration

Modelo avançado completo

ROSTemplateFormatVersion: '2015-09-01'
Description:
  zh-cn: >-
    参数化模板:创建ECS实例组部署Nginx服务,挂载到CLB负载均衡器,通过EIP对外提供HTTP服务。
    支持动态选择可用区、实例规格、磁盘类型和CLB规格,支持按量/包年包月付费模式切换。
  en: >-
    Parameterized template: Create ECS group with Nginx, attach to CLB, expose via EIP.
    Supports dynamic selection and PayAsYouGo/Subscription billing switch.

Parameters:
  # ─── 基础网络参数 ───
  ZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch Availability Zone
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和CLB将部署在此可用区
      en: Select the availability zone for deployment
    AssociationProperty: ALIYUN::ECS::ZoneId

  VpcCidrBlock:
    Type: String
    Label:
      zh-cn: VPC网段
      en: VPC CIDR Block
    Description:
      zh-cn: VPC的IP地址段范围。推荐使用 10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16
      en: VPC IP address range
    Default: 192.168.0.0/16

  VSwitchCidrBlock:
    Type: String
    Label:
      zh-cn: 交换机网段
      en: VSwitch CIDR Block
    Description:
      zh-cn: 必须是VPC网段的子网段,且不能与同VPC下其他交换机网段重叠
      en: Must be a subnet of VPC CIDR
    Default: 192.168.0.0/24

  # ─── 付费类型参数 ───
  PayType:
    Type: String
    Label:
      zh-cn: 付费类型
      en: Charge Type
    Default: PostPaid
    AllowedValues:
      - PostPaid
      - PrePaid
    AssociationProperty: ChargeType
    AssociationPropertyMetadata:
      LocaleKey: InstanceChargeType

  PayPeriodUnit:
    Type: String
    Label:
      zh-cn: 购买资源时长周期
      en: Pay Period Unit
    Description:
      zh-cn: 包年包月的周期单位。Month为月,Year为年。仅包年包月时有效。
      en: Subscription period unit. Only valid for PrePaid.
    Default: Month
    AllowedValues:
      - Month
      - Year
    AssociationProperty: PayPeriodUnit
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid

  PayPeriod:
    Type: Number
    Label:
      zh-cn: 购买资源时长
      en: Period
    Default: 1
    AllowedValues:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
    AssociationProperty: PayPeriod
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid

  # ─── ECS实例参数 ───
  EcsInstanceType:
    Type: String
    Label:
      zh-cn: ECS实例规格
      en: ECS Instance Type
    Description:
      zh-cn: 选择ECS实例规格。列表已根据可用区和付费类型自动过滤。
      en: Select ECS instance type, filtered by zone and charge type.
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceChargeType: ${PayType}

  SystemDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: System Disk Category
    Description:
      zh-cn: 选择系统盘类型。可选值:cloud_essd(ESSD云盘)、cloud_ssd(SSD云盘)、cloud_efficiency(高效云盘)
      en: System disk type
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}

  SystemDiskSize:
    Type: Number
    Label:
      zh-cn: 系统盘大小(GB)
      en: System Disk Size (GB)
    Description:
      zh-cn: 系统盘大小,取值范围40~500 GB
      en: System disk size, range 40-500 GB
    Default: 40
    MinValue: 40
    MaxValue: 500

  DataDiskCategory:
    Type: String
    Label:
      zh-cn: 数据盘类型
      en: Data Disk Category
    Description:
      zh-cn: 选择数据盘类型。可选值:cloud_essd、cloud_ssd、cloud_efficiency
      en: Data disk type
    AssociationProperty: ALIYUN::ECS::Disk::DataDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}

  DataDiskSize:
    Type: Number
    Label:
      zh-cn: 数据盘大小(GB)
      en: Data Disk Size (GB)
    Description:
      zh-cn: ECS数据盘大小,取值范围20~32768 GB
      en: Data disk size, range 20-32768 GB
    Default: 100
    MinValue: 20
    MaxValue: 32768

  InstancePassword:
    Type: String
    NoEcho: true
    Label:
      zh-cn: ECS实例密码
      en: ECS Instance Password
    Description:
      zh-cn: 长度8-30位,需包含大写字母、小写字母、数字、特殊字符中的至少三种
      en: Length 8-30, must contain at least three character types
    MinLength: 8
    MaxLength: 30
    AssociationProperty: ALIYUN::ECS::Instance::Password

  # ─── 负载均衡参数 ───
  LoadBalancerSpec:
    Type: String
    Label:
      zh-cn: CLB实例规格
      en: CLB Instance Spec
    Description:
      zh-cn: 选择CLB实例规格,根据可用区自动过滤
      en: Select CLB instance specification
    AssociationProperty: ALIYUN::SLB::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}

  Bandwidth:
    Type: Number
    Label:
      zh-cn: EIP带宽(Mbps)
      en: EIP Bandwidth (Mbps)
    Description:
      zh-cn: 弹性公网IP的带宽上限,取值范围1~1000 Mbps
      en: EIP bandwidth cap, range 1-1000 Mbps
    Default: 10
    MinValue: 1
    MaxValue: 1000

Resources:
  # === 基础网络层 ===
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      CidrBlock:
        Ref: VpcCidrBlock
      VpcName:
        Ref: ALIYUN::StackName
  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      ZoneId:
        Ref: ZoneId
      CidrBlock:
        Ref: VSwitchCidrBlock
  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:
        - PortRange: 80/80
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
          NicType: internet
      SecurityGroupEgress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: internet
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: intranet

  # === 计算层 ===
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      InstanceChargeType:
        Ref: PayType
      PeriodUnit:
        Ref: PayPeriodUnit
      Period:
        Ref: PayPeriod
      IoOptimized: optimized
      SystemDiskCategory:
        Ref: SystemDiskCategory
      SystemDiskSize:
        Ref: SystemDiskSize
      DiskMappings:
        - Category:
            Ref: DataDiskCategory
          Size:
            Ref: DataDiskSize
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      MaxAmount: 2
      ImageId: centos_7
      InstanceType:
        Ref: EcsInstanceType
      Password:
        Ref: InstancePassword
      AllocatePublicIP: false
  RunSetup:
    Type: ALIYUN::ECS::RunCommand
    DependsOn: EcsInstanceGroup
    Properties:
      InstanceIds:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      Type: RunShellScript
      Sync: true
      Timeout: 300
      ContentEncoding: PlainText
      CommandContent: |
        #!/bin/bash
        # === 数据盘初始化:分区、格式化、挂载到/disk1 ===
        cat >> /root/InitDataDisk.sh << 'EOF'
        #!/bin/bash
        echo "p
        n
        p
        w
        " |  fdisk -u /dev/vdb
        EOF
        /bin/bash /root/InitDataDisk.sh
        rm -f /root/InitDataDisk.sh
        mkfs -t ext4 /dev/vdb1
        cp /etc/fstab /etc/fstab.bak
        mkdir /disk1
        echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab
        mount -a

        # === 安装并启动Nginx ===
        yum install -y nginx
        systemctl start nginx.service

  # === 负载均衡层 ===
  Slb:
    Type: ALIYUN::SLB::LoadBalancer
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      LoadBalancerName:
        Fn::Sub: slb-${ALIYUN::StackName}
      PayType:
        Ref: PayType
      PricingCycle:
        Ref: PayPeriodUnit
      Duration:
        Ref: PayPeriod
      AddressType: intranet
      LoadBalancerSpec:
        Ref: LoadBalancerSpec
      AutoPay: true
  EipSlbAddress:
    Type: ALIYUN::VPC::EIP
    Properties:
      Name:
        Ref: ALIYUN::StackName
      InternetChargeType: PayByTraffic
      Bandwidth:
        Ref: Bandwidth
  EipSlbAddressAssociation:
    Type: ALIYUN::VPC::EIPAssociation
    Properties:
      InstanceId:
        Ref: Slb
      AllocationId:
        Ref: EipSlbAddress
  SlbBackendServerAttachment:
    DependsOn:
      - EcsInstanceGroup
    Type: ALIYUN::SLB::BackendServerAttachment
    Properties:
      BackendServerList:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      LoadBalancerId:
        Ref: Slb
      BackendServerWeightList:
        - 100
        - 100
  SlbListener:
    DependsOn:
      - Slb
    Type: ALIYUN::SLB::Listener
    Properties:
      LoadBalancerId:
        Ref: Slb
      ListenerPort: 80
      BackendServerPort: 80
      Protocol: tcp
      Bandwidth: -1
      Persistence:
        StickySession: 'on'
        StickySessionType: insert
        CookieTimeout: 60
        PersistenceTimeout: 180
      HealthCheck:
        HealthCheckType: tcp
        Port: 80
        Interval: 2
        HealthyThreshold: 3
        UnhealthyThreshold: 3
        Timeout: 5

Outputs:
  Endpoint:
    Description:
      zh-cn: 对外暴露的公网访问地址
      en: Public HTTP endpoint
    Value:
      Fn::Sub:
        - http://${ServerAddress}
        - ServerAddress:
            Fn::GetAtt:
              - EipSlbAddress
              - EipAddress

# === 元数据:控制台参数分组配置 ===
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - ZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            zh-cn: 基础网络配置
            en: Network Configuration
      - Parameters:
          - PayType
          - PayPeriodUnit
          - PayPeriod
        Label:
          default:
            zh-cn: 付费类型
            en: Billing Configuration
      - Parameters:
          - EcsInstanceType
          - SystemDiskCategory
          - SystemDiskSize
          - DataDiskCategory
          - DataDiskSize
          - InstancePassword
        Label:ROSTemplateFormatVersion: '2015-09-01'
Description:
  zh-cn: >-
    参数化模板:创建ECS实例组部署Nginx服务,挂载到CLB负载均衡器,通过EIP对外提供HTTP服务。
    支持动态选择可用区、实例规格、磁盘类型和CLB规格,支持按量/包年包月付费模式切换。
  en: >-
    Parameterized template: Create ECS group with Nginx, attach to CLB, expose via EIP.
    Supports dynamic selection and PayAsYouGo/Subscription billing switch.

Parameters:
  # ─── Basic network parameters ───
  ZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch Availability Zone
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和CLB将部署在此可用区
      en: Select the availability zone for deployment
    AssociationProperty: ALIYUN::ECS::ZoneId

  VpcCidrBlock:
    Type: String
    Label:
      zh-cn: VPC网段
      en: VPC CIDR Block
    Description:
      zh-cn: VPC的IP地址段范围。推荐使用 10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16
      en: VPC IP address range
    Default: 192.168.0.0/16

  VSwitchCidrBlock:
    Type: String
    Label:
      zh-cn: 交换机网段
      en: VSwitch CIDR Block
    Description:
      zh-cn: 必须是VPC网段的子网段,且不能与同VPC下其他交换机网段重叠
      en: Must be a subnet of VPC CIDR
    Default: 192.168.0.0/24

  # ─── Paytype Paramters ───
  PayType:
    Type: String
    Label:
      zh-cn: 付费类型
      en: Charge Type
    Default: PostPaid
    AllowedValues:
      - PostPaid
      - PrePaid
    AssociationProperty: ChargeType
    AssociationPropertyMetadata:
      LocaleKey: InstanceChargeType

  PayPeriodUnit:
    Type: String
    Label:
      zh-cn: 购买资源时长周期
      en: Pay Period Unit
    Description:
      zh-cn: 包年包月的周期单位。Month为月,Year为年。仅包年包月时有效。
      en: Subscription period unit. Only valid for PrePaid.
    Default: Month
    AllowedValues:
      - Month
      - Year
    AssociationProperty: PayPeriodUnit
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid

  PayPeriod:
    Type: Number
    Label:
      zh-cn: 购买资源时长
      en: Period
    Default: 1
    AllowedValues:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
    AssociationProperty: PayPeriod
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid

  # ─── ECS instance parameters ───
  EcsInstanceType:
    Type: String
    Label:
      zh-cn: ECS实例规格
      en: ECS Instance Type
    Description:
      zh-cn: 选择ECS实例规格。列表已根据可用区和付费类型自动过滤。
      en: Select ECS instance type, filtered by zone and charge type.
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceChargeType: ${PayType}

  SystemDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: System Disk Category
    Description:
      zh-cn: 选择系统盘类型。可选值:cloud_essd(ESSD云盘)、cloud_ssd(SSD云盘)、cloud_efficiency(高效云盘)
      en: System disk type
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}

  SystemDiskSize:
    Type: Number
    Label:
      zh-cn: 系统盘大小(GB)
      en: System Disk Size (GB)
    Description:
      zh-cn: 系统盘大小,取值范围40~500 GB
      en: System disk size, range 40-500 GB
    Default: 40
    MinValue: 40
    MaxValue: 500

  DataDiskCategory:
    Type: String
    Label:
      zh-cn: 数据盘类型
      en: Data Disk Category
    Description:
      zh-cn: 选择数据盘类型。可选值:cloud_essd、cloud_ssd、cloud_efficiency
      en: Data disk type
    AssociationProperty: ALIYUN::ECS::Disk::DataDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceType: ${EcsInstanceType}

  DataDiskSize:
    Type: Number
    Label:
      zh-cn: 数据盘大小(GB)
      en: Data Disk Size (GB)
    Description:
      zh-cn: ECS数据盘大小,取值范围20~32768 GB
      en: Data disk size, range 20-32768 GB
    Default: 100
    MinValue: 20
    MaxValue: 32768

  InstancePassword:
    Type: String
    NoEcho: true
    Label:
      zh-cn: ECS实例密码
      en: ECS Instance Password
    Description:
      zh-cn: 长度8-30位,需包含大写字母、小写字母、数字、特殊字符中的至少三种
      en: Length 8-30, must contain at least three character types
    MinLength: 8
    MaxLength: 30
    AssociationProperty: ALIYUN::ECS::Instance::Password

  # ─── CLB paramters ───
  LoadBalancerSpec:
    Type: String
    Label:
      zh-cn: CLB实例规格
      en: CLB Instance Spec
    Description:
      zh-cn: 选择CLB实例规格,根据可用区自动过滤
      en: Select CLB instance specification
    AssociationProperty: ALIYUN::SLB::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}

  Bandwidth:
    Type: Number
    Label:
      zh-cn: EIP带宽(Mbps)
      en: EIP Bandwidth (Mbps)
    Description:
      zh-cn: 弹性公网IP的带宽上限,取值范围1~1000 Mbps
      en: EIP bandwidth cap, range 1-1000 Mbps
    Default: 10
    MinValue: 1
    MaxValue: 1000

Resources:
  # === 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: ZoneId
      CidrBlock:
        Ref: VSwitchCidrBlock
  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:
        - PortRange: 80/80
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
          NicType: internet
      SecurityGroupEgress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: internet
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          DestCidrIp: 0.0.0.0/0
          NicType: intranet

  # === Computing layer ===
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      InstanceChargeType:
        Ref: PayType
      PeriodUnit:
        Ref: PayPeriodUnit
      Period:
        Ref: PayPeriod
      IoOptimized: optimized
      SystemDiskCategory:
        Ref: SystemDiskCategory
      SystemDiskSize:
        Ref: SystemDiskSize
      DiskMappings:
        - Category:
            Ref: DataDiskCategory
          Size:
            Ref: DataDiskSize
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      MaxAmount: 2
      ImageId: centos_7
      InstanceType:
        Ref: EcsInstanceType
      Password:
        Ref: InstancePassword
      AllocatePublicIP: false
  RunSetup:
    Type: ALIYUN::ECS::RunCommand
    DependsOn: EcsInstanceGroup
    Properties:
      InstanceIds:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      Type: RunShellScript
      Sync: true
      Timeout: 300
      ContentEncoding: PlainText
      CommandContent: |
        #!/bin/bash
        # === 数据盘初始化:分区、格式化、挂载到/disk1 ===
        cat >> /root/InitDataDisk.sh << 'EOF'
        #!/bin/bash
        echo "p
        n
        p
        w
        " |  fdisk -u /dev/vdb
        EOF
        /bin/bash /root/InitDataDisk.sh
        rm -f /root/InitDataDisk.sh
        mkfs -t ext4 /dev/vdb1
        cp /etc/fstab /etc/fstab.bak
        mkdir /disk1
        echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab
        mount -a

        # === install and start Nginx ===
        yum install -y nginx
        systemctl start nginx.service

  # === CLB layer ===
  Slb:
    Type: ALIYUN::SLB::LoadBalancer
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      LoadBalancerName:
        Fn::Sub: slb-${ALIYUN::StackName}
      PayType:
        Ref: PayType
      PricingCycle:
        Ref: PayPeriodUnit
      Duration:
        Ref: PayPeriod
      AddressType: intranet
      LoadBalancerSpec:
        Ref: LoadBalancerSpec
      AutoPay: true
  EipSlbAddress:
    Type: ALIYUN::VPC::EIP
    Properties:
      Name:
        Ref: ALIYUN::StackName
      InternetChargeType: PayByTraffic
      Bandwidth:
        Ref: Bandwidth
  EipSlbAddressAssociation:
    Type: ALIYUN::VPC::EIPAssociation
    Properties:
      InstanceId:
        Ref: Slb
      AllocationId:
        Ref: EipSlbAddress
  SlbBackendServerAttachment:
    DependsOn:
      - EcsInstanceGroup
    Type: ALIYUN::SLB::BackendServerAttachment
    Properties:
      BackendServerList:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      LoadBalancerId:
        Ref: Slb
      BackendServerWeightList:
        - 100
        - 100
  SlbListener:
    DependsOn:
      - Slb
    Type: ALIYUN::SLB::Listener
    Properties:
      LoadBalancerId:
        Ref: Slb
      ListenerPort: 80
      BackendServerPort: 80
      Protocol: tcp
      Bandwidth: -1
      Persistence:
        StickySession: 'on'
        StickySessionType: insert
        CookieTimeout: 60
        PersistenceTimeout: 180
      HealthCheck:
        HealthCheckType: tcp
        Port: 80
        Interval: 2
        HealthyThreshold: 3
        UnhealthyThreshold: 3
        Timeout: 5

Outputs:
  Endpoint:
    Description:
      zh-cn: 对外暴露的公网访问地址
      en: Public HTTP endpoint
    Value:
      Fn::Sub:
        - http://${ServerAddress}
        - ServerAddress:
            Fn::GetAtt:
              - EipSlbAddress
              - EipAddress

# === Metadata ===
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - ZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            zh-cn: 基础网络配置
            en: Network Configuration
      - Parameters:
          - PayType
          - PayPeriodUnit
          - PayPeriod
        Label:
          default:
            zh-cn: 付费类型
            en: Billing Configuration
      - Parameters:
          - EcsInstanceType
          - SystemDiskCategory
          - SystemDiskSize
          - DataDiskCategory
          - DataDiskSize
          - InstancePassword
        Label:
          default:
            zh-cn: ECS实例配置
            en: ECS Instance Configuration
      - Parameters:
          - LoadBalancerSpec
          - Bandwidth
        Label:
          default:
            zh-cn: 负载均衡配置
            en: CLB Configuration
          default:
            zh-cn: ECS实例配置
            en: ECS Instance Configuration
      - Parameters:
          - LoadBalancerSpec
          - Bandwidth
        Label:
          default:
            zh-cn: 负载均衡配置
            en: CLB Configuration

Referência rápida de funções integradas do ROS

Função

Exemplo de sintaxe

Finalidade neste modelo

Observações

Ref

Ref: MyVpc

Referencia valores de parâmetros ou identificadores primários de recursos.

Retorna o valor do parâmetro ao referenciar um Parameter; retorna o id primário ao referenciar um Resource.

Fn::GetAtt

Fn::GetAtt: [EcsInstanceGroup, InstanceIds]

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

Retorna atributos de saída de recursos (identificadores não primários) após a criação.

Fn::Sub

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

Concatena o nome do CLB.

Referencia variáveis com ${Var} em uma string de modelo.

Fn::Not + Fn::Equals

Fn::Not: Fn::Equals: [${PayType}, PostPaid]

Exibição condicional de parâmetros de duração de faturamento.

Negação lógica + comparação de igualdade, usada para condições Visible.

Implantação

Parâmetros de implantação

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

Parâmetro

Tipo

Descrição

Restrições

ZoneId

String

id da zona.

Selecionado dinamicamente no console.

EcsInstanceType

String

Tipo de instância ECS.

Filtrado automaticamente por zona + tipo de faturamento.

SystemDiskCategory

String

Tipo de disco do sistema.

Filtrado automaticamente por zona + tipo de instância.

DataDiskCategory

String

Tipo de disco de dados.

Filtrado automaticamente por zona + tipo de instância.

LoadBalancerSpec

String

Especificação da instância CLB.

Filtrado automaticamente por zona.

Parâmetros opcionais (possuem valores padrão, podem ser deixados vazios)

Parâmetro

Padrão

Descrição

VpcCidrBlock

192.168.0.0/16

Bloco CIDR da VPC.

VSwitchCidrBlock

192.168.0.0/24

Bloco CIDR de sub-rede do vSwitch.

PayType

PostPaid

Tipo de faturamento (pagamento conforme o uso / assinatura).

PayPeriodUnit

Month

Unidade do período de faturamento (mostrado apenas quando PrePaid).

PayPeriod

1

Duração do faturamento (mostrado apenas quando PrePaid).

SystemDiskSize

40

Tamanho do disco do sistema (GB), intervalo: 40–500.

DataDiskSize

100

Tamanho do disco de dados (GB), intervalo: 20–32768.

Bandwidth

10

Limite de largura de banda do EIP (Mbps), intervalo: 1–1000.

InstancePassword

Senha de login da instância ECS. Comprimento de 8–30 caracteres, deve conter pelo menos três tipos de caracteres: letras maiúsculas, letras minúsculas, dígitos, caracteres especiais.

Métodos de implantação

Método 1: Implantar via 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 através do ROS IaC Code

O IaC Code é um assistente de infraestrutura como código com IA para infraestrutura em cloud. Ele ajuda usuários de recursos em cloud e engenheiros de O&M a gerar, implantar e gerenciar modelos de infraestrutura por meio de um fluxo de trabalho de terminal.

# Prompt
Help me deploy a group of ECS instances and attach them to a CLB load balancer with the following requirements:
1. Use a newly created VPC and vSwitch
2. Create 2 ECS instances and install and start Nginx via CommandContent
3. Use WaitCondition to wait for Nginx installation to complete before attaching to CLB
4. Configure CLB with TCP port 80 listener and health checks
5. Create an EIP and associate it with the CLB to provide HTTP access
6. Open inbound port 80 in the security group
7. Configure ECS with a 100 GB data disk and auto-partition and mount it in CommandContent
8. Configure ZoneId, EcsInstanceType, SystemDiskCategory, DataDiskCategory, LoadBalancerSpec with AssociationProperty for dynamic console filtering
9. Support switching between pay-as-you-go and subscription billing, with subscription parameters using conditional display

Perguntas frequentes

P1: A verificação de integridade do CLB continua falhando e as instâncias ECS de backend mostram "Unhealthy"

Causa: O service Nginx na instância ECS não está executando corretamente ou o grupo de segurança não abriu a porta 80.

Etapas de solução de problemas:

  1. Log on the ECS instances e execute systemctl status nginx para confirmar se o Nginx está em execução.

  2. Verifique se a regra de entrada do grupo de segurança abre a porta 80 (PortRange: 80/80).

  3. Confira se a Port na configuração de verificação de integridade do CLB corresponde à porta do listener do Nginx.

  4. Aumente o HealthyThreshold (limiar de integridade) e o Interval (intervalo de verificação) conforme apropriado.

P2: Como ajusto a proporção de distribuição de tráfego entre os servidores de backend?

Solução: Modifique a BackendServerWeightList em SlbBackendServerAttachment:

BackendServerWeightList:
  - 100  # ECS instance 1: receives approximately 67% of traffic
  - 50   # ECS instance 2: receives approximately 33% of traffic

A proporção de peso é 100:50, o que significa que a instância ECS 1 lida com aproximadamente 2/3 das solicitações. Para retirar temporariamente uma instância ECS de service (descomissionamento em escala de cinza), defina seu peso como 0.

P3: Como substituo o script de implantação do Nginx no ECS::RunCommand por um aplicativo personalizado?

Solução: Modifique a seção de instalação e início do script CommandContent mantendo a lógica de inicialização do disco de dados:

CommandContent:
  Fn::Sub:
    - |
      #!/bin/bash
      # ... Data disk initialization code (keep as is) ...

      # === Replace with your application deployment script ===
      # Example: Deploy a Java Spring Boot application
      yum install -y java-11-openjdk
      wget -P /disk1 https://your-oss-bucket.oss-cn-hangzhou.aliyuncs.com/app.jar
      nohup java -jar /disk1/app.jar --server.port=80

P4: Como substituo o CLB pelo ALB (Application Load Balancer)?

Etapas de migração:

  1. Substitua ALIYUN::SLB::LoadBalancer por ALIYUN::ALB::LoadBalancer.

  2. Use ALIYUN::ALB::ServerGroup para criar um grupo de servidores e adicionar instâncias ECS de backend.

  3. Use ALIYUN::ALB::Listener + ALIYUN::ALB::Rule para configurar o roteamento HTTP/HTTPS da Camada 7.

  4. O ALB suporta nativamente acesso à rede pública — não há necessidade de associar um EIP separadamente.

P5: Como uso uma VPC existente em vez de criar uma nova?

Solução: Remova a VPC e o vSwitch de Resources e passe-os como parâmetros:

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

Para mais problemas comuns de implantação, consulte FAQ.

Referências