Provider AWS
Le provider AWS est le plus utilisé dans l'écosystème Terraform. Il expose plus de 1000 types de ressources. Ce chapitre couvre les ressources AWS incontournables pour un déploiement web classique : réseau, compute, stockage, IAM.
Authentification
# Variables d'environnement (recommandé en CI)
export AWS_ACCESS_KEY_ID="..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_DEFAULT_REGION="eu-west-1"
# Profil AWS CLI (recommandé en local)
# ~/.aws/credentials et ~/.aws/config configurés
provider "aws" {
profile = "mon-profil"
region = "eu-west-1"
}VPC et réseau
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = { Name = "${local.prefix}-vpc" }
}
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
tags = { Name = "${local.prefix}-igw" }
}
resource "aws_subnet" "public" {
count = 3
vpc_id = aws_vpc.main.id
cidr_block = cidrsubnet("10.0.0.0/16", 8, count.index)
availability_zone = data.aws_availability_zones.available.names[count.index]
map_public_ip_on_launch = true
tags = { Name = "${local.prefix}-public-${count.index}" }
}
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.main.id
}
}
resource "aws_route_table_association" "public" {
count = length(aws_subnet.public)
subnet_id = aws_subnet.public[count.index].id
route_table_id = aws_route_table.public.id
}Security Groups
resource "aws_security_group" "web" {
name = "${local.prefix}-web-sg"
description = "Security group pour les serveurs web"
vpc_id = aws_vpc.main.id
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = var.allowed_ssh_cidrs
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}EC2
data "aws_ami" "debian13" {
most_recent = true
owners = ["136693071363"]
filter {
name = "name"
values = ["debian-13-amd64-*"]
}
}
resource "aws_instance" "web" {
ami = data.aws_ami.debian13.id
instance_type = var.instance_type
subnet_id = aws_subnet.public[0].id
vpc_security_group_ids = [aws_security_group.web.id]
key_name = var.key_pair_name
root_block_device {
volume_type = "gp3"
volume_size = 20
delete_on_termination = true
encrypted = true
}
user_data = base64encode(templatefile("${path.module}/templates/userdata.sh.tpl", {
hostname = "web-01"
}))
}IAM
resource "aws_iam_role" "ec2_role" {
name = "${local.prefix}-ec2-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = { Service = "ec2.amazonaws.com" }
}]
})
}
resource "aws_iam_role_policy_attachment" "ssm" {
role = aws_iam_role.ec2_role.name
policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
resource "aws_iam_instance_profile" "ec2" {
name = "${local.prefix}-ec2-profile"
role = aws_iam_role.ec2_role.name
}