Todos os produtos
Search
Central de documentação

Resource Orchestration Service:Use uma instância ECS para conectar-se a uma instância ApsaraDB RDS e inicializar o banco de dados

Última atualização: Sep 09, 2026

Neste tutorial, você usa o Alibaba Cloud Resource Orchestration Service (ROS) para provisionar uma instância ECS e uma instância ApsaraDB RDS MySQL em uma única VPC. Em seguida, usa o Cloud Assistant para executar um script de inicialização que importa um conjunto de dados de exemplo para o RDS. Ao final, você terá um ambiente funcional de ECS + RDS criado a partir de um único modelo YAML, pronto para reimplantação sob demanda.

Visão geral da solução

Cenário de negócio

Crie uma instância Elastic Compute Service (ECS) e uma instância ApsaraDB RDS MySQL na mesma Virtual Private Cloud (VPC) da Alibaba Cloud. A instância ECS conecta-se à instância RDS pela rede interna da VPC, e o Cloud Assistant (RunCommand) executa automaticamente um script shell na instância ECS para inicializar o banco de dados.

Recursos criados

Recurso

Tipo de recurso ROS

Descrição

1

VPC

ALIYUN::ECS::VPC

Fornece um ambiente de rede isolado. Todos os recursos são implantados na mesma VPC.

2

vSwitch

ALIYUN::ECS::VSwitch

Define uma sub-rede dentro da VPC e especifica a zona.

3

Grupo de segurança

ALIYUN::ECS::SecurityGroup

Controla o tráfego de entrada e saída da instância ECS.

4

Instância ECS

ALIYUN::ECS::Instance

Nó de computação que executa o script de inicialização do banco de dados.

5

Instância ApsaraDB RDS MySQL

ALIYUN::RDS::DBInstance

Banco de dados de destino que armazena os dados inicializados.

6

Conta de banco de dados

ALIYUN::RDS::Account

Conta de login do RDS usada pela instância ECS para se conectar ao banco de dados.

7

Comando do Cloud Assistant

ALIYUN::ECS::RunCommand

Executa remotamente o script shell na instância ECS para inicializar o banco de dados.

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 uma VPC, um vSwitch e um grupo de segurança.

  • Uma instância ECS associada à rede VPC e ao grupo de segurança.

  • Uma instância ApsaraDB RDS MySQL 8.0 com um banco de dados inicial e uma conta superusuário.

  • O conjunto de dados de exemplo oficial employees do MySQL (aproximadamente 300.000 registros) importado automaticamente para o banco de dados.

Diagrama de arquitetura

ECS与RDS架构图

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, ApsaraDB RDS, VPC e Cloud Assistant.

  2. Conhecimento prévio: Noções básicas sobre a sintaxe e a estrutura de modelos ROS. Para mais detalhes, consulte Get started with template content.

Tutorial de criação de modelos

Este tutorial aborda o modelo em duas fases:

  • Fase 1 (Básica): Usa valores de parâmetros fixos para que você possa focar nas definições de recursos e nas relações de dependência.

  • Fase 2 (Avançada): Parametriza todas as configurações ajustáveis, adiciona filtragem dinâmica de parâmetros e agrupa os parâmetros.

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

Etapa 1: Definir recursos de rede (VPC + vSwitch + Security group)

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

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

  Vpc:
    Type: ALIYUN::ECS::VPC  # Create VPC
    Properties:
      CidrBlock: 192.168.0.0/16  # VPC CIDR block, supports up to 65,534 internal IPs
      VpcName:
        Ref: ALIYUN::StackName  # Pseudo parameter: use 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 (implicit dependency; ROS creates Vpc first)
      ZoneId: cn-beijing-h  # This example uses Beijing zone H
      CidrBlock: 192.168.0.0/24  # Subnet CIDR block; must be a subset of the VPC CIDR

  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup  # Create a security group
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc  # Bind the security group to the same VPC
      SecurityGroupIngress:  # Inbound rule: allow all inbound traffic
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          SourceCidrIp: 0.0.0.0/0
          NicType: intranet

