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
|
N° |
Ressource |
Type de ressource ROS |
Description |
|
1 |
VPC |
|
Fournit un environnement réseau isolé. Toutes les ressources sont déployées au sein du même VPC. |
|
2 |
vSwitch |
|
Définit un sous-réseau au sein du VPC et spécifie la zone. |
|
3 |
Groupe de sécurité |
|
Contrôle le trafic entrant et sortant de l'instance ECS. |
|
4 |
Instance ECS |
|
Nœud de calcul exécutant le script d'initialisation de la base de données. |
|
5 |
Instance ApsaraDB RDS MySQL |
|
Base de données cible stockant les données initialisées. |
|
6 |
Compte de base de données |
|
Compte de connexion RDS utilisé par l'instance ECS pour accéder à la base de données. |
|
7 |
Commande Cloud Assistant |
|
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

Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
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.
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,VSwitchNameetSecurityGroupNamepeuvent 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
RefetFn::GetAtt:Refrenvoie l'identifiant principal de la ressource (par exemple, leVpcIdd'un VPC).Fn::GetAttrenvoie un attribut associé de la ressource (par exemple, leInnerConnectionStringd'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 :
InnerConnectionStringcorrespond à 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éfinissezAllocatePublicIP: true.-
Dépendance implicite ou explicite :
Lorsque vous utilisez
RefouFn::GetAttpour 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.
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
Outputspermet 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 :
Paramétrage (Paramètres) : extrayez les configurations variables sous forme de paramètres à renseigner dynamiquement lors du déploiement.
Filtrage dynamique des paramètres (AssociationProperty) : laissez la console ROS filtrer automatiquement les options disponibles en fonction des paramètres sélectionnés.
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 :
Sélectionnez la zone (
VSwitchZoneId).La liste déroulante des types d'instances ECS se met à jour pour n'afficher que les types disponibles dans cette zone.
Celle des types d'instances RDS s'actualise également pour proposer uniquement les types compatibles avec MySQL dans ladite zone.
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,ParametersetLabelsont obligatoires.Les noms de paramètres indiqués sous
Metadata.ALIYUN::ROS::Interface.ParameterGroups.Parametersdoivent correspondre exactement à ceux définis dans la sectionParameters.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 |
|
ECS Instance Configuration |
ECS Instance Type |
|
Database Configuration |
RDS Instance Class |
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 |
|
|
|
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 |
|
|
|
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) |
|
|
|
Concaténer les informations de connexion à la base de données dans les commandes shell |
Utiliser |
Déploiement
Paramètres de déploiement
Paramètres obligatoires (à spécifier lors du déploiement)
|
Paramètre |
Type |
Description |
Contraintes |
|
|
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 |
|
|
192.168.0.0/16 |
Plage d'adresses CIDR du VPC |
|
|
192.168.0.0/24 |
Sous-réseau CIDR du |
|
|
— |
ID de zone (sélection dynamique dans la console) |
|
|
— |
Type d'instance ECS (filtrage dynamique dans la console) |
|
|
|
Catégorie de disque système ECS |
|
|
40 |
Taille du disque système ECS (Gio), plage de 40 à 500 |
|
|
— |
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. |
|
|
— |
Type d'instance RDS (filtrage dynamique dans la console) |
|
|
200 |
Taille de stockage RDS (Go), plage de 20 à 2000 |
|
|
employees |
Nom de la base de données initiale |
|
|
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
Connectez-vous à la console ROS.
Dans le volet de navigation de gauche, choisissez Stacks > Create Stack.
Sélectionnez Select an Existing Template > Enter Template Content, puis collez le modèle complet dans l'éditeur.
Cliquez sur Next, puis configurez les paramètres par groupe.
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é
AssociationPropertyfiltre 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 :
Augmentez la valeur
Timeoutdans le modèle (par exemple, définissez-la sur'600'ou plus).Assurez-vous que l'instance ECS dispose d'un accès Internet pour télécharger des fichiers (
AllocatePublicIP: trueou configurez une passerelle NAT).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 :
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).Contrôlez si la liste d'autorisation RDS (
SecurityIPList) inclut la plage IP interne de l'ECS ou si elle est définie sur0.0.0.0/0.Confirmez que l'état de l'instance RDS est Running (la directive
DependsOn: DBAccountgarantit que RDS est prêt avant l'exécution de la commande).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 :
Pour la ressource RDS, définissez
Engine: PostgreSQLetEngineVersion: '16.0'.Mettez à jour le paramètre
DBInstanceClassavec un type d'instance PostgreSQL (par exemple,pg.n4.medium.2c).Remplacez la commande
mysqldansRunCommandpar la commandepsql.-
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.