Tous les produits
Search
Centre de documentation

Resource Orchestration Service:Déployer un cluster ECS à mise à l'échelle automatique avec ROS

Dernière mise à jour :Sep 15, 2026

Utilisez Alibaba Cloud Resource Orchestration Service (ROS) pour provisionner un réseau VPC, un groupe d'instances ECS et un groupe Auto Scaling (ESS) à partir d'un seul modèle YAML. Ajoutez les instances ECS au groupe de mise à l'échelle afin qu'il puisse augmenter ou réduire sa capacité automatiquement en fonction de la charge métier. Ce tutoriel convient aux scénarios nécessitant une gestion élastique des clusters de serveurs, tels que les applications web et les microservices.

Présentation de la solution

Scénario métier

Créez par lot des instances ECS dans un Virtual Private Cloud (VPC) Alibaba Cloud et ajoutez-les à un groupe de mise à l'échelle. Après avoir configuré les règles de mise à l'échelle, le groupe augmente ou diminue le nombre d'instances ECS en fonction de la charge métier, ce qui vous offre une gestion élastique des clusters de serveurs.

Ressources créées

N°

Nom de la ressource

Type de ressource ROS

Objectif

1

VPC

ALIYUN::ECS::VPC

Fournit un environnement réseau isolé.

2

VSwitch

ALIYUN::ECS::VSwitch

Alloue un bloc CIDR de sous-réseau et spécifie la zone dans le VPC.

3

SecurityGroup

ALIYUN::ECS::SecurityGroup

Contrôle les règles d'accès réseau entrant et sortant pour les instances ECS.

4

ECS InstanceGroup

ALIYUN::ECS::InstanceGroup

Crée par lot les instances ECS initiales.

5

ScalingGroup

ALIYUN::ESS::ScalingGroup

Gère la politique de mise à l'échelle élastique (nombre minimal et maximal d'instances).

6

ScalingConfiguration

ALIYUN::ESS::ScalingConfiguration

Définit le modèle de spécification ECS utilisé lors de la montée en puissance.

7

ScalingGroupEnable

ALIYUN::ESS::ScalingGroupEnable

Active le groupe de mise à l'échelle et y ajoute les instances ECS existantes.

Résultats attendus après le déploiement

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

  • Un environnement réseau VPC complet incluant le VPC, le VSwitch et le groupe de sécurité.

  • Un groupe d'instances ECS. (Le nombre est paramétré par ECSInstanceGroupCount, valeur par défaut 3.)

  • Un groupe de mise à l'échelle activé avec une configuration de mise à l'échelle pour la montée en puissance automatique.

  • Toutes les instances ECS ajoutées au groupe de mise à l'échelle.

Diagramme d'architecture

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

Prérequis

Avant de commencer, confirmez les points suivants :

  1. Compte et autorisations : Un compte Alibaba Cloud disposant des autorisations nécessaires pour créer des ressources dans ECS, ESS (Elastic Scaling) et VPC.

  2. Préparation des connaissances : Connaissances de base de la syntaxe et de la structure des modèles ROS. Pour plus de détails, consultez Démarrage rapide pour les modèles.

Tutoriel de rédaction de modèle

Ce tutoriel illustre le processus de rédaction du modèle en deux phases :

  • Phase 1 (version de base) : utilise des valeurs de paramètres fixes et se concentre sur la compréhension des définitions de ressources et des dépendances.

  • Phase 2 (version avancée) : paramètre toutes les configurations variables et ajoute un filtrage dynamique des paramètres ainsi qu'un regroupement des paramètres.

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

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

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

Resources:
  # ============================================================
  # Basic network layer: VPC → VSwitch → SecurityGroup
  # ============================================================
  
  Vpc:
    Type: ALIYUN::ECS::VPC  # Create the VPC
    Properties:
      CidrBlock: 192.168.0.0/16  # VPC CIDR block, which provides 65,534 private IP addresses
      VpcName:
        Ref: ALIYUN::StackName  # Pseudo parameter: uses the stack name as the VPC name

  VSwitch:
    Type: ALIYUN::ECS::VSwitch  # Create a VSwitch (subnet) in the VPC
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc  # Ref returns the VpcId of Vpc (an implicit dependency, so ROS creates Vpc first)
      ZoneId: cn-beijing-h # This scenario uses zone H in the China (Beijing) region as an example
      CidrBlock: 192.168.0.0/24  # Subnet CIDR block, which must be a subset of the VPC CIDR block

  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup  # Create the security group
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc  # Bind the security group to the same VPC
      # Inbound rule: this example allows all inbound traffic for simplicity. Restrict the ports as needed in production.
      SecurityGroupIngress:
        - PortRange: '-1/-1'
          Priority: 1
          IpProtocol: all
          SourceCidrIp: 0.0.0.0/0
          NicType: intranet