Conceitos principais:

  • Nomes personalizados como VpcName, VSwitchName e SecurityGroupName podem usar pseudoparâmetros. Isso facilita a localização rápida dos recursos associados a uma stack após a implantação.

  • As regras do grupo de segurança podem ser personalizadas conforme suas necessidades de negócio. Por exemplo:

    • Para permitir acesso externo a um service web, adicione uma regra de entrada liberando a porta HTTP 80 ou 8080.

    • Para permitir login via SSH, adicione uma regra de entrada liberando a porta 22.

Etapa 2: Definir recursos de banco de dados (RDS instance + Database account)

Resources:
  # ============================================================
  # Database layer: ApsaraDB RDS MySQL instance + database account
  # ============================================================

  DBInstance:
    Type: ALIYUN::RDS::DBInstance  # Create ApsaraDB RDS MySQL instance
    Properties:
      ZoneId: cn-beijing-h
      VpcId:
        Ref: Vpc  # Deploy RDS in the same VPC as ECS (required for internal network connectivity)
      VSwitchId:
        Ref: VSwitch  # Specify the vSwitch so ECS and RDS are in the same subnet
      Engine: MySQL  # Database engine
      EngineVersion: '8.0'  # MySQL version
      DBInstanceClass: mysql.n2e.medium.1  # Instance type (2 vCPU, 4 GB)
      DBInstanceStorage: 10  # Storage: 10 GB
      MultiAZ: true  # Multi-zone deployment for higher availability
      DBInstanceNetType: Intranet  # Internal network type (VPC network)
      DBMappings:  # Create an initial database
        - CharacterSetName: utf8  # Character set
          DBName: employees  # Database name
      SecurityIPList: 0.0.0.0/0  # RDS whitelist (allows all IPs in the VPC)

  DBAccount:
    Type: ALIYUN::RDS::Account  # Create RDS database account
    Properties:
      DBInstanceId:
        # Fn::GetAtt returns an output attribute of the resource (not the primary identifier)
        Fn::GetAtt:
          - DBInstance  # Logical resource name
          - DBInstanceId  # Attribute name to retrieve
      AccountPassword: Admin@2791
      AccountType: Super  # Super account (has all database permissions)
      AccountName: rdsuser  # Account name

Conceitos principais:

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

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

    • Fn::GetAtt retorna um atributo relacionado do recurso (por exemplo, o InnerConnectionString de uma instância RDS).

Etapa 3: Definir recursos de ECS instance

Resources:
  # ============================================================
  # Compute layer + initialization: ECS instance + Cloud Assistant for database initialization
  # ============================================================

  EcsInstance:
    Type: ALIYUN::ECS::Instance  # Create ECS instance
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch  # Same vSwitch as RDS to ensure internal network connectivity
      ImageId: aliyun_3_x64_20G_alibase  # OS image: Alibaba Cloud Linux 3 (maintained release)
      AllocatePublicIP: true
      InstanceType: ecs.c5.large  # Instance type: 2 vCPU, 4 GiB
      SystemDiskSize: 40  # System disk: 40 GiB
      SystemDiskCategory: cloud_essd  # enterprise SSD (ESSD)
      Password: <REPLACE_WITH_STRONG_PASSWORD>  # 8-30 chars, mix of upper/lower/digit/special

  InstanceRunCommand:
    Type: ALIYUN::ECS::RunCommand  # Cloud Assistant: remotely runs commands on ECS
    DependsOn:
      - DBAccount  # Explicit dependency: wait until the database account is created before connecting
    Properties:
      CommandContent:
        # Fn::Sub function: string variable substitution
        # Syntax: Fn::Sub: [template string, {variable: value}]
        # Reference variables in the template string using ${variable}
        Fn::Sub:
          - |
            #!/bin/bash
            # 1. Install the MySQL client and decompression tool
            yum -y install mariadb unzip
            # 2. Download the MySQL official sample dataset from OSS
            wget -P /tmp https://ros-userdata-resources.oss-cn-beijing.aliyuncs.com/MySQL/test_db-master.zip
            # 3. Extract the data files
            unzip /tmp/test_db-master.zip -d /tmp/
            # 4. Connect to the database over the RDS internal endpoint and import SQL
            mysql -h${DBConnectString} -P3306 -u${DBUsername} -p${DBPassword} < /tmp/test_db-master/employees.sql
          - DBConnectString:
              # Retrieve the internal connection string of the RDS instance
              Fn::GetAtt:
                - DBInstance
                - InnerConnectionString
            DBUsername: rdsuser
            DBPassword: Admin@2791
      Type: RunShellScript  # Command type: shell script
      InstanceIds:  # Target ECS instance list
        - Fn::GetAtt:
            - EcsInstance
            - InstanceId
      Timeout: '500'  # Command execution timeout: 500 seconds

Conceitos principais:

  • InnerConnectionString é o endpoint de conexão interna da VPC gerado automaticamente após a criação da instância RDS.

  • Se AllocatePublicIP: false, a instância ECS não terá IP público. Para baixar arquivos da internet, configure um NAT Gateway para a VPC ou defina AllocatePublicIP: true.

  • Dependência implícita versus explícita:

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

    • Use DependsOn (explícita) apenas quando dois recursos não tiverem relação direta de referência, mas precisarem ser criados em uma ordem específica.

Nota

Os dados de inicialização deste exemplo correspondem ao conjunto de dados oficial employees do MySQL. Para garantir downloads estáveis, faça upload do arquivo de dados para seu bucket OSS antecipadamente e substitua a URL do comando wget.

Modelo básico completo

ROSTemplateFormatVersion: '2015-09-01'
Description: Create VPC network, deploy ECS and RDS MySQL instances, initialize the database via RunCommand
Parameters:
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: '-1/-1'
          Priority: 1
          IpProtocol: all
          SourceCidrIp: 0.0.0.0/0
          NicType: intranet

  # === Database layer ===
  DBInstance:
    Type: ALIYUN::RDS::DBInstance
    Properties:
      ZoneId: cn-beijing-h
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      Engine: MySQL
      EngineVersion: '8.0'
      DBInstanceClass: mysql.n2e.medium.1
      DBInstanceStorage: 200
      MultiAZ: false
      DBInstanceNetType: Intranet
      DBMappings:
        - CharacterSetName: utf8
          DBName: employees
      SecurityIPList: 0.0.0.0/0

  DBAccount:
    Type: ALIYUN::RDS::Account
    DependsOn:
      - DBInstance
    Properties:
      DBInstanceId:
        Fn::GetAtt:
          - DBInstance
          - DBInstanceId
      AccountPassword: Admin@2791
      AccountType: Super
      AccountName: rdsuser

  # === Compute layer + database initialization ===
  EcsInstance:
    Type: ALIYUN::ECS::Instance
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ImageId: aliyun_3_x64_20G_alibase
      AllocatePublicIP: true
      InstanceType: ecs.c5.large
      SystemDiskSize: 40
      SystemDiskCategory: cloud_essd
      Password: <REPLACE_WITH_STRONG_PASSWORD>  # 8-30 chars, mix of upper/lower/digit/special

  InstanceRunCommand:
    Type: ALIYUN::ECS::RunCommand
    DependsOn:
      - DBAccount
    Properties:
      CommandContent:
        Fn::Sub:
          - |
            #!/bin/bash
            yum -y install mariadb unzip
            wget -P /tmp https://ros-userdata-resources.oss-cn-beijing.aliyuncs.com/MySQL/test_db-master.zip
            unzip /tmp/test_db-master.zip -d /tmp/
            mysql -h${DBConnectString} -P3306 -u${DBUsername} -p${DBPassword} < /tmp/test_db-master/employees.sql
          - DBConnectString:
              Fn::GetAtt:
                - DBInstance
                - InnerConnectionString
            DBUsername: rdsuser
            DBPassword: Admin@2791
      Type: RunShellScript
      InstanceIds:
        - Fn::GetAtt:
            - EcsInstance
            - InstanceId
      Timeout: '500'
Outputs:
  RDSInnerConnectionString:
    Description: RDS internal endpoint
    Label: RDS internal endpoint
    Value:
      Fn::GetAtt:
        - DBInstance
        - InnerConnectionString
  RDSPort:
    Description: RDS port
    Label: RDS port
    Value:
      Fn::GetAtt:
        - DBInstance
        - InnerPort
  ECSPrivateIp:
    Description: ECS internal IP address
    Label: ECS internal IP address
    Value:
      Fn::GetAtt:
        - EcsInstance
        - PrivateIp
  ECSPublicIp:
    Description: ECS public IP address
    Label: ECS public IP address
    Value:
      Fn::GetAtt:
        - EcsInstance
        - PublicIp

Conceito principal:

  • Após o modelo criar os recursos, use a seção Outputs para consultar atributos como o endpoint interno do RDS, a porta do RDS, o IP interno do ECS e o IP público do ECS.

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

No modelo básico, propriedades como InstanceType e SystemDiskCategory da instância ECS, além de DBInstanceClass da instância RDS, usam valores fixos. Ao reutilizar o modelo em diferentes regiões ou com outras especificações, é necessário editá-lo manualmente a cada vez. Além disso, os parâmetros frequentemente possuem relações de dependência. Por exemplo, os tipos de instância ECS são restritos pela zona (zonas diferentes oferecem tipos diferentes), e a categoria do disco do sistema depende tanto da zona quanto do tipo de instância. Se você inserir esses parâmetros manualmente, poderá selecionar combinações inválidas que causam falhas na implantação.

As melhorias a seguir tornam o modelo flexível e reutilizável:

  1. Parametrização (Parameters) — Extrai configurações variáveis como parâmetros preenchidos dinamicamente durante a 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) — Organiza os 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 abaixo ilustra a cadeia de dependências usando como exemplo o tipo de instância ECS, a categoria do disco do sistema e o tipo de instância RDS:

VSwitchZoneId (zone)  <- Base parameter, no prerequisite
|
|-> ECSInstanceType (ECS instance type)
|        |             Depends on: ZoneId
|        |
|        |-> ECSDiskCategory (system disk category)
|                           Depends on: ZoneId + InstanceType
|
|-> DBInstanceClass (RDS instance type)
                     Depends on: ZoneId + Engine (fixed value)

Abordagem central: Primeiro selecione a zona, depois filtre os tipos de instância ECS e RDS de acordo com ela e, por fim, filtre a categoria do disco com base na zona combinada ao tipo de instância ECS. Cada etapa exibe apenas as opções válidas para as condições atuais, evitando combinações inválidas.

Como funciona o AssociationProperty

1. VSwitchZoneId — Zona (parâmetro base)

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

VSwitchZoneId:
    Type: String
    Label: 
      zh-cn: 交换机可用区
      en: VSwitch Availability Zone
    Description: 
      zh-cn: 选择交换机所在的可用区,ECS 和 RDS 将部署在此可用区
      en: Select the availability zone for VSwitch. ECS and RDS are deployed in this zone.
    AssociationProperty: ALIYUN::ECS::ZoneId

Este parâmetro serve como base de filtragem para todos os parâmetros subsequentes. Quando uma zona é selecionada, as listas de opções dos outros parâmetros são atualizadas automaticamente.

2. ECSInstanceType — Tipo de instância ECS

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

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

Os tipos de instância disponíveis variam conforme a zona. Sem filtragem, os usuários podem selecionar um tipo indisponível na zona escolhida, o que causa falha na criação.

3. ECSDiskCategory — Categoria do disco do sistema

Defina AssociationProperty como ALIYUN::ECS::Disk::SystemDiskCategory e associe ${VSwitchZoneId} e ${ECSInstanceType} para filtrar as categorias de disco suportadas pela zona e pelo tipo de instância selecionados:

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 da categoria de disco depende tanto da zona (algumas zonas não suportam ESSD) quanto do tipo de instância (alguns tipos suportam apenas certas categorias de disco).

