Aller au contenu
Infrastructure as Code medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Terraform AWS — Launch template et autoscaling group

12 min de lecture

logo terraform

Une EC2 seule reste un bon exercice, mais ce n’est pas encore un service résilient. Dès que vous devez conserver plusieurs instances disponibles, absorber une variation de charge ou remplacer progressivement une version applicative, vous avez besoin d’un niveau d’abstraction supplémentaire. Dans AWS, ce duo s’appelle launch template plus autoscaling group.

L’idée à retenir avant même d’écrire le code est simple : le launch template décrit à quoi doit ressembler une instance, tandis que l’ASG décide combien d’instances doivent exister en permanence. Ce guide relie explicitement ces deux rôles pour éviter l’impression de manipuler deux objets AWS sans rapport.

  • Créer un launch template avec AMI, type d’instance et tags
  • Créer un ASG avec min/max/desired capacity
  • Utiliser instance_refresh pour mettre à jour les instances sans interruption
  • Utiliser random_integer pour forcer les rolling updates
  • Vérifier les instances créées dans la console AWS

Beaucoup de débutants lisent aws_launch_template puis aws_autoscaling_group comme deux chapitres séparés. En réalité, l’un fournit le modèle, l’autre orchestre les copies de ce modèle. Sans template, l’ASG ne sait pas quoi lancer. Sans ASG, le template ne crée rien à lui seul.

Ce guide vous montre donc le couple complet, avec une idée pratique en tête : garder une capacité minimale et mettre à jour progressivement les instances lorsque le modèle change.

  • Terraform ≥ 1.11
  • AWS CLI configuré
  • Compréhension de variables, resources et outputs

Construire une infrastructure auto-scalable :

  1. Un launch template = modèle pour les instances
  2. Un ASG qui maintient 2 instances (min=2, max=4)
  3. Observation que l’ASG crée automatiquement les instances

Durée estimée : 15-20 minutes (création d’instances) Coût : Gratuit/quasi-gratuit (t2.micro dans tier gratuit)

Créez le répertoire :

Fenêtre de terminal
mkdir -p ~/terraform-aws-launch-template-asg
cd ~/terraform-aws-launch-template-asg

Créez versions.tf :

terraform {
required_version = ">= 1.11.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.0"
}
}
}
provider "aws" {
region = var.aws_region
}

Notez le provider random — nous l’utiliserons pour forcer les rolling updates.

Créez variables.tf :

variable "aws_region" {
type = string
default = "us-east-1"
}
variable "instance_type" {
type = string
default = "t2.micro"
}
variable "min_size" {
type = number
default = 2
}
variable "max_size" {
type = number
default = 4
}
variable "desired_capacity" {
type = number
default = 2
}

Créez main.tf :

# Lire l'AMI Ubuntu la plus récente
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"]
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
}
}
# Utiliser un random_integer pour forcer les rolling updates
resource "random_integer" "launch_template_version" {
min = 1
max = 1000
}
# Créer le launch template
resource "aws_launch_template" "lab05_template" {
name_prefix = "lab05-template-"
image_id = data.aws_ami.ubuntu.id
instance_type = var.instance_type
tag_specifications {
resource_type = "instance"
tags = {
Name = "lab05-asg-instance"
}
}
lifecycle {
create_before_destroy = true
}
}

Points clés :

  • name_prefix : génère un nom unique (ex : lab05-template-abc123)
  • tag_specifications : les instances héritent des tags
  • create_before_destroy : crée le nouveau template avant de supprimer l’ancien

Toujours dans main.tf, ajoutez :

# Lire les subnets par défaut
data "aws_subnets" "default" {
filter {
name = "default-for-az"
values = ["true"]
}
}
# Créer l'ASG
resource "aws_autoscaling_group" "lab05_asg" {
name = "lab05-asg-${random_integer.launch_template_version.result}"
min_size = var.min_size
max_size = var.max_size
desired_capacity = var.desired_capacity
vpc_zone_identifier = data.aws_subnets.default.ids
launch_template {
id = aws_launch_template.lab05_template.id
version = "$Latest"
}
instance_refresh {
strategy = "Rolling"
preferences {
min_healthy_percentage = 50
}
}
lifecycle {
create_before_destroy = true
}
tag {
key = "Name"
value = "lab05-asg-instance"
propagate_at_launch = true
}
}

Explications :

ParamètreRôle
min_sizeMinimum d’instances (2)
max_sizeMaximum d’instances (4)
desired_capacityCible actuelle (2) = créer 2 instances
vpc_zone_identifierAZs où lancer les instances
launch_template { version = "$Latest" }Utiliser la dernière version du template
instance_refresh { strategy = "Rolling" }Remplacer les instances progressivement
min_healthy_percentage = 50Garder au moins 50% des instances saines pendant l’update

Créez outputs.tf :

output "launch_template_id" {
value = aws_launch_template.lab05_template.id
}
output "launch_template_name_prefix" {
value = aws_launch_template.lab05_template.name_prefix
}
output "asg_name" {
value = aws_autoscaling_group.lab05_asg.name
}
output "asg_min_size" {
value = aws_autoscaling_group.lab05_asg.min_size
}
output "asg_max_size" {
value = aws_autoscaling_group.lab05_asg.max_size
}
output "asg_desired_capacity" {
value = aws_autoscaling_group.lab05_asg.desired_capacity
}
output "asg_availability_zones" {
value = aws_autoscaling_group.lab05_asg.availability_zones
}

Créez terraform.tfvars :

aws_region = "us-east-1"
instance_type = "t2.micro"
min_size = 2
max_size = 4
desired_capacity = 2
  1. Initialiser :

    Fenêtre de terminal
    terraform init
  2. Appliquer (⚠️ cela prend 3-4 minutes — création de 2 instances) :

    Fenêtre de terminal
    terraform apply -auto-approve

    Sortie attendue (fin) :

    Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
    Outputs:
    asg_availability_zones = toset([
    "us-east-1a",
    "us-east-1b",
    "us-east-1c",
    ...
    ])
    asg_desired_capacity = 2
    asg_max_size = 4
    asg_min_size = 2
    asg_name = "lab05-asg-121"
    launch_template_id = "lt-06738d00c2e67dafb"
    launch_template_name_prefix = "lab05-template-"
  3. Vérifier les instances dans la console AWS :

    Fenêtre de terminal
    aws ec2 describe-instances \
    --filters "Name=tag:Name,Values=lab05-asg-instance" \
    --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,SubnetId]' \
    --output table

    Sortie attendue :

    | i-0abc123... | running | t2.micro | subnet-xx... |
    | i-0def456... | running | t2.micro | subnet-yy... |
  4. Voir l’ASG :

    Fenêtre de terminal
    aws autoscaling describe-auto-scaling-groups \
    --auto-scaling-group-names lab05-asg-121 \
    --query 'AutoScalingGroups[0].[MinSize,MaxSize,DesiredCapacity,Instances]' \
    --output table
AspectLaunch TemplateASG
QuoiModèle pour les instancesGestionnaire d’instances
Crée des instances ?❌ Non✅ Oui
Instances réelles❌ Non✅ Oui (plusieurs)
Mise à jourNouvelle versionUtilise la nouvelle version

Quand le template change, l’ASG peut mettre à jour les instances de deux façons :

instance_refresh {
strategy = "Rolling" # ✅ Progressif
preferences {
min_healthy_percentage = 50
}
}
# vs
instance_refresh {
strategy = "BlueGreen" # Swap environnements
}

Rolling = remplacer progressivement (moins de downtime) BlueGreen = tout swap à la fois (risqué mais rapide)

# ❌ Ancien style (déprécié)
resource "aws_autoscaling_group" "bad" {
launch_configuration = aws_launch_configuration.example.id
}
# ✅ Nouveau style
resource "aws_autoscaling_group" "good" {
launch_template {
id = aws_launch_template.example.id
version = "$Latest"
}
}
lifecycle {
create_before_destroy = true
}

Cela évite les gaps de 0 instances pendant les updates.

instance_refresh {
strategy = "Rolling"
preferences {
min_healthy_percentage = 90
instance_warmup_seconds = 300
}
}

Cela maintient le service disponible pendant les mises à jour.

variable "desired_capacity" {
description = "Desired number of instances"
type = number
default = 2
}
# Changez `terraform.tfvars` pour scaler
# desired_capacity = 5 # ASG créera 3 instances supplémentaires
SymptômeCauseSolution
ASG créé mais 0 instancePas de subnets disponiblesVérifier vpc_zone_identifier
Les instances sont correctes mais ASG unhealthyHealth check failedVérifier les security groups et ports
Plan montre “replacement” à chaque terraform planrandom_integer changeC’est normal — utiliser lifecycle.ignore_changes si besoin
Impossible de SSH aux instancesPas de key pair ni security groupAjouter key_name au template et SSH ingress

Important : destruction prend 3-4 minutes (arrêt des instances) :

Fenêtre de terminal
terraform destroy -auto-approve
rm -rf .terraform* terraform.tfstate*
  1. Launch template = modèle réutilisable pour les instances
  2. ASG = gestionnaire automatique d’instances (min/max/desired)
  3. Instance refresh = mise à jour progressive des instances
  4. $Latest = toujours utiliser la dernière version du template
  5. create_before_destroy = éviter les gaps de 0 instances
  6. random_integer = utile pour forcer des updates en labs
  7. Scaling = changez desired_capacity pour ajouter/retirer des instances

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn