Tous les produits
Search
Centre de documentation

Resource Orchestration Service:Utiliser une instance ECS pour se connecter à une instance ApsaraDB RDS et initialiser la base de données

Dernière mise à jour :Aug 13, 2026

Ce tutoriel explique comment utiliser Alibaba Cloud Resource Orchestration Service (ROS) pour provisionner une instance ECS et une instance ApsaraDB RDS MySQL au sein d'un même VPC. Cloud Assistant exécute ensuite un script d'initialisation qui importe un jeu de données d'exemple dans RDS. À l'issue de ce processus, vous disposez d'un environnement ECS + RDS opérationnel, créé à partir d'un modèle YAML unique que vous pouvez redéployer à la demande.

Présentation de la solution

Scénario métier

Créez une instance Elastic Compute Service (ECS) et une instance ApsaraDB RDS MySQL dans le même Virtual Private Cloud (VPC) Alibaba Cloud. L'instance ECS se connecte à l'instance RDS via le réseau interne du VPC, tandis que Cloud Assistant (RunCommand) exécute automatiquement un script shell sur l'instance ECS pour procéder à l'initialisation de la base de données.

Ressources créées

Ressource

Type de ressource ROS

Description

1

VPC

ALIYUN::ECS::VPC

Fournit un environnement réseau isolé. Toutes les ressources sont déployées au sein du même VPC.

2

vSwitch

ALIYUN::ECS::VSwitch

Définit un sous-réseau au sein du VPC et spécifie la zone.

3

Groupe de sécurité

ALIYUN::ECS::SecurityGroup

Contrôle le trafic entrant et sortant de l'instance ECS.

4

Instance ECS

ALIYUN::ECS::Instance

Nœud de calcul exécutant le script d'initialisation de la base de données.

5

Instance ApsaraDB RDS MySQL

ALIYUN::RDS::DBInstance

Base de données cible stockant les données initialisées.

6

Compte de base de données

ALIYUN::RDS::Account

Compte de connexion RDS utilisé par l'instance ECS pour accéder à la base de données.

7

Commande Cloud Assistant

ALIYUN::ECS::RunCommand

Exécute à distance le script shell sur l'instance ECS afin d'initialiser la base de données.

Résultats attendus après le déploiement

Une fois le modèle déployé avec succès, vous obtenez :

  • Un environnement réseau VPC complet, comprenant un VPC, un vSwitch et un groupe de sécurité.

  • Une instance ECS rattachée au réseau VPC et au groupe de sécurité.

  • Une instance ApsaraDB RDS MySQL 8.0 dotée d'une base de données initiale et d'un compte superutilisateur.

  • Le jeu de données d'exemple officiel « employees » de MySQL (environ 300 000 enregistrements), importé automatiquement dans la base de données.

Diagramme d'architecture

ECS与RDS架构图

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  1. Compte et autorisations : un compte Alibaba Cloud disposant des autorisations nécessaires pour créer des ressources dans ECS, ApsaraDB RDS, VPC et Cloud Assistant.

  2. Connaissances préalables : une connaissance de base de la syntaxe et de la structure des modèles ROS. Pour plus d'informations, consultez Prise en main du contenu des modèles.

Tutoriel de rédaction de modèle

Ce tutoriel détaille la création du modèle en deux phases :

  • Phase 1 (Base) : utilise des valeurs de paramètres fixes afin de vous permettre de vous concentrer sur la définition des ressources et leurs relations de dépendance.

  • Phase 2 (Avancée) : paramètre tous les réglages configurables, ajoute le filtrage dynamique des paramètres et organise ces derniers en groupes.

Phase 1 : Modèle de base — Définir les ressources et les dépendances

Étape 1 : Définir les ressources réseau (VPC + vSwitch + Groupe de sécurité)

Les ressources réseau constituent la base de toutes les autres ressources et doivent être créées en premier.

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

Concepts clés :

  • Les noms personnalisés tels que VpcName, VSwitchName et SecurityGroupName peuvent utiliser des pseudo-paramètres. Cela facilite l'identification rapide des ressources associées à une pile après le déploiement.

  • Les règles de groupe de sécurité sont adaptables selon vos besoins métier. Par exemple :

    • Pour autoriser l'accès externe à un service web, ajoutez une règle entrante ouvrant le port HTTP 80 ou 8080.

    • Pour autoriser la connexion SSH, ajoutez une règle entrante ouvrant le port 22.

Étape 2 : Définir les ressources de base de données (Instance RDS + Compte de base de données)

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

