Tous les produits
Search
Centre de documentation

Resource Orchestration Service:Déployer NGINX sur une instance ECS à l'aide de Terraform

Dernière mise à jour :Aug 27, 2026

Alibaba Cloud Resource Orchestration Service (ROS) utilise un modèle Terraform pour créer automatiquement une infrastructure réseau cloud complète et une instance ECS, puis installer et démarrer NGINX sur cette instance en une seule opération. Cette solution convient aux scénarios nécessitant la construction rapide et répétée d'environnements de serveur web.

Présentation de la solution

Cette solution exécute un modèle Terraform via Alibaba Cloud Resource Orchestration Service (ROS) afin de créer automatiquement, en une seule opération, une infrastructure réseau cloud complète et une instance ECS, tout en installant et en démarrant le service NGINX sur l'instance ECS. Elle s'applique aux cas où un environnement de serveur web doit être mis en place rapidement et de manière récurrente.

Scénario métier

Créez une instance ECS dans un VPC Alibaba Cloud, configurez un groupe de sécurité autorisant l'accès Secure Shell (SSH) sur le port 22 et l'accès HTTP/HTTPS sur les ports 80 à 443, attachez un disque de données et utilisez un script d'initialisation user_data pour installer et démarrer automatiquement le service NGINX.

Ressources créées par le modèle

Ressource

Type de ressource Terraform

Description

1

VPC

alicloud_vpc

Fournit un environnement réseau isolé

2

vSwitch

alicloud_vswitch

Alloue un sous-réseau au sein du VPC et spécifie la zone

3

Groupe de sécurité

alicloud_security_group

Contrôle les règles d'accès réseau de l'instance ECS

4

Règle de groupe de sécurité (SSH)

alicloud_security_group_rule

Autorise l'accès entrant sur le port 22

5

Règle de groupe de sécurité (Web)

alicloud_security_group_rule

Autorise l'accès entrant sur les ports 80 à 443

6

Règle de groupe de sécurité (sortant)

alicloud_security_group_rule

Autorise tout le trafic sortant

7

Instance ECS

alicloud_instance

Nœud de calcul exécutant NGINX, avec un disque de données

Résultats après le déploiement

Une fois l'exécution du modèle réussie, vous obtenez les ressources suivantes :

  • Un environnement réseau VPC complet, incluant le VPC, le vSwitch, le groupe de sécurité et les règles de groupe de sécurité

  • Une instance ECS dotée d'un disque de données de 100 Go et d'une adresse IP publique attribuée

  • Le service NGINX installé et démarré automatiquement sur l'instance ECS

  • L'accès à la page par défaut de NGINX via l'adresse IP publique renvoyée dans la sortie

Diagramme d'architecture

image

Prérequis

Avant d'utiliser ce modèle, assurez-vous que les conditions suivantes sont remplies :

  • Autorisations du compte : le compte Alibaba Cloud dispose des autorisations nécessaires pour créer des ressources ECS et VPC.

  • Connaissances de base : vous maîtrisez la syntaxe et la structure fondamentales des modèles Terraform. Pour plus d'informations, consultez Structure des modèles Terraform.

  • Affichage des types de ressources : vous pouvez consulter les détails des propriétés des ressources Terraform dans l'index des ressources du fournisseur Terraform alicloud. Chaque propriété est indiquée comme Optional ou Required.

Tutoriel de création de modèle

Ce tutoriel illustre le processus de création de modèle Terraform en deux étapes :

  • Étape 1 (base) : utilise des valeurs de paramètres fixes et se concentre sur les définitions des ressources Terraform et leurs dépendances.

  • Étape 2 (avancée) : ajoute le filtrage dynamique des paramètres via AssociationProperty, le regroupement des paramètres et les contraintes de paramètres pour améliorer l'expérience utilisateur dans la console.

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

Étape 1 : Définir les ressources réseau de base

Les ressources réseau de base incluent alicloud_vpc, alicloud_vswitch et alicloud_security_group, qui servent de fondation à toutes les autres ressources. Terraform établit automatiquement les dépendances grâce aux références de propriétés entre les ressources.

# ============================================================
# Basic network-layer resources: VPC → VSwitch → SecurityGroup
# ============================================================

resource "alicloud_vpc" "vpc" {
  cidr_block = "192.168.0.0/16"  # VPC CIDR block, which holds up to 65,534 private IP addresses
}

resource "alicloud_vswitch" "vsw" {
  vpc_id     = alicloud_vpc.vpc.id  # References the VPC ID. Terraform establishes the dependency automatically
  cidr_block = "192.168.0.0/24"    # Subnet CIDR block, which must be a subset of the VPC CIDR block
  zone_id    = "cn-beijing-h"      # This scenario uses zone H in the China (Beijing) region as an example
}