4. DBInstanceClass — Tipo de instância RDS

Defina AssociationProperty como ALIYUN::RDS::Instance::InstanceType e associe ${VSwitchZoneId} e um valor fixo Engine: MySQL para filtrar os tipos de instância RDS que suportam MySQL na zona selecionada:

DBInstanceClass:
    Type: String
    Label: 
      zh-cn: RDS 实例规格
      en: RDS Instance Class
    Description:
      zh-cn: 选择RDS实例规格。列表已根据数据库引擎和可用区自动过滤。
      en: Select RDS instance class, filtered by engine type and zone.
    AssociationProperty: ALIYUN::RDS::Instance::InstanceType
    AssociationPropertyMetadata:
      Engine: MySQL
      ZoneId: ${VSwitchZoneId}
      EngineVersion: '8.0'
      Category: Basic
      InstanceChargeTYpe: Postpaid

Como este cenário usa MySQL, o mecanismo é fixo. Caso deseje selecionar outro mecanismo, adicione um parâmetro Engine com AssociationProperty: ALIYUN::RDS::Engine::EngineId e referencie ${Engine} neste local.

Modelo de filtragem dinâmica de parâmetros
Parameters:
  VSwitchZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch Availability Zone
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和RDS将部署在此可用区
      en: Select the availability zone for VSwitch, ECS and RDS 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}

  DBInstanceClass:
    Type: String
    Label:
      zh-cn: RDS实例规格
      en: RDS Instance Class
    Description:
      zh-cn: 选择RDS实例规格。列表已根据数据库引擎和可用区自动过滤。
      en: Select RDS instance class, filtered by engine type and zone.
    AssociationProperty: ALIYUN::RDS::Instance::InstanceType
    AssociationPropertyMetadata:
      Engine: MySQL
      ZoneId: ${VSwitchZoneId}

Como funciona a filtragem em cascata do AssociationProperty

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

  1. Seleciona a zona (VSwitchZoneId).

  2. A lista suspensa de tipos de instância ECS é atualizada para mostrar apenas os tipos disponíveis naquela zona.

  3. A lista suspensa de tipos de instância RDS é atualizada para mostrar apenas os tipos que suportam MySQL nessa zona.

  4. Após a seleção do tipo de instância ECS, a lista suspensa de categorias de disco do sistema é atualizada para exibir somente as categorias suportadas pela combinação de zona e tipo de instância.

Isso garante que cada seleção mostre apenas opções válidas e elimina falhas de implantação causadas por combinações inválidas de parâmetros.

Agrupamento de parâmetros via Metadata

Use ALIYUN::ROS::Interface em Metadata para organizar os parâmetros em grupos lógicos com rótulos. O console exibe os parâmetros agrupados, o que melhora a experiência de configuração.

Sintaxe do Metadata
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:           # Parameter group list (required)
      - Parameters:            # Parameters in this group (required)
          - ParameterName1
          - ParameterName2
        Label:                 # Group label (required)
          default:
            en: English label text

Regras do Metadata:

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

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

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

Modelo de Metadata:

Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - VSwitchZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            zh-cn: 基础网络配置
            en: Network Configuration
      - Parameters:
          - ECSInstanceType
          - ECSDiskSize
          - ECSDiskCategory
          - EcsInstancePassword
        Label:
          default:
            zh-cn: ECS实例配置
            en: ECS Instance Configuration
      - Parameters:
          - DBInstanceClass
          - DBInstanceStorage
          - DBName
          - DBUsername
          - DBPassword
        Label:
          default:
            zh-cn: 数据库配置
            en: Database Configuration
Design de agrupamento para este cenário

Este modelo divide 12 parâmetros em 3 grupos:

Grupo

Parâmetros incluídos

Configuração de Rede

Zona de Disponibilidade do vSwitch VSwitchZoneId, Bloco CIDR da VPC VpcCidrBlock, Bloco CIDR do vSwitch VSwitchCidrBlock

Configuração da Instância ECS

Tipo de Instância ECS ECSInstanceType, Tamanho do Disco do Sistema ECSDiskSize, Categoria do Disco do Sistema ECSDiskCategory, Senha da Instância ECS EcsInstancePassword

Configuração do Banco de Dados

Classe da Instância RDS DBInstanceClass, Armazenamento do RDS DBInstanceStorage, Nome do Banco de Dados DBName, Usuário do Banco de Dados DBUsername, Senha do Banco de Dados DBPassword

Modelo avançado completo

ROSTemplateFormatVersion: '2015-09-01'
Description: >-
  Parameterized template: create ECS and RDS MySQL in a VPC, initialize the database via RunCommand.
  Supports dynamic selection of zone, instance type, and disk category.

Parameters:
  # --- Network parameters ---
  VSwitchZoneId:
    Type: String
    Label: VSwitch Availability Zone
    Description: Select the availability zone for VSwitch. ECS and RDS are deployed in this zone.
    AssociationProperty: ALIYUN::ECS::ZoneId

  VpcCidrBlock:
    Type: String
    Label: VPC CIDR Block
    Description: 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: vSwitch CIDR Block
    Description: Must be a subnet of the VPC CIDR and must not overlap with other vSwitches
    Default: 192.168.0.0/24

  # --- ECS parameters ---
  ECSInstanceType:
    Type: String
    Label: ECS Instance Type
    Description: Select ECS instance type. The list is filtered by the selected zone.
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}

  ECSDiskSize:
    Type: Number
    Label: System Disk Size (GiB)
    Description: ECS system disk size, range 40-500 GiB
    Default: 40
    MinValue: 40
    MaxValue: 500

  ECSDiskCategory:
    Type: String
    Label: System Disk Category
    Description: "System disk type. Options: cloud_essd (enterprise SSD), cloud_ssd (standard SSD), cloud_efficiency (ultra disk)"
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}
      InstanceType: ${ECSInstanceType}

  EcsInstancePassword:
    Type: String
    NoEcho: true
    Label: ECS Instance Password
    Description: Length 8-30, must contain at least three of uppercase letters, lowercase letters, digits, and special characters
    MinLength: 8
    MaxLength: 30

  # --- Database parameters ---
  DBInstanceClass:
    Type: String
    Label: RDS Instance Class
    Description: Select RDS instance class. Filtered by engine type and zone.
    AssociationProperty: ALIYUN::RDS::Instance::InstanceType
    AssociationPropertyMetadata:
      Engine: MySQL
      ZoneId: ${VSwitchZoneId}
      EngineVersion: '8.0'
      Category: Basic
      InstanceChargeType: Postpaid

  DBInstanceStorage:
    Type: Number
    Label: RDS Storage (GB)
    Description: RDS storage size, range 20-2000 GB, increment by 5
    Default: 200
    MinValue: 20
    MaxValue: 2000

  DBName:
    Type: String
    Label: Database Name
    Description: Initial database name. Must start with a letter, alphanumeric only.
    Default: employees
    MinLength: 1
    MaxLength: 64

  DBUsername:
    Type: String
    Label: Database Username
    Description: RDS primary account name. 2-16 lowercase letters, must start with a letter.
    Default: rdsuser
    MinLength: 2
    MaxLength: 16

  DBPassword:
    Type: String
    NoEcho: true
    Label: Database Password
    Description: RDS database user password

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: VSwitchZoneId
      CidrBlock:
        Ref: VSwitchCidrBlock

  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      SecurityGroupIngress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          NicType: intranet
          SourceCidrIp: '0.0.0.0/0'

  # === Database layer ===
  DBInstance:
    Type: ALIYUN::RDS::DBInstance
    Properties:
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      Engine: MySQL
      EngineVersion: '8.0'
      DBInstanceClass:
        Ref: DBInstanceClass
      DBInstanceStorage:
        Ref: DBInstanceStorage
      DBInstanceNetType: Intranet
      DBMappings:
        - CharacterSetName: utf8
          DBName:
            Ref: DBName
      SecurityIPList: 0.0.0.0/0

  DBAccount:
    Type: ALIYUN::RDS::Account
    DependsOn:
      - DBInstance
    Properties:
      DBInstanceId:
        Fn::GetAtt:
          - DBInstance
          - DBInstanceId
      AccountPassword:
        Ref: DBPassword
      AccountType: Super
      AccountName:
        Ref: DBUsername

  # === Compute layer + database initialization ===
  EcsInstance:
    Type: ALIYUN::ECS::Instance
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ImageId: aliyun_3_x64_20G_alibase
      AllocatePublicIP: true  # Public IP is required to download data files from OSS
      InstanceType:
        Ref: ECSInstanceType
      SystemDiskSize:
        Ref: ECSDiskSize
      SystemDiskCategory:
        Ref: ECSDiskCategory
      Password:
        Ref: EcsInstancePassword

  InstanceRunCommand:
    Type: ALIYUN::ECS::RunCommand
    DependsOn:
      - DBAccount  # Wait for the database account to be ready before connecting
    Properties:
      CommandContent:
        Fn::Sub:
          - |
            #!/bin/bash
            yum -y install mariadb unzip
            wget -P /tmp https://ros-userdata-resources.oss-cn-beijing.aliyuncs.com/MySQL/test_db-master.zip
            unzip /tmp/test_db-master.zip -d /tmp/
            mysql -h${DBConnectString} -P3306 -u${DBUsername} -p${DBPassword} < /tmp/test_db-master/employees.sql
          - DBConnectString:
              Fn::GetAtt:
                - DBInstance
                - InnerConnectionString
            DBUsername:
              Ref: DBUsername
            DBPassword:
              Ref: DBPassword
      Type: RunShellScript
      InstanceIds:
        - Fn::GetAtt:
            - EcsInstance
            - InstanceId
      Timeout: '500'

Outputs:
  RDSInnerConnectionString:
    Description: RDS internal endpoint
    Label: RDS internal endpoint
    Value:
      Fn::GetAtt:
        - DBInstance
        - InnerConnectionString
  RDSPort:
    Description: RDS port
    Label: RDS port
    Value:
      Fn::GetAtt:
        - DBInstance
        - InnerPort
  ECSPrivateIp:
    Description: ECS internal IP address
    Label: ECS internal IP address
    Value:
      Fn::GetAtt:
        - EcsInstance
        - PrivateIp
  ECSPublicIp:
    Description: ECS public IP address
    Label: ECS public IP address
    Value:
      Fn::GetAtt:
        - EcsInstance
        - PublicIp

# === Metadata: console parameter group configuration ===
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - VSwitchZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            en: Network Configuration
      - Parameters:
          - ECSInstanceType
          - ECSDiskSize
          - ECSDiskCategory
          - EcsInstancePassword
        Label:
          default:
            en: ECS Instance Configuration
      - Parameters:
          - DBInstanceClass
          - DBInstanceStorage
          - DBName
          - DBUsername
          - DBPassword
        Label:
          default:
            en: Database Configuration

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

Função

Exemplo de sintaxe

Uso neste modelo

Descrição

Ref

Ref: MyVpc

Referencia valores de parâmetros ou o identificador principal de um recurso

Retorna o valor do parâmetro ao referenciar um Parameter; retorna o ID principal ao referenciar um Resource

Fn::GetAtt

Fn::GetAtt: [DBInstance, InnerConnectionString]

Recupera o endpoint interno do RDS

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

Fn::Sub

Fn::Sub: [string, {variable mapping}]

Concatena informações de conexão do banco de dados em comandos shell

Use ${Var} para referenciar variáveis na string do modelo

Implantação

Parâmetros de implantação

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

Parâmetro

Tipo

Descrição

Restrições

DBPassword

String

Senha do usuário do ApsaraDB RDS

Siga a política de senhas do RDS