Concepts clés :

  • Différence entre Ref et Fn::GetAtt :

    • Ref renvoie l'identifiant principal de la ressource (par exemple, le VpcId d'un VPC).

    • Fn::GetAtt renvoie un attribut associé de la ressource (par exemple, le InnerConnectionString d'une instance RDS).

Étape 3 : Définir les ressources de l'instance ECS

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

Concepts clés :

  • InnerConnectionString correspond à l'endpoint de connexion interne au VPC, généré automatiquement lors de la création de l'instance RDS.

  • Si AllocatePublicIP: false, l'instance ECS ne possède pas d'adresse IP publique. Pour télécharger des fichiers depuis Internet, configurez une passerelle NAT pour le VPC ou définissez AllocatePublicIP: true.

  • Dépendance implicite ou explicite :

    • Lorsque vous utilisez Ref ou Fn::GetAtt pour référencer une ressource, ROS déduit automatiquement la dépendance (implicite).

    • Utilisez DependsOn (explicite) uniquement lorsque deux ressources n'ont aucune relation de référence directe mais doivent être créées dans un ordre précis.

Remarque

Les données d'initialisation utilisées dans cet exemple proviennent du jeu de données officiel « employees » de MySQL. Pour garantir des téléchargements stables, chargez préalablement le fichier de données dans votre bucket OSS et remplacez l'URL de la commande wget.

Modèle de base complet

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

Concept clé :

  • Une fois les ressources créées par le modèle, la section Outputs permet d'interroger leurs attributs, tels que l'endpoint interne RDS, le port RDS, l'adresse IP interne ECS et l'adresse IP publique ECS.

Phase 2 : Modèle avancé — Paramétrage et configuration dynamique

Dans le modèle de base, des propriétés comme InstanceType et SystemDiskCategory pour l'instance ECS, ainsi que DBInstanceClass pour l'instance RDS, utilisent des valeurs fixes. Si vous souhaitez réutiliser ce modèle dans différentes régions ou avec d'autres spécifications, vous devez le modifier à chaque fois. De plus, les paramètres d'un modèle entretiennent souvent des relations de dépendance. Par exemple, les types d'instances ECS dépendent de la zone (chaque zone proposant des types différents), et la catégorie du disque système est contrainte à la fois par la zone et le type d'instance. Une saisie manuelle de ces paramètres risque d'entraîner des combinaisons invalides, provoquant l'échec du déploiement.

Les améliorations suivantes rendent le modèle flexible et réutilisable :

  1. Paramétrage (Paramètres) : extrayez les configurations variables sous forme de paramètres à renseigner dynamiquement lors du déploiement.

  2. Filtrage dynamique des paramètres (AssociationProperty) : laissez la console ROS filtrer automatiquement les options disponibles en fonction des paramètres sélectionnés.

  3. Regroupement des paramètres (Metadata) : organisez les paramètres par catégorie logique dans la console pour améliorer l'expérience de configuration.

Diagramme de dépendance des paramètres

Le diagramme suivant illustre la chaîne de dépendances en prenant pour exemples le type d'instance ECS, la catégorie de disque système et le type d'instance 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)

Approche fondamentale : sélectionnez d'abord la zone, filtrez ensuite les types d'instances ECS et RDS en conséquence, puis filtrez la catégorie de disque en fonction de la zone et du type d'instance ECS. Chaque étape n'affiche que les options valides dans le contexte actuel, ce qui évite les combinaisons invalides.

Fonctionnement d'AssociationProperty

1. VSwitchZoneId — Zone (paramètre de base)

Définissez AssociationProperty sur ALIYUN::ECS::ZoneId pour lister toutes les zones disponibles dans la région actuelle :

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

Ce paramètre sert de base de filtrage pour tous les paramètres suivants. Lorsqu'une zone est sélectionnée, les listes d'options des autres paramètres s'actualisent automatiquement.

2. ECSInstanceType — Type d'instance ECS

Définissez AssociationProperty sur ALIYUN::ECS::Instance::InstanceType et associez ${VSwitchZoneId} pour filtrer les types d'instances ECS disponibles dans la zone sélectionnée :

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

Les types d'instances disponibles varient selon les zones. Sans filtrage, l'utilisateur risque de sélectionner un type indisponible dans la zone choisie, ce qui entraîne l'échec de la création.

3. ECSDiskCategory — Catégorie de disque système

Définissez AssociationProperty sur ALIYUN::ECS::Disk::SystemDiskCategory et associez ${VSwitchZoneId} ainsi que ${ECSInstanceType} pour filtrer les catégories de disques prises en charge par la zone et le type d'instance sélectionnés :

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