Points clés :

  • Les paramètres personnalisés tels que VpcName, VSwitchName et SecurityGroupName peuvent être configurés avec des pseudo-paramètres, ce qui vous permet de retrouver rapidement les ressources déployées par une pile spécifique après le déploiement.

  • Les règles d'accès du SecurityGroup peuvent être personnalisées selon vos besoins métier. Par exemple :

    • Pour accéder à un service web depuis Internet, ouvrez le port entrant HTTP 80 ou 8080 dans le groupe de sécurité.

    • Pour vous connecter aux serveurs via SSH, ouvrez le port 22 entrant dans le groupe de sécurité.

Étape 2 : Définir la ressource groupe d'instances ECS

ALIYUN::ECS::InstanceGroup crée plusieurs instances ECS avec la même configuration en une seule fois, ce qui est plus efficace que de déclarer ALIYUN::ECS::Instance plusieurs fois.

Resources:
  # ============================================================
  # Compute layer: batch-create ECS instances
  # ============================================================

  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup  # Batch-create ECS instances
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ImageId: centos_7_9_x64_20G_alibase_20220727.vhd  # CentOS 7.9 image
      AllocatePublicIP: false  # Do not allocate a public IP address
      InstanceType: ecs.c5.large  # Instance type: 2 vCPUs, 4 GiB
      SystemDiskSize: 200  # 200 GiB system disk
      SystemDiskCategory: cloud_essd  # ESSD cloud disk
      MaxAmount: 3  # Create 3 ECS instances
      Password: <YourPassword>  # Replace with an actual password at deployment time (must contain uppercase letters, lowercase letters, digits, and special characters)
      InstanceName:  # Instance name: stack name plus a sequence number, such as mystack-0001
        Fn::Sub:
           - ${StackName}-[1,4]
           - StackName:
               Ref: ALIYUN::StackName

Points clés :

  • ALIYUN::ECS::InstanceGroup utilise la propriété MaxAmount pour spécifier le nombre d'instances ECS à créer.

  • La fonction Fn::Sub concatène des chaînes. [1,4] est un espace réservé de numéro de séquence spécifique à ROS. Il indique un nombre à 4 chiffres qui s'incrémente à partir de 1, comme 0001 et 0002.

  • L'attribut de sortie InstanceIds de cette ressource est une liste d'ID d'instance ECS, qui peut être référencée par le groupe de mise à l'échelle.

Étape 3 : Définir les ressources du groupe de mise à l'échelle (Groupe de mise à l'échelle+Configuration de mise à l'échelle+Activer la configuration de mise à l'échelle)

Un groupe de mise à l'échelle fonctionne grâce à trois ressources : ScalingGroup définit la politique de mise à l'échelle, ScalingConfiguration définit le modèle ECS utilisé lors de la montée en puissance, et ScalingGroupEnable active le groupe de mise à l'échelle et y ajoute les instances existantes.