Parâmetros opcionais (possuem valores padrão, podem ser mantidos inalterados)

Parâmetro

Valor padrão

Descrição

VpcCidrBlock

192.168.0.0/16

Faixa de endereços CIDR da VPC

VSwitchCidrBlock

192.168.0.0/24

CIDR da sub-rede do vSwitch

VSwitchZoneId

ID da zona (selecionado dinamicamente no console)

ECSInstanceType

Tipo de instância ECS (filtrado dinamicamente no console)

ECSDiskCategory

cloud_essd

Categoria do disco do sistema ECS

ECSDiskSize

40

Tamanho do disco do sistema ECS (GiB), intervalo de 40-500

EcsInstancePassword

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

DBInstanceClass

Tipo de instância RDS (filtrado dinamicamente no console)

DBInstanceStorage

200

Tamanho do armazenamento RDS (GB), intervalo de 20-2000

DBName

employees

Nome do banco de dados inicial

DBUsername

rdsuser

Nome da conta do banco de dados (2-16 letras minúsculas)

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 ROS IaC Code

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

# Prompt
Deploy an ECS instance and an ApsaraDB RDS MySQL instance. Use Cloud Assistant to initialize the RDS database. The initialization data download URL is: https://ros-userdata-resources.oss-cn-beijing.aliyuncs.com/MySQL/test_db-master.zip
Requirements:
1. ECS uses a newly created VPC and vSwitch.
2. ECS security group opens inbound ports 22 and 3306.
3. Create a new RDS super account and use it to initialize the RDS database.
4. ECS must have a public IP address.
5. VpcCidrBlock, VSwitchZoneId, VSwitchCidrBlock, ECSInstanceType, and ECSDiskCategory must use AssociationProperty and AssociationPropertyMetadata for dynamic console filtering.

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 não possui estoque na zona especificada.

Solução:

  • No modelo avançado, o AssociationProperty filtra automaticamente os tipos disponíveis para evitar esse problema.

  • Se estiver usando o modelo básico, acesse Aba de preços da página do produto Elastic Compute Service para confirmar a disponibilidade do tipo de instância na zona de destino ou troque para uma zona diferente.

P2: Tempo limite na execução do comando do Cloud Assistant (timeout do RunCommand)

Causa: O download do arquivo de dados está lento ou a importação SQL excede o valor configurado em Timeout.

Solução:

  1. Aumente o valor de Timeout no modelo (por exemplo, altere para '600' ou superior).

  2. Garanta que a instância ECS tenha acesso à internet para baixar arquivos (AllocatePublicIP: true ou configure um NAT Gateway).

  3. Armazene o arquivo de dados em um bucket OSS na mesma região da instância ECS e faça o download através de um endpoint interno.

P3: ECS não consegue conectar-se ao RDS, erro "Can't connect to MySQL server"

Etapas de solução de problemas:

  1. Confirme se o ECS e o RDS estão na mesma VPC e no mesmo vSwitch (garantido pelo modelo).

  2. Verifique se a lista de permissões do RDS (SecurityIPList) inclui o intervalo de IP interno do ECS ou está definida como 0.0.0.0/0.

  3. Confirme se o status da instância RDS é Running (DependsOn: DBAccount garante que o RDS esteja pronto antes da execução do comando).

  4. Verifique se as regras do grupo de segurança permitem tráfego de saída na porta 3306.

P4: Como usar uma VPC existente em vez de criar uma nova?

Solução: Remova VPC e vSwitch de Resources e passe-os como 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}

P5: Como modificar este modelo para usar PostgreSQL?

Alterações necessárias:

  1. Altere o recurso RDS para Engine: PostgreSQL e EngineVersion: '16.0'.

  2. Atualize DBInstanceClass para um tipo de instância PostgreSQL (por exemplo, pg.n4.medium.2c).

  3. Substitua o comando mysql em RunCommand por um comando psql.

  4. Atualize o arquivo SQL de inicialização para que seja compatível com PostgreSQL.

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

Referências