La disponibilité des catégories de disques dépend à la fois de la zone (certaines zones ne prennent pas en charge les disques ESSD) et du type d'instance (certains types ne sont compatibles qu'avec des catégories de disques spécifiques).

4. DBInstanceClass — Type d'instance RDS

Définissez AssociationProperty sur ALIYUN::RDS::Instance::InstanceType, puis associez ${VSwitchZoneId} et une valeur fixe Engine: MySQL afin de filtrer les types d'instances RDS prenant en charge MySQL dans la zone sélectionnée :

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

Ce scénario utilisant MySQL, le moteur est fixe. Pour choisir un autre moteur, ajoutez un paramètre Engine avec AssociationProperty: ALIYUN::RDS::Engine::EngineId et référencez ${Engine} à cet endroit.

Modèle de filtrage dynamique des paramètres
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}

Fonctionnement du filtrage en cascade via AssociationProperty

Lors de la création d'une pile dans la console ROS, la sélection des paramètres déclenche un mécanisme en cascade :

  1. Sélectionnez la zone (VSwitchZoneId).

  2. La liste déroulante des types d'instances ECS se met à jour pour n'afficher que les types disponibles dans cette zone.

  3. Celle des types d'instances RDS s'actualise également pour proposer uniquement les types compatibles avec MySQL dans ladite zone.

  4. Une fois le type d'instance ECS choisi, la catégorie de disque système ne présente plus que les options valides pour la combinaison zone et type d'instance retenue.

Ce processus garantit que chaque sélection offre exclusivement des options valides, éliminant ainsi les échecs de déploiement dus à des combinaisons de paramètres incompatibles.

Regroupement des paramètres via Metadata

Utilisez ALIYUN::ROS::Interface dans la section Metadata pour organiser les paramètres en groupes logiques dotés de libellés. La console affiche alors les paramètres par groupe, ce qui améliore l'expérience de configuration.

Syntaxe de 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

Règles relatives aux métadonnées :

  • Les champs ParameterGroups, Parameters et Label sont obligatoires.

  • Les noms de paramètres indiqués sous Metadata.ALIYUN::ROS::Interface.ParameterGroups.Parameters doivent correspondre exactement à ceux définis dans la section Parameters.

  • Tout paramètre non assigné à un groupe apparaît dans une zone non groupée au sein de la console.

Modèle de métadonnées :

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
Conception des groupes pour ce scénario

Ce modèle répartit 12 paramètres en 3 groupes distincts :

Groupe

Paramètres inclus

Network Configuration

VSwitch Availability Zone VSwitchZoneId、VPC CIDR Block VpcCidrBlock、vSwitch CIDR block VSwitchCidrBlock

ECS Instance Configuration

ECS Instance Type ECSInstanceType、System Disk Size ECSDiskSize、System Disk Category ECSDiskCategory、ECS Instance Password EcsInstancePassword

Database Configuration

RDS Instance Class DBInstanceClass、RDS Storage DBInstanceStorage、Database Name DBName、Database Username DBUsername、Database Password DBPassword

Modèle avancé complet

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

Référence rapide des fonctions intégrées ROS

Fonction

Exemple de syntaxe

Utilisation dans ce modèle

Description

Ref

Ref: MyVpc

Référencer des valeurs de paramètres ou l'identifiant principal d'une ressource

Renvoie la valeur du paramètre lors du référencement d'un paramètre ; renvoie l'ID principal lors du référencement d'une ressource

Fn::GetAtt

Fn::GetAtt: [DBInstance, InnerConnectionString]

Récupérer l'endpoint interne RDS