resource "alicloud_security_group" "security_group" {
  name   = "sg-for-nginx"           # Security group name
  vpc_id = alicloud_vpc.vpc.id      # Binds the security group to the same VPC
}

Points clés :

  • Dépendance implicite versus dépendance explicite (depends_on) :

    • La propriété vpc_id de alicloud_vswitch.vsw fait référence à alicloud_vpc.vpc.id. Terraform reconnaît automatiquement cette dépendance et veille à ce que le VPC soit créé avant le vSwitch.

    • depends_on (dépendance explicite) n'est nécessaire que lorsque deux ressources n'ont aucune référence directe entre elles, mais que la logique métier impose un ordre spécifique.

Étape 2 : Définir les règles de groupe de sécurité

alicloud_security_group_rule contrôle le trafic réseau entrant et sortant de l'instance ECS. Ce scénario nécessite l'ouverture du port de connexion distante SSH et des ports d'accès web.

# ============================================================
# Security group rules: inbound SSH + inbound Web + all outbound traffic allowed
# ============================================================

# Inbound rule 1: opens SSH port 22 (for remote management)
resource "alicloud_security_group_rule" "allow_ssh" {
  security_group_id = alicloud_security_group.security_group.id  # Associates the rule with the security group
  type              = "ingress"     # Inbound direction
  cidr_ip           = "0.0.0.0/0"  # Allows access from all IP addresses (restrict the IP range in production environments)
  policy            = "accept"      # Accept policy
  ip_protocol       = "tcp"         # TCP protocol
  port_range        = "22/22"       # Port range: port 22 only
  priority          = 1             # Priority: 1 (highest)
}

# Inbound rule 2: opens web ports 80 to 443 (HTTP/HTTPS access to NGINX)
resource "alicloud_security_group_rule" "allow_web" {
  security_group_id = alicloud_security_group.security_group.id
  type              = "ingress"
  cidr_ip           = "0.0.0.0/0"
  policy            = "accept"
  ip_protocol       = "tcp"
  port_range        = "80/443"      # Port range: 80 to 443
  priority          = 1
}

# Outbound rule: allows all outbound traffic (the ECS instance can access external networks such as yum repositories)
resource "alicloud_security_group_rule" "allow_egress" {
  security_group_id = alicloud_security_group.security_group.id
  type              = "egress"      # Outbound direction
  cidr_ip           = "0.0.0.0/0"
  policy            = "accept"
  ip_protocol       = "tcp"
  port_range        = "1/65535"     # All ports
  priority          = 1
}

Points clés :

  • Le format de plage de ports dans Terraform est "port de début/port de fin". Par exemple, "80/443" indique tous les ports de 80 à 443, et un port unique s'écrit "22/22".

  • Dans les environnements de production, restreignez le cidr_ip de la règle SSH aux adresses IP du bureau afin d'éviter les analyses malveillantes.

  • Pour ouvrir un autre port, tel que 8080, ajoutez une autre ressource alicloud_security_group_rule.

Étape 3 : Définir l'instance ECS et le script d'initialisation

alicloud_instance est le nœud de calcul qui exécute NGINX. La propriété user_data spécifie le script d'initialisation exécuté lors du premier démarrage.

Script d'initialisation user_data (user-data.sh) :

#!/bin/bash -v
# ---- Format and mount the data disk ----
cat >> /root/InitDataDisk.sh << "EOF"
#!/bin/bash
echo "p
n
p
w
" |  fdisk -u /dev/vdb
EOF
/bin/bash /root/InitDataDisk.sh
rm -f /root/InitDataDisk.sh
mkfs -t ext4 /dev/vdb1
cp /etc/fstab /etc/fstab.bak
mkdir /disk1
echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab
mount -a

# ---- Install and start NGINX ----
yum install -y nginx
/usr/sbin/nginx

Définition de la ressource d'instance ECS :

# ============================================================
# Compute layer: ECS instance (data disk + NGINX initialization)
# ============================================================

resource "alicloud_instance" "instance" {
  availability_zone          = "cn-beijing-h"
  security_groups            = [alicloud_security_group.security_group.id]  # Binds security groups in array format
  host_name                  = "app-for-nginx"
  instance_type              = "ecs.c6e.large"        # Instance type (compute optimized, 2 vCPUs and 4 GiB of memory)
  system_disk_size           = 100                     # System disk size
  system_disk_category       = "cloud_essd"            # System disk type
  image_id                   = "centos_7_9_x64_20G_alibase_20210318.vhd"  # CentOS 7.9 image
  vswitch_id                 = alicloud_vswitch.vsw.id # Binds the instance to the vSwitch
  password                   = "<YourPassword>"        # Replace with the actual password at deployment (must contain uppercase and lowercase letters, digits, and special characters)
  internet_charge_type       = "PayByTraffic"          # Pay-by-traffic billing for the public bandwidth
  internet_max_bandwidth_out = 30                      # 30 Mbit/s outbound public bandwidth
  instance_charge_type       = "PostPaid"              # Billing type (pay-as-you-go or subscription)
  user_data                  = file("${path.cwd}/user-data.sh")  # Loads the initialization script

  data_disks {              # Data disk configuration
    size     = 100          # Data disk size
    category = "cloud_essd" # Data disk type
  }
}

# Outputs the NGINX access URL
output "nginx_ip" {
  value = "http://${alicloud_instance.instance.public_ip}:80"
}

Points clés : méthodes de référence des variables Terraform

Méthode de référence

Syntaxe

Description

Référence de variable

var.variable_name

Récupère la valeur d'un paramètre défini dans un bloc variable (démontré dans le modèle avancé)

Référence de propriété de ressource

resource_type.resource_name.property

Récupère une propriété de sortie d'une autre ressource, telle que alicloud_vpc.vpc.id ou alicloud_instance.instance.public_ip

Chargement de fichier

file("${path.cwd}/file_name")

Charge le contenu d'un fichier situé dans le répertoire de travail actuel

Extensions et variantes du modèle :

  • user_data charge un fichier de script externe à l'aide de la fonction file()

    Exemple

    Utilisation dans ce modèle

    var.variable_name

    var.zone_id

    Fait référence à la valeur d'un paramètre d'entrée définie par une variable

    local.variable_name

    local.new_host_name

    Fait référence à une variable locale définie dans un bloc locals

    resource_type.name.property

    alicloud_vpc.vpc.id

    Fait référence à une propriété de sortie d'une autre ressource et établit automatiquement la dépendance

    file("path")

    file("${path.cwd}/user-data.sh")

    Charge le contenu d'un fichier externe en tant que valeur de propriété

    "${expression}"

    "sg-for-${local.production_name}"

    Interpolation de chaîne, qui intègre la valeur d'une variable dans une chaîne

    <<EOT ... EOT

    description = <<EOT {...} EOT

    Chaîne multiligne, utilisée pour intégrer des configurations JSON

    $${variable_name}

    "$${pay_type}"

    Fait référence à la valeur actuelle d'une autre variable dans le JSON de la description

Déploiement

Paramètres de déploiement

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

Paramètre

Type

Description

Contrainte

zone_id

String

Zone vSwitch

Sélection dynamique dans la console

instance_type

String

Type d'instance ECS

Filtré automatiquement par zone

system_disk_category

String

Type de disque système

Filtré automatiquement par zone + type d'instance

data_disk_category

String

Type de disque de données

Filtré automatiquement par zone + type d'instance

instance_password

String

Mot de passe de connexion ECS

Longueur de 8 à 30 caractères ; doit contenir au moins une majuscule, une minuscule, un chiffre et un caractère spécial

Paramètres facultatifs (possèdent des valeurs par défaut, peuvent rester inchangés)

Paramètre

Par défaut

Description

pay_type

PostPaid

Type de facturation (PostPaid pour le paiement à l'utilisation, PrePaid pour l'abonnement)

pay_period_unit

Month

Unité de durée d'abonnement (affichée uniquement pour PrePaid)

pay_period

1

Durée d'abonnement (affichée uniquement pour PrePaid)

vpc_cidr_block

192.168.0.0/16

Plage de blocs CIDR VPC

vswitch_cidr_block

192.168.0.0/24

Bloc CIDR du sous-réseau vSwitch

system_disk_size

40

Taille du disque système (Go), valeurs valides : 40 à 500

data_disk_size

100

Taille du disque de données (Gio), valeurs valides : 20 à 32768

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, sélectionnez Templates > My Templates > Create Template.

  3. Pour le type de modèle, choisissez le modèle Terraform.

  4. Créez un fichier main.tf et collez-y le contenu main.tf du modèle avancé.

  5. Créez un fichier user-data.sh et collez-y le contenu du script user-data.sh.

  6. Créez un fichier .metadata et collez-y la configuration JSON .metadata.

  7. Après avoir enregistré le modèle, accédez à Stacks > Create Stack > Select an existing template > My Templates, puis sélectionnez le modèle.

  8. Spécifiez les paramètres de configuration par groupe, puis cliquez sur Create.

  9. Attendez que l'état de la pile passe à CREATE_COMPLETE, puis consultez l'URL d'accès NGINX dans l'onglet Outputs.

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

IaC Code est un assistant d'infrastructure as code (IaC) alimenté par l'IA pour les infrastructures cloud. Il génère, déploie et gère des modèles d'infrastructure via des invites en langage naturel. Son architecture est conçue pour les workflows multicloud. L'invite suivante sert de référence pour cette solution :

# Prompt

Help me create an ECS instance and deploy the NGINX service by using a Terraform template.
Requirements:
1. Create a new VPC and `vSwitch` as the basic network.
2. The security group allows inbound access on port 22 (SSH) and ports 80 to 443 (web access).
3. The ECS instance requires a public IP address, with an outbound bandwidth of 30 Mbit/s.
4. Attach a 100 GB data disk, format it, and mount it to /disk1.
5. Install and start NGINX automatically through a user_data script.
6. zone_id, instance_type, system_disk_category, and data_disk_category all require AssociationProperty dynamic filtering.
7. The billing type parameter requires conditional visibility (the subscription duration is displayed only for subscription billing).

FAQ

Q1 : Le déploiement échoue avec le message d'erreur « 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 fonctionne conjointement avec ResourcesForParameterConstraints pour filtrer automatiquement les types d'instance disponibles, ce qui évite ce problème.

  • Si vous utilisez le modèle de base, vérifiez la disponibilité du type d'instance dans la zone cible sur la page des Elastic Compute Service (ECS) pricing.

Q2 : L'instance ECS est créée, mais la page NGINX n'est pas accessible

Étapes de dépannage :

  • Vérifiez que la règle du groupe de sécurité autorise le trafic entrant sur le port 80 (vérifiez la règle allow_web).

  • Connexion à l'instance ECS, puis exécutez systemctl status nginx pour vérifier que NGINX fonctionne correctement.

  • Vérifiez si le script user_data s'est exécuté avec succès : consultez cat /var/log/messages | grep cloud-init.

  • Vérifiez que l'instance ECS dispose d'une adresse IP publique (une adresse IP publique est attribuée automatiquement lorsque internet_max_bandwidth_out > 0).

Q3 : L'échec d'exécution du script user_data empêche le montage du disque de données

Cause : L'image peut être incompatible ou le nom du périphérique du disque de données peut ne pas correspondre.

Solution :

  • Le chemin /dev/vdb utilisé dans le script user_data correspond au nom de périphérique par défaut du disque de données. Assurez-vous que le bloc data_disks est configuré dans le modèle.

  • Si vous utilisez une image autre que CentOS, vous devrez peut-être ajuster la commande de partitionnement (par exemple, utiliser parted au lieu de fdisk).

  • Si aucun disque de données n'est requis, vous pouvez supprimer le bloc data_disks ainsi que la partie du script user_data dédiée au montage du disque.

Q4 : Comment convertir un modèle Terraform en modèle ROS ?

Méthode 1 : Conversion dans la console

  • Dans la console ROS, sélectionnez Templates > My Templates > Create Template.

  • Rédigez d'abord le modèle dans l'onglet de modèle Terraform.

  • Basculez vers l'onglet de modèle ROS et sélectionnez YAML en haut à droite. Le système convertit automatiquement le modèle Terraform au format suivant :

ROSTemplateFormatVersion: '2015-09-01'
Transform: Aliyun::Terraform-v1.2
Workspace:
  .metadata: |-
    { ... }  # Parameter grouping and constraint configuration
  main.tf: |-
    ...      # Terraform template content
  user-data.sh: |-
    ...      # Initialization script content

Méthode 2 : Utilisation de Template Transformer

rostran transform templates/terraform/alicloud/main.tf --target-format json

Q5 : Comment déployer un autre service web, tel qu'Apache ou Tomcat ?

Points de modification :

  • Modifiez les commandes d'installation et de démarrage dans user-data.sh :

    • Apache : yum install -y httpd && systemctl start httpd

    • Tomcat : installez le JDK, puis téléchargez et démarrez Tomcat.

  • Ajustez la plage de ports de la règle du groupe de sécurité (par exemple, Tomcat utilise par défaut le port 8080).

  • Modifiez le numéro de port dans la sortie.

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

Solution : Modifiez le VPC et le vSwitch pour sélectionner des ressources existantes :

variable "vpc_id" {
  type = string
  description = <<EOT
  {
    "Label": { "zh-cn": "Existing VPC" },
    "AssociationProperty": "ALIYUN::ECS::VPC::VPCId"
  }
  EOT
}
variable "vswitch_id" {
  type = string
  description = <<EOT
  {
    "Label": { "zh-cn": "Existing VSwitch" },
    "AssociationProperty": "ALIYUN::VPC::VSwitch::VSwitchId",
    "AssociationPropertyMetadata": {
      "VpcId": "$${vpc_id}"
    }
  }
  EOT
}

Ensuite, remplacez vswitch_id dans alicloud_instance par var.vswitch_id, et supprimez les blocs de ressources alicloud_vpc et alicloud_vswitch.

Pour plus d'informations sur les problèmes de déploiement des ressources, consultez la FAQ.