$ terraform --version
Terraform v1.14.8
on windows_amd64 $ aws --version
aws-cli/2.34.32 Python/3.14.4 Windows/11 exe/AMD64
$ terraform --version
Terraform v1.14.8
on windows_amd64 $ aws --version
aws-cli/2.34.32 Python/3.14.4 Windows/11 exe/AMD64
$ terraform --version
Terraform v1.14.8
on windows_amd64 $ aws --version
aws-cli/2.34.32 Python/3.14.4 Windows/11 exe/AMD64
aws configure
# Access Key ID : ...
# Secret Access Key : ...
# Default region : eu-west-3
# Default output format : json
aws configure
# Access Key ID : ...
# Secret Access Key : ...
# Default region : eu-west-3
# Default output format : json
aws configure
# Access Key ID : ...
# Secret Access Key : ...
# Default region : eu-west-3
# Default output format : json
$ aws sts get-caller-identity
{ "UserId": "AIDA...", "Account": "***", "Arn": "arn:aws:iam::***:user/terraform-admin"
}
$ aws sts get-caller-identity
{ "UserId": "AIDA...", "Account": "***", "Arn": "arn:aws:iam::***:user/terraform-admin"
}
$ aws sts get-caller-identity
{ "UserId": "AIDA...", "Account": "***", "Arn": "arn:aws:iam::***:user/terraform-admin"
}
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } }
} provider "aws" { region = "eu-west-3"
} data "aws_ami" "ubuntu" { most_recent = true owners = ["099720109477"] filter { name = "name" values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"] }
} resource "aws_instance" "mon_premier_serveur" { ami = data.aws_ami.ubuntu.id instance_type = "t3.micro" tags = { Name = "lecon01-premier-serveur" }
}
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } }
} provider "aws" { region = "eu-west-3"
} data "aws_ami" "ubuntu" { most_recent = true owners = ["099720109477"] filter { name = "name" values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"] }
} resource "aws_instance" "mon_premier_serveur" { ami = data.aws_ami.ubuntu.id instance_type = "t3.micro" tags = { Name = "lecon01-premier-serveur" }
}
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } }
} provider "aws" { region = "eu-west-3"
} data "aws_ami" "ubuntu" { most_recent = true owners = ["099720109477"] filter { name = "name" values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"] }
} resource "aws_instance" "mon_premier_serveur" { ami = data.aws_ami.ubuntu.id instance_type = "t3.micro" tags = { Name = "lecon01-premier-serveur" }
}
resource "aws_instance" "serveur" { ami = "ami-025ddada2a5392251" # Ubuntu 24.04 du 9 avril instance_type = "t3.micro"
}
resource "aws_instance" "serveur" { ami = "ami-025ddada2a5392251" # Ubuntu 24.04 du 9 avril instance_type = "t3.micro"
}
resource "aws_instance" "serveur" { ami = "ami-025ddada2a5392251" # Ubuntu 24.04 du 9 avril instance_type = "t3.micro"
}
data "aws_ami" "ubuntu" { most_recent = true owners = ["099720109477"] filter { name = "name" values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"] }
} resource "aws_instance" "serveur" { ami = data.aws_ami.ubuntu.id instance_type = "t3.micro"
}
data "aws_ami" "ubuntu" { most_recent = true owners = ["099720109477"] filter { name = "name" values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"] }
} resource "aws_instance" "serveur" { ami = data.aws_ami.ubuntu.id instance_type = "t3.micro"
}
data "aws_ami" "ubuntu" { most_recent = true owners = ["099720109477"] filter { name = "name" values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"] }
} resource "aws_instance" "serveur" { ami = data.aws_ami.ubuntu.id instance_type = "t3.micro"
}
provider "aws" { region = "eu-west-3" s3_force_path_style = true # Valide en v4
}
provider "aws" { region = "eu-west-3" s3_force_path_style = true # Valide en v4
}
provider "aws" { region = "eu-west-3" s3_force_path_style = true # Valide en v4
}
Error: Unsupported argument on main.tf line 4, in provider "aws": 4: s3_force_path_style = true
An argument named "s3_force_path_style" is not expected here.
Error: Unsupported argument on main.tf line 4, in provider "aws": 4: s3_force_path_style = true
An argument named "s3_force_path_style" is not expected here.
Error: Unsupported argument on main.tf line 4, in provider "aws": 4: s3_force_path_style = true
An argument named "s3_force_path_style" is not expected here.
$ terraform init
Initializing provider plugins...
- Installing hashicorp/aws v5.100.0...
Terraform has been successfully initialized!
$ terraform init
Initializing provider plugins...
- Installing hashicorp/aws v5.100.0...
Terraform has been successfully initialized!
$ terraform init
Initializing provider plugins...
- Installing hashicorp/aws v5.100.0...
Terraform has been successfully initialized!
Plan: 1 to add, 0 to change, 0 to destroy.
Plan: 1 to add, 0 to change, 0 to destroy.
Plan: 1 to add, 0 to change, 0 to destroy.
Error: creating EC2 Instance: InvalidParameterCombination: The specified instance type is not eligible for Free Tier.
Error: creating EC2 Instance: InvalidParameterCombination: The specified instance type is not eligible for Free Tier.
Error: creating EC2 Instance: InvalidParameterCombination: The specified instance type is not eligible for Free Tier.
$ aws ec2 describe-instance-types \ --filters "Name=free-tier-eligible,Values=true" \ --query "InstanceTypes[].InstanceType" --output text t4g.small c7i-flex.large t3.micro t4g.micro t3.small ...
$ aws ec2 describe-instance-types \ --filters "Name=free-tier-eligible,Values=true" \ --query "InstanceTypes[].InstanceType" --output text t4g.small c7i-flex.large t3.micro t4g.micro t3.small ...
$ aws ec2 describe-instance-types \ --filters "Name=free-tier-eligible,Values=true" \ --query "InstanceTypes[].InstanceType" --output text t4g.small c7i-flex.large t3.micro t4g.micro t3.small ...
aws_instance.mon_premier_serveur: Creating...
aws_instance.mon_premier_serveur: Still creating... [00m10s elapsed]
aws_instance.mon_premier_serveur: Creation complete after 13s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
aws_instance.mon_premier_serveur: Creating...
aws_instance.mon_premier_serveur: Still creating... [00m10s elapsed]
aws_instance.mon_premier_serveur: Creation complete after 13s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
aws_instance.mon_premier_serveur: Creating...
aws_instance.mon_premier_serveur: Still creating... [00m10s elapsed]
aws_instance.mon_premier_serveur: Creation complete after 13s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
terraform destroy
terraform destroy
terraform destroy - Téléchargé Terraform depuis le site officiel HashiCorp
- Extrait le terraform.exe dans C:\tools\terraform\
- Ajouté ce dossier au PATH Windows - resource → "je veux que Terraform CRÉE ça pour moi" (une EC2, un VPC, un bucket S3...)
- data → "je veux LIRE une info qui existe déjà quelque part" (l'AMI publiée par Canonical, un VPC créé par un collègue, etc.)
Si je mets un AMI ID en dur dans mon code, je suis coincé avec cette version précise. Dans 3 mois, Canonical publie une mise à jour de sécurité d'Ubuntu : nouvelle AMI avec un nouvel ID. L'ancienne existe encore (AWS la garde pour ne pas casser les déploiements), mais elle ne reçoit plus de patches. - Quelqu'un doit aller chercher manuellement le nouvel ID
- Modifier le code
- Faire une PR, la faire valider, la merger
- Et si personne n'y pense, ça reste vulnérable pendant des mois
Version 2 — avec un bloc data : - Un changement MAJEUR (5 → 6) peut casser le code existant
- Un changement MINEUR (5.99 → 5.100) ajoute des fonctionnalités sans casser
- Un PATCH (5.100.0 → 5.100.1) corrige juste des bugs
Le ~> est un opérateur spécial qui dit : "accepte les mises à jour compatibles, mais bloque les majeures". - Console AWS → Billing → Budgets → Create budget
- Template "Zero spend budget" (alerte dès 0.01$)
- Email sur mon adresse perso
À partir de maintenant, si ma facture commence à grimper pour n'importe quelle raison, je reçois un mail. Ça me laisse le temps d'intervenir avant que ça devienne sérieux. - Installer Terraform et AWS CLI sur Windows via Git Bash
- Configurer un utilisateur IAM dédié (jamais utiliser le compte root)
- Écrire un premier fichier main.tf avec provider, data source et resource
- Comprendre terraform init, plan, apply, destroy
- Utiliser data "aws_ami" pour ne pas hardcoder des IDs qui vont vieillir
- Gérer ma première erreur Terraform (le Free Tier qui évolue)
- Utiliser aws ec2 describe-instance-types pour trouver l'info directement via l'API