Resources:
  # ============================================================
  # Auto Scaling layer: scaling group + scaling configuration + enable scaling group
  # ============================================================
  
  EssInstanceScalingGroup:
    Type: ALIYUN::ESS::ScalingGroup  # Create the scaling group
    Properties:
      ScalingGroupName:
        Ref: ALIYUN::StackName
      RemovalPolicys:
        - NewestInstance  # Scale-in policy: removes the most recently created instances first
      MinSize: 3  # The scaling group keeps at least 3 instances
      MaxSize: 50  # The scaling group can scale out to at most 50 instances
      VSwitchId:
        Ref: VSwitch  # Bind the scaling group to the VSwitch (determines the network location of instances added during scale-out)
      DefaultCooldown: 300  # A cooldown period of 300 seconds prevents frequent scaling

  EssInstanceScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration  # Scaling configuration (the ECS template used during scale-out)
    Properties:
      SecurityGroupId:
        Ref: EcsSecurityGroup
      ScalingGroupId:
        Ref: EssInstanceScalingGroup  # Associate with the scaling group defined above
      ScalingConfigurationName:
        Fn::Sub: sc-${ALIYUN::StackName}  # Fn::Sub substitutes the pseudo parameter variable directly
      InstanceType: ecs.c5.large  # ECS instance type created during scale-out (should match the initial ECS instances)
      SystemDiskCategory: cloud_essd
      SystemDiskSize: 200
      ImageId: centos_7_9_x64_20G_alibase_20220727.vhd  # Image used during scale-out (should match the initial ECS instances)

  EssInstanceScalingGroupEnable:
    Type: ALIYUN::ESS::ScalingGroupEnable  # Enable the scaling group
    Properties:
      ScalingRuleArisExecuteVersion: '1'
      ScalingConfigurationId:
        Ref: EssInstanceScalingConfiguration  # Specify the scaling configuration to take effect
      InstanceIds:
        # Add the ECS instances created in Step 2 to the scaling group
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds  # Obtain the list of all instance IDs of InstanceGroup
      ScalingGroupId:
        Ref: EssInstanceScalingGroup

Points clés :

  • Définissez MinSize du groupe de mise à l'échelle sur la même valeur que ECSInstanceGroupCount (le nombre d'instances créées initialement) pour éviter que la réduction de capacité ne soit déclenchée immédiatement après l'activation du groupe.

  • Vous pouvez ajouter une règle de mise à l'échelle (ALIYUN::ESS::ScalingRule) et une tâche d'alarme (ALIYUN::ESS::AlarmTask) au groupe de mise à l'échelle pour implémenter la mise à l'échelle automatique basée sur des métriques telles que l'utilisation du CPU et de la mémoire.

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

    • Ref renvoie l'identifiant principal d'une ressource, tel que le VpcId d'un VPC.

    • Fn::GetAtt renvoie un attribut connexe d'une ressource, tel que les InstanceIds de EcsInstanceGroup.

Version de base — modèle complet

Voici le modèle complet, prêt à l'emploi, qui combine les trois étapes précédentes :

ROSTemplateFormatVersion: '2015-09-01'
Description:
  zh-cn: 创建VPC网络环境,批量部署ECS实例并加入伸缩组,实现弹性扩缩容管理
  en: Create VPC network, deploy ECS instance group and manage them with ESS scaling group

Resources:
  # === basic network layer ===
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      CidrBlock: 192.168.0.0/16
      VpcName:
        Ref: ALIYUN::StackName

  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      ZoneId: cn-beijing-h
      CidrBlock: 192.168.0.0/24

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

  # === Computing layer ===
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      VpcId:
        Ref: Vpc
      SecurityGroupId:
        Ref: EcsSecurityGroup
      VSwitchId:
        Ref: VSwitch
      ImageId: centos_7_9_x64_20G_alibase_20220727.vhd
      AllocatePublicIP: false
      InstanceType: ecs.c5.large
      SystemDiskSize: 200
      SystemDiskCategory: cloud_essd
      MaxAmount: 3
      Password: <YourPassword>  
      InstanceName:
        Fn::Sub:
           - ${StackName}-[1,4]
           - StackName:
               Ref: ALIYUN::StackName

  # === ESS layer ===
  EssInstanceScalingGroup:
    Type: ALIYUN::ESS::ScalingGroup
    Properties:
      ScalingGroupName:
        Ref: ALIYUN::StackName
      RemovalPolicys:
        - NewestInstance
      MinSize: 3
      MaxSize: 50
      VSwitchId:
        Ref: VSwitch
      DefaultCooldown: 300

  EssInstanceScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration
    Properties:
      SecurityGroupId:
        Ref: EcsSecurityGroup
      ScalingGroupId:
        Ref: EssInstanceScalingGroup
      ScalingConfigurationName:
        Fn::Sub: sc-${ALIYUN::StackName}
      InstanceType: ecs.c5.large
      SystemDiskCategory: cloud_essd
      SystemDiskSize: 200
      ImageId: centos_7_9_x64_20G_alibase_20220727.vhd

  EssInstanceScalingGroupEnable:
    Type: ALIYUN::ESS::ScalingGroupEnable
    Properties:
      ScalingRuleArisExecuteVersion: '1'
      ScalingConfigurationId:
        Ref: EssInstanceScalingConfiguration
      InstanceIds:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      ScalingGroupId:
        Ref: EssInstanceScalingGroup

Outputs:
  ECSInstanceIds:
    Label: ECS instance ID list
    Value:
      Fn::GetAtt:
        - EcsInstanceGroup
        - InstanceIds

Points clés :

  • Une fois que le modèle a créé les ressources, vous pouvez interroger directement les attributs internes de ces ressources depuis les sorties (Outputs) du modèle, comme la liste des ID d'instance ECS.

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

Dans le modèle de base, des propriétés telles que InstanceType, SystemDiskCategory et ImageId des instances ECS, ainsi que MaxSize du groupe de mise à l'échelle, utilisent des valeurs fixes. Pour réutiliser le modèle dans une autre région ou avec différentes spécifications, vous devez modifier le modèle à plusieurs reprises. De plus, les paramètres d'un modèle dépendent souvent les uns des autres. Par exemple, le type d'instance ECS est limité par la zone (différentes zones ont différents inventaires de types d'instances), et la catégorie de disque système est limitée à la fois par la zone et le type d'instance. Si vous spécifiez ces paramètres manuellement, vous risquez facilement de sélectionner une combinaison indisponible, ce qui entraîne l'échec du déploiement.

Les optimisations suivantes améliorent considérablement la flexibilité et la réutilisabilité du modèle :

  • Paramétrage (Paramètres) : extraire les configurations variables en tant que paramètres et les spécifier dynamiquement au moment du déploiement.

  • Filtrage dynamique des paramètres (AssociationProperty) : permettre à la console ROS de filtrer automatiquement les options disponibles en fonction des paramètres déjà sélectionnés.

  • Regroupement des paramètres (Métadonnées) : afficher les paramètres dans des groupes logiques dans la console pour améliorer l'expérience de saisie.

Diagramme de dépendance des paramètres

L'exemple suivant utilise le type d'instance ECS et la catégorie de disque système pour illustrer la chaîne de dépendance entre les paramètres :

VSwitchZoneId (zone)  ← base parameter, no prerequisite
    ├──→ ECSInstanceType (ECS instance type)
    │             Depends on: ZoneId
    │
    └──→ ECSDiskCategory (system disk category)
                  Depends on: ZoneId + InstanceType

Logique centrale : sélectionnez d'abord la zone, puis filtrez les types d'instances ECS disponibles dans cette zone, et enfin filtrez les catégories de disque prises en charge par la zone et le type d'instance sélectionnés. Chaque étape n'affiche que les options valides dans les conditions actuelles, ce qui empêche les combinaisons invalides.

Explication de AssociationProperty

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

Définissez AssociationProperty sur ALIYUN::ECS::ZoneId pour lister toutes les zones de la région actuelle. Exemple :

VSwitchZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch Availability Zone
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和伸缩组将部署在此可用区
      en: Select the availability zone for VSwitch, ECS and scaling group will be deployed here
    AssociationProperty: ALIYUN::ECS::ZoneId

Ce paramètre sert de base de filtrage pour tous les paramètres suivants. Une fois que vous avez sélectionné une zone, les listes d'options des autres paramètres sont mises à jour en conséquence.

2. ECSInstanceType — type d'instance ECS

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

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

L'inventaire des types d'instances varie selon la zone. Sans filtrage, vous pourriez sélectionner un type en rupture de stock dans la zone, ce qui entraînerait l'échec de la création.

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

Définissez AssociationProperty sur ALIYUN::ECS::Disk::SystemDiskCategory pour lister les catégories de disques système disponibles, et associez ${VSwitchZoneId} et ${ECSInstanceType} pour filtrer les catégories de disques système prises en charge par la zone et le type d'instance ECS sélectionnés. Exemple :

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é d'une catégorie de disque système dépend à la fois de la zone (certaines zones ne prennent pas en charge ESSD) et du type d'instance (certains types ne prennent en charge que des catégories de disque spécifiques).

Exemple de filtrage dynamique des paramètres

L'exemple suivant montre l'effet de la configuration de AssociationProperty pour obtenir dynamiquement les types d'instances ECS et les catégories de disque :

Parameters:
  VSwitchZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch Availability Zone
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和伸缩组将部署在此可用区
      en: Select the availability zone for VSwitch, ECS and scaling group will be deployed here
    AssociationProperty: ALIYUN::ECS::ZoneId
  ECSInstanceType:
    Type: String
    Label:
      zh-cn: ECS实例规格
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}
  ECSDiskCategory:
    Type: String
    Label:
      zh-cn: 系统盘类型
      en: System Disk Category
    Description:
      zh-cn: 选择系统盘类型。可选值:cloud_essd(ESSD云盘)、cloud_ssd(SSD云盘)、cloud_efficiency(高效云盘)
      en: "System disk type. Options: cloud_essd, cloud_ssd, cloud_efficiency"
    AssociationProperty: ALIYUN::ECS::Disk::SystemDiskCategory
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}
      InstanceType: ${ECSInstanceType}

Fonctionnement de AssociationProperty

Lorsque vous créez une pile dans la console ROS, la sélection des paramètres s'effectue en cascade :

  1. Sélectionnez une zone (VSwitchZoneId).

  2. La liste déroulante des types d'instance ECS s'actualise automatiquement et n'affiche que les types d'instance disponibles dans cette zone.

  3. Une fois le type d'instance ECS sélectionné, la liste déroulante des catégories de disque système s'actualise à son tour pour ne montrer que les catégories prises en charge par cette zone et ce type d'instance.

Ainsi, chaque étape ne présente que les options valides selon le contexte actuel, ce qui évite les échecs de déploiement liés à des combinaisons de paramètres incorrectes.

Groupes de paramètres Metadata

En configurant ALIYUN::ROS::Interface dans la section Metadata, vous pouvez organiser les paramètres en groupes logiques, chacun doté d'un titre. La console affiche alors les paramètres par groupe, ce qui améliore considérablement l'expérience de saisie.

Structure syntaxique des métadonnées
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:           # List of parameter groups (required)
      - Parameters:            # List of parameter names in the group (required)
          - Parameter1
          - Parameter2
        Label:                 # Group heading (required)
          default:
            zh-cn: 中文标题
            en: English Title

Règles de syntaxe des métadonnées :

  • Les champs ParameterGroups, Parameters et Label sont tous obligatoires.

  • Les noms de paramètres listés dans Parameters doivent correspondre exactement aux noms définis dans la section Parameters du modèle.

  • Les paramètres qui n'appartiennent à aucun groupe s'affichent dans une zone non groupée de la console.

Conception des groupes de paramètres

Ce modèle répartit neuf paramètres en trois groupes selon le type de ressource :

┌────────────────────────────────────────────────────┐
│  Network configuration                             │
│  ├── VSwitch zone (VSwitchZoneId)                  │
│  ├── VPC CIDR block (VpcCidrBlock)                 │
│  └── VSwitch CIDR block (VSwitchCidrBlock)         │
├────────────────────────────────────────────────────┤
│  ECS instance configuration                        │
│  ├── ECS instance type (ECSInstanceType)           │
│  ├── ECS image ID (ECSImageId)                     │
│  ├── System disk category (ECSDiskCategory)        │
│  ├── ECS instance password (EcsInstancePassword)   │
│  └── ECS instance count (ECSInstanceGroupCount)    │
├────────────────────────────────────────────────────┤
│  ESS scaling group configuration                   │
│  └── Maximum instance count (ESSGroupMaxSize)      │
└────────────────────────────────────────────────────┘
Exemple de regroupement par métadonnées
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - VSwitchZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            zh-cn: 基础网络配置
            en: Network Configuration
      - Parameters:
          - ECSInstanceType
          - ECSDiskCategory
          - ECSImageId
          - EcsInstancePassword
          - ECSInstanceGroupCount
        Label:
          default:
            zh-cn: ECS实例配置
            en: ECS Instance Configuration
      - Parameters:
          - ESSGroupMaxSize
        Label:
          default:
            zh-cn: ESS伸缩组配置
            en: Scaling Group Configuration

Version avancée — modèle complet

ROSTemplateFormatVersion: '2015-09-01'
Description:
  zh-cn: >-
    参数化模板:批量创建ECS实例并通过弹性伸缩组管理,支持自动扩缩容。
    支持动态选择可用区、实例规格、磁盘类型和镜像,适用于多地域复用。
  en: >-
    Parameterized template: Create ECS instance group managed by ESS scaling group.
    Supports dynamic selection of zone, instance type, disk category and image.

Parameters:
  # ─── basic network parameters ───
  VSwitchZoneId:
    Type: String
    Label:
      zh-cn: 交换机可用区
      en: VSwitch Availability Zone
    Description:
      zh-cn: 选择交换机所在的可用区,ECS和伸缩组将部署在此可用区
      en: Select the availability zone for VSwitch, ECS and scaling group will be deployed here
    AssociationProperty: ALIYUN::ECS::ZoneId

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

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

  # ─── ECS instance parameters ───
  ECSInstanceType:
    Type: String
    Label:
      zh-cn: ECS实例规格
      en: ECS Instance Type
    Description:
      zh-cn: 选择ECS实例规格。列表已根据可用区自动过滤可用规格。
      en: Select ECS instance type. List is filtered by selected availability zone.
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}

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

  ECSImageId:
    Type: String
    Label:
      zh-cn: ECS镜像ID
      en: Image ID
    Description:
      zh-cn: 选择ECS实例使用的操作系统镜像
      en: Select the OS image for ECS instances
    AssociationProperty: ALIYUN::ECS::Image::ImageId

  ECSInstanceGroupCount:
    Type: Number
    Label:
      zh-cn: ECS初始实例数量
      en: Initial Instance Count
    Description:
      zh-cn: 初始创建的ECS实例数量,这些实例将加入伸缩组管理
      en: Number of ECS instances to create initially, they will be added to scaling group
    Default: 3

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

  # ─── scaling group parameters ───
  ESSGroupMaxSize:
    Type: Number
    Label:
      zh-cn: 伸缩组最大实例数
      en: Scaling Group Max Size
    Description:
      zh-cn: 伸缩组内ECS实例的最大数量,达到此上限后不再自动扩容
      en: Maximum number of ECS instances in scaling group
    Default: 50

Resources:
  # === basic network layer ===
  Vpc:
    Type: ALIYUN::ECS::VPC
    Properties:
      CidrBlock:
        Ref: VpcCidrBlock
      VpcName:
        Ref: ALIYUN::StackName

  VSwitch:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VSwitchName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      ZoneId:
        Ref: VSwitchZoneId
      CidrBlock:
        Ref: VSwitchCidrBlock

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

  # === Computing layer ===
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      InstanceName:
        Fn::Sub:
           - ${StackName}-[1,4]
           - StackName:
               Ref: ALIYUN::StackName
      VpcId:
        Ref: Vpc
      VSwitchId:
        Ref: VSwitch
      SecurityGroupId:
        Ref: EcsSecurityGroup
      SystemDiskCategory:
        Ref: ECSDiskCategory
      SystemDiskSize: 200
      MaxAmount:
        Ref: ECSInstanceGroupCount
      ImageId:
        Ref: ECSImageId
      InstanceType:
        Ref: ECSInstanceType
      Password:
        Ref: EcsInstancePassword
      AllocatePublicIP: false

  # === ESS layer ===
  EssInstanceScalingGroup:
    Type: ALIYUN::ESS::ScalingGroup
    Properties:
      ScalingGroupName:
        Ref: ALIYUN::StackName
      RemovalPolicys:
        - NewestInstance
      MinSize:
        Ref: ECSInstanceGroupCount
      MaxSize:
        Ref: ESSGroupMaxSize
      VSwitchId:
        Ref: VSwitch
      DefaultCooldown: 300

  EssInstanceScalingConfiguration:
    Type: ALIYUN::ESS::ScalingConfiguration
    Properties:
      SecurityGroupId:
        Ref: EcsSecurityGroup
      ScalingGroupId:
        Ref: EssInstanceScalingGroup
      ScalingConfigurationName:
        Fn::Sub: sc-${ALIYUN::StackName}
      InstanceType:
        Ref: ECSInstanceType
      SystemDiskCategory:
        Ref: ECSDiskCategory
      SystemDiskSize: 200
      ImageId:
        Ref: ECSImageId
      InstanceName:
        Fn::Sub:
           - ${StackName}-[index,1,4]
           - StackName:
               Ref: ALIYUN::StackName

  EssInstanceScalingGroupEnable:
    Type: ALIYUN::ESS::ScalingGroupEnable
    Properties:
      ScalingRuleArisExecuteVersion: '1'
      ScalingConfigurationId:
        Ref: EssInstanceScalingConfiguration
      InstanceIds:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      ScalingGroupId:
        Ref: EssInstanceScalingGroup

Outputs:
  ECSInstanceIds:
    Label: ECS 实例 ID 列表
    Value:
      Fn::GetAtt:
        - EcsInstanceGroup
        - InstanceIds

# === Metadata ===
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - VSwitchZoneId
          - VpcCidrBlock
          - VSwitchCidrBlock
        Label:
          default:
            zh-cn: 基础网络配置
            en: Network Configuration
      - Parameters:
          - ECSInstanceType
          - ECSDiskCategory
          - ECSImageId
          - EcsInstancePassword
          - ECSInstanceGroupCount
        Label:
          default:
            zh-cn: ECS实例配置
            en: ECS Instance Configuration
      - Parameters:
          - ESSGroupMaxSize
        Label:
          default:
            zh-cn: 伸缩组配置
            en: Scaling Group Configuration

Référence rapide des fonctions intégrées ROS utilisées dans ce modèle

Fonction

Exemple de syntaxe

Utilisation dans ce modèle

Description

Ref

Ref: MyVpc

Référence la valeur d'un paramètre ou l'identifiant principal d'une ressource.

L'appel sur un paramètre renvoie sa valeur ; l'appel sur une ressource renvoie son identifiant principal.

Fn::GetAtt

Fn::GetAtt: [EcsInstanceGroup, InstanceIds]

Obtient la liste des ID d'instance du groupe d'instances ECS.

Récupère un attribut de sortie d'une ressource après sa création (autre que l'identifiant principal).

Fn::Sub

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

Concatène le nom de la configuration de mise à l'échelle.

Utilisez ${Var} dans une chaîne de modèle pour référencer une variable ou un pseudo-paramètre.

Déploiement

Paramètres de déploiement

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

Paramètre

Description

Contrainte

VSwitchZoneId

ID de la zone.

Sélection dynamique dans la console.

ECSInstanceType

Type d'instance ECS.

Les types disponibles sont filtrés automatiquement selon la zone.

ECSDiskCategory

Catégorie de disque système ECS.

Filtrage automatique basé sur la zone et le type d'instance.

ECSImageId

ID de l'image ECS.

Sélection dynamique dans la console.

Paramètres facultatifs (valeurs par défaut présentes, peuvent rester vides)

Paramètre

Valeur par défaut

Description

VpcCidrBlock

192.168.0.0/16

Plage CIDR du VPC.

VSwitchCidrBlock

192.168.0.0/24

Plage CIDR du sous-réseau du vSwitch.

ECSInstanceGroupCount

3

Nombre d'instances ECS créées initialement.

ESSGroupMaxSize

50

Nombre maximal d'instances dans le groupe Auto Scaling ESS.

EcsInstancePassword

Aucune

Mot de passe de connexion des instances ECS. Il doit comporter entre 8 et 30 caractères et inclure au moins trois des types suivants : majuscules, minuscules, chiffres et caractères spéciaux.

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, accédez à Stacks > Create Stack.

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

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

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

Méthode 2 : Déploiement via le code IaC ROS

IaC Code est un assistant d'infrastructure as code basé sur l'IA pour les infrastructures cloud. Il aide les utilisateurs de ressources cloud et les ingénieurs DevOps à générer, déployer et gérer des modèles d'infrastructure via un flux de travail terminal.

# Prompt
Deploy a group of ECS instances and manage them with an Auto Scaling group. Requirements:
1. Use a newly created VPC and VSwitch.
2. Create 3 ECS instances initially and add them to the scaling group.
3. Set the maximum number of instances in the scaling group to 50 and the minimum number to 3.
4. Set the scale-in policy to remove the newest instances first.
5. Open inbound port 8080 in the security group.
6. Configure VSwitchZoneId, ECSInstanceType, ECSDiskCategory, and ECSImageId with AssociationProperty so that they are dynamically filtered in the console.

FAQ

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

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

Solution :

  • Dans le modèle avancé, AssociationProperty filtre automatiquement les types d'instance disponibles, ce qui évite ce problème.

  • Si vous utilisez le modèle de base, consultez la page tarification Elastic Compute Service (ECS) pour vérifier la disponibilité des types d'instance dans la zone cible, ou choisissez une autre zone.

Q2 : Le groupe Auto Scaling déclenche immédiatement une réduction de capacité après activation

Cause : la valeur MinSize est supérieure au nombre d'instances ayant effectivement rejoint le groupe, ou les instances n'ont pas pu rejoindre le groupe.

Solution :

  1. Assurez-vous que la valeur de ECSInstanceGroupCount est supérieure ou égale à la valeur MinSize du groupe Auto Scaling.

  2. Vérifiez que les instances ECS sont bien dans l'état Running.

  3. Confirmez que les instances et le groupe Auto Scaling appartiennent au même VPC ou au même vSwitch.

Q3 : Les nouvelles instances ECS créées lors d'un scale-out ont une configuration inattendue

Cause : les configurations définies dans ScalingConfiguration, telles que InstanceType et ImageId, ne correspondent pas à celles des instances ECS initiales.

Solution :

  • Dans le modèle avancé, les paramètres de ScalingConfiguration, comme InstanceType et ImageId, font référence aux mêmes paramètres que EcsInstanceGroup, garantissant ainsi la cohérence de la configuration lors du scale-out.

  • Si vous devez effectuer un scale-out avec des configurations différentes, créez plusieurs ressources ScalingConfiguration et contrôlez leurs proportions par pondération.

Q4 : Comment mettre en œuvre un Auto Scaling basé sur l'utilisation du CPU ?

Solution : ajoutez une règle de mise à l'échelle et une tâche d'alarme au modèle :

# Scale-out rule: adds 2 instances each time
ScaleOutRule:
  Type: ALIYUN::ESS::ScalingRule
  Properties:
    ScalingGroupId:
      Ref: EssInstanceScalingGroup
    ScalingRuleName: scale-out-2
    ScalingRuleType: SimpleScalingRule
    AdjustmentType: QuantityChangeInCapacity  # Adjust by quantity
    AdjustmentValue: 2  # Add 2 instances each time

# Alarm trigger: triggers scale-out when CPU utilization exceeds 80%
CpuAlarm:
  Type: ALIYUN::ESS::AlarmTask
  Properties:
    AlarmTaskName: cpu-high-alarm
    ScalingGroupId:
      Ref: EssInstanceScalingGroup
    MetricName: CpuUtilization
    Threshold: 80
    ComparisonOperator: '>='
    EvaluationCount: 3  # Triggers only after 3 consecutive samples exceed the threshold
    AlarmActions:
      - Fn::GetAtt:
          - ScaleOutRule
          - ScalingRuleAri

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

Solution : supprimez le VPC et le vSwitch de la section Resources et transmettez-les via 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}

Q6 : Comment associer un SLB au groupe Auto Scaling pour la répartition du trafic ?

Solution : ajoutez LoadBalancerIds aux Properties de ScalingGroup :

EssInstanceScalingGroup:
  Type: ALIYUN::ESS::ScalingGroup
  Properties:
    ScalingGroupName:
      Ref: ALIYUN::StackName
    RemovalPolicys:
      - NewestInstance
    MinSize:
      Ref: ECSInstanceGroupCount
    MaxSize:
      Ref: ESSGroupMaxSize
    VSwitchId:
      Ref: VSwitch
    DefaultCooldown: 300
    LoadBalancerIds:
      - Ref: MyLoadBalancer  # References an existing SLB instance

Lorsque le groupe Auto Scaling ajoute ou supprime des instances, celles-ci sont automatiquement ajoutées ou retirées du groupe de serveurs backend du SLB.