Renvoie un attribut de sortie de la ressource après sa création (et non l'identifiant principal)

Fn::Sub

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

Concaténer les informations de connexion à la base de données dans les commandes shell

Utiliser ${Var} pour référencer des variables dans la chaîne du modèle

Déploiement

Paramètres de déploiement

Paramètres obligatoires (à spécifier lors du déploiement)

Paramètre

Type

Description

Contraintes

DBPassword

String

Mot de passe utilisateur ApsaraDB RDS

Doit respecter la politique de mot de passe RDS

Paramètres facultatifs (valeurs par défaut définies, modifiables si nécessaire)

Paramètre

Valeur par défaut

Description

VpcCidrBlock

192.168.0.0/16

Plage d'adresses CIDR du VPC

VSwitchCidrBlock

192.168.0.0/24

Sous-réseau CIDR du vSwitch

VSwitchZoneId

ID de zone (sélection dynamique dans la console)

ECSInstanceType

Type d'instance ECS (filtrage dynamique dans la console)

ECSDiskCategory

cloud_essd

Catégorie de disque système ECS

ECSDiskSize

40

Taille du disque système ECS (Gio), plage de 40 à 500

EcsInstancePassword

Mot de passe de connexion de l'instance ECS. Longueur de 8 à 30 caractères, contenant au moins trois des éléments suivants : majuscules, minuscules, chiffres et caractères spéciaux.

DBInstanceClass

Type d'instance RDS (filtrage dynamique dans la console)

DBInstanceStorage

200

Taille de stockage RDS (Go), plage de 20 à 2000

DBName

employees

Nom de la base de données initiale

DBUsername

rdsuser

Nom du compte de base de données (2 à 16 lettres minuscules)

Méthodes de déploiement

Méthode 1 : Déploiement via la console ROS

  1. Connectez-vous à la console ROS.

  2. Dans le volet de navigation de gauche, choisissez Stacks > Create Stack.

  3. Sélectionnez Select an Existing Template > Enter Template Content, puis collez le modèle complet dans l'éditeur.

  4. Cliquez sur Next, puis configurez les paramètres par groupe.

  5. Après avoir confirmé la configuration, cliquez sur Create et patientez jusqu'à ce que l'état de la pile passe à CREATE_COMPLETE.

Méthode 2 : Déploiement via ROS IaC Code

IaC Code est un assistant d'infrastructure as code basé sur l'IA, dédié aux infrastructures cloud. Il aide les utilisateurs de ressources cloud et les ingénieurs O&M à générer, déployer et gérer des modèles d'infrastructure via un flux de travail en 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.

FAQ

Q1 : Échec du déploiement avec l'erreur « The specified InstanceType is not available in the zone »

Cause : Le type d'instance ECS sélectionné n'est pas disponible en stock dans la zone spécifiée.

Solution :

  • Dans le modèle avancé, la propriété AssociationProperty filtre automatiquement les types disponibles pour éviter ce problème.

  • Si vous utilisez le modèle de base, accédez à la page Pricing tab of the Elastic Compute Service product page pour vérifier la disponibilité du type d'instance dans la zone cible, ou choisissez une autre zone.

Q2 : Délai d'expiration lors de l'exécution d'une commande Cloud Assistant (RunCommand timeout)

Cause : Le téléchargement du fichier de données est lent, ou l'importation SQL dépasse la valeur Timeout configurée.

Solution :

  1. Augmentez la valeur Timeout dans le modèle (par exemple, définissez-la sur '600' ou plus).

  2. Assurez-vous que l'instance ECS dispose d'un accès Internet pour télécharger des fichiers (AllocatePublicIP: true ou configurez une passerelle NAT).

  3. Stockez le fichier de données dans un bucket OSS situé dans la même région que l'instance ECS, puis téléchargez-le via un endpoint interne.

Q3 : Impossible de connecter ECS à RDS, erreur « Can't connect to MySQL server »

Étapes de dépannage :

  1. Vérifiez que les ressources ECS et RDS se trouvent dans le même VPC et le même vSwitch (garanti par le modèle).

  2. Contrôlez si la liste d'autorisation RDS (SecurityIPList) inclut la plage IP interne de l'ECS ou si elle est définie sur 0.0.0.0/0.

  3. Confirmez que l'état de l'instance RDS est Running (la directive DependsOn: DBAccount garantit que RDS est prêt avant l'exécution de la commande).

  4. Vérifiez que les règles du groupe de sécurité autorisent le trafic sortant sur le port 3306.

Q4 : Comment utiliser un VPC existant au lieu d'en créer un nouveau ?

Solution : Supprimez les sections VPC et vSwitch de la section Resources et passez-les plutôt comme 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}

Q5 : Comment modifier ce modèle pour utiliser PostgreSQL ?

Modifications requises :

  1. Pour la ressource RDS, définissez Engine: PostgreSQL et EngineVersion: '16.0'.

  2. Mettez à jour le paramètre DBInstanceClass avec un type d'instance PostgreSQL (par exemple, pg.n4.medium.2c).

  3. Remplacez la commande mysql dans RunCommand par la commande psql.

  4. Adaptez le fichier SQL d'initialisation pour qu'il soit compatible avec PostgreSQL.

    Pour résoudre d'autres problèmes de déploiement, consultez la FAQ.

Références