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
|
N° |
Ressource |
Type de ressource Terraform |
Description |
|
1 |
VPC |
|
Fournit un environnement réseau isolé |
|
2 |
|
|
Alloue un sous-réseau au sein du VPC et spécifie la zone |
|
3 |
Groupe de sécurité |
|
Contrôle les règles d'accès réseau de l'instance ECS |
|
4 |
Règle de groupe de sécurité (SSH) |
|
Autorise l'accès entrant sur le port 22 |
|
5 |
Règle de groupe de sécurité (Web) |
|
Autorise l'accès entrant sur les ports 80 à 443 |
|
6 |
Règle de groupe de sécurité (sortant) |
|
Autorise tout le trafic sortant |
|
7 |
Instance ECS |
|
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

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
OptionalouRequired.
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_iddealicloud_vswitch.vswfait référence àalicloud_vpc.vpc.id. Terraform reconnaît automatiquement cette dépendance et veille à ce que le VPC soit créé avant levSwitch.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_ipde 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 |
|
Récupère la valeur d'un paramètre défini dans un bloc |
|
Référence de propriété de ressource |
|
Récupère une propriété de sortie d'une autre ressource, telle que |
|
Chargement de fichier |
|
Charge le contenu d'un fichier situé dans le répertoire de travail actuel |
Extensions et variantes du modèle :
user_datacharge un fichier de script externe à l'aide de la fonctionfile()Exemple
Utilisation dans ce modèle
var.variable_namevar.zone_idFait référence à la valeur d'un paramètre d'entrée définie par une variable
local.variable_namelocal.new_host_nameFait référence à une variable locale définie dans un bloc locals
resource_type.name.propertyalicloud_vpc.vpc.idFait 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 ... EOTdescription = <<EOT {...} EOTChaî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 |
|
|
String |
Zone |
Sélection dynamique dans la console |
|
|
String |
Type d'instance ECS |
Filtré automatiquement par zone |
|
|
String |
Type de disque système |
Filtré automatiquement par zone + type d'instance |
|
|
String |
Type de disque de données |
Filtré automatiquement par zone + type d'instance |
|
|
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 |
|
|
|
Type de facturation ( |
|
|
Month |
Unité de durée d'abonnement (affichée uniquement pour |
|
|
1 |
Durée d'abonnement (affichée uniquement pour |
|
|
192.168.0.0/16 |
Plage de blocs CIDR VPC |
|
|
192.168.0.0/24 |
Bloc CIDR du sous-réseau |
|
|
40 |
Taille du disque système (Go), valeurs valides : 40 à 500 |
|
|
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
Connectez-vous à la console ROS.
Dans le volet de navigation de gauche, sélectionnez Templates > My Templates > Create Template.
Pour le type de modèle, choisissez le modèle Terraform.
Créez un fichier
main.tfet collez-y le contenu main.tf du modèle avancé.Créez un fichier user-data.sh et collez-y le contenu du script user-data.sh.
Créez un fichier
.metadataet collez-y la configuration JSON .metadata.Après avoir enregistré le modèle, accédez à Stacks > Create Stack > Select an existing template > My Templates, puis sélectionnez le modèle.
Spécifiez les paramètres de configuration par groupe, puis cliquez sur Create.
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é,
AssociationPropertyfonctionne conjointement avecResourcesForParameterConstraintspour 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 nginxpour vérifier que NGINX fonctionne correctement.Vérifiez si le script
user_datas'est exécuté avec succès : consultezcat /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/vdbutilisé dans le scriptuser_datacorrespond au nom de périphérique par défaut du disque de données. Assurez-vous que le blocdata_disksest 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
partedau lieu defdisk).Si aucun disque de données n'est requis, vous pouvez supprimer le bloc
data_disksainsi que la partie du scriptuser_datadé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
Exécutez la commande de conversion :
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 httpdTomcat : 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.