diff --git a/README.md b/README.md index c8f3cd9..07a3d16 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,20 @@ -# ENI Terraform - Atelier 01 +# ENI Terraform - Atelier 02 ## Description -Projet Terraform pour deployer une infrastructure AWS basique dans le cadre du cours ENI. +Projet Terraform pour deployer une infrastructure AWS dans le cadre du cours ENI. ### Ressources creees | Ressource | Type | Details | |-----------|------|---------| | VPC | `aws_vpc` | CIDR `10.0.0.0/16` | -| Sous-reseau 1 | `aws_subnet` | CIDR `10.0.1.0/24` - AZ `eu-west-3a` | -| Sous-reseau 2 | `aws_subnet` | CIDR `10.0.2.0/24` - AZ `eu-west-3b` | -| Instance EC2 | `aws_instance` | Type `t3.micro`, disque 30 Go (gp3) | +| Sous-reseau 1 | `aws_subnet` | CIDR `10.0.1.0/24` - AZ dynamique | +| Sous-reseau 2 | `aws_subnet` | CIDR `10.0.2.0/24` - AZ dynamique | +| Instance Ubuntu | `aws_instance` | Type `t3.micro`, sur sous-reseau 1 | +| Instance Amazon Linux | `aws_instance` | Type `t3.micro`, sur sous-reseau 2 | +| Volume EBS Ubuntu | `aws_ebs_volume` | 10 Go gp3, attache a l'instance Ubuntu | +| Volume EBS Amazon Linux | `aws_ebs_volume` | 10 Go gp3, attache a l'instance Amazon Linux | ### Tags appliques @@ -94,7 +97,7 @@ terraform show terraform state list # Detail d'une ressource specifique -terraform state show aws_instance.server +terraform state show aws_instance.servers[\"ubuntu\"] # Affiche les outputs (vpc_id, subnet_ids, etc.) terraform output @@ -124,12 +127,13 @@ terraform plan -var-file="custom.tfvars" ``` . -├── main.tf # Ressources AWS (VPC, subnets, EC2) +├── main.tf # Ressources AWS (VPC, subnets, EC2, EBS) ├── variables.tf # Variables avec valeurs par defaut et validations -├── outputs.tf # Valeurs de sortie (IDs, IP) +├── outputs.tf # Valeurs de sortie (IDs, IPs) ├── .gitignore # Fichiers exclus du depot ├── .terraform.lock.hcl # Verrouillage des versions de providers -├── atelier01.pdf # Enonce de l'atelier +├── atelier01.pdf # Enonce de l'atelier 01 +├── atelier02.pdf # Enonce de l'atelier 02 └── README.md # Ce fichier ``` @@ -138,9 +142,10 @@ terraform plan -var-file="custom.tfvars" | Nom | Description | |-----|-------------| | `vpc_id` | ID du VPC | -| `subnet_ids` | IDs des 2 sous-reseaux | -| `instance_id` | ID de l'instance EC2 | -| `instance_private_ip` | IP privee de l'instance EC2 | +| `subnet_ids` | Map des IDs des sous-reseaux | +| `instance_ids` | Map des IDs des instances EC2 | +| `instance_private_ips` | Map des IPs privees des instances EC2 | +| `ebs_volume_ids` | Map des IDs des volumes EBS additionnels | ## Variables @@ -151,8 +156,7 @@ terraform plan -var-file="custom.tfvars" | `course_id` | `cours-tf-aws-s14` | Tag CourseId | | `trigramme` | `jle` | Prefixe des ressources | | `vpc_cidr` | `10.0.0.0/16` | CIDR du VPC | -| `subnet_cidrs` | `["10.0.1.0/24", "10.0.2.0/24"]` | CIDRs des sous-reseaux | -| `availability_zones` | `["eu-west-3a", "eu-west-3b"]` | Zones de disponibilite | -| `ami_id` | `ami-03638fc4f87bac487` | AMI de l'instance | -| `instance_type` | `t3.micro` | Type d'instance | -| `root_volume_size` | `30` | Taille du disque (Go) | +| `subnets` | `map(object)` | Sous-reseaux avec name et cidr | +| `instances` | `map(object)` | Instances avec ami, type et subnet_key | +| `root_volume_size` | `30` | Taille du disque racine (Go) | +| `ebs_volume_size` | `10` | Taille du volume EBS additionnel (Go) | diff --git a/atelier02.pdf b/atelier02.pdf new file mode 100644 index 0000000..5d27603 Binary files /dev/null and b/atelier02.pdf differ diff --git a/main.tf b/main.tf index ca6916f..4afed7c 100644 --- a/main.tf +++ b/main.tf @@ -21,6 +21,11 @@ provider "aws" { } } +# --- Zones de disponibilite --- +data "aws_availability_zones" "available" { + state = "available" +} + # --- VPC --- resource "aws_vpc" "main" { cidr_block = var.vpc_cidr @@ -34,24 +39,24 @@ resource "aws_vpc" "main" { # --- Sous-reseaux --- resource "aws_subnet" "subnets" { - count = length(var.subnet_cidrs) + for_each = var.subnets vpc_id = aws_vpc.main.id - cidr_block = var.subnet_cidrs[count.index] - availability_zone = var.availability_zones[count.index] + cidr_block = each.value.cidr + availability_zone = data.aws_availability_zones.available.names[index(keys(var.subnets), each.key)] tags = { - Name = "${var.trigramme}-subnet-${count.index + 1}" + Name = "${var.trigramme}-${each.value.name}" } } -# --- AMI --- +# --- Instances EC2 --- +resource "aws_instance" "servers" { + for_each = var.instances -# --- Instance EC2 --- -resource "aws_instance" "server" { - ami = var.ami_id - instance_type = var.instance_type - subnet_id = aws_subnet.subnets[0].id + ami = each.value.ami + instance_type = each.value.instance_type + subnet_id = aws_subnet.subnets[each.value.subnet_key].id root_block_device { volume_size = var.root_volume_size @@ -59,6 +64,27 @@ resource "aws_instance" "server" { } tags = { - Name = "${var.trigramme}-instance" + Name = "${var.trigramme}-${each.key}" } } + +# --- Volumes EBS additionnels --- +resource "aws_ebs_volume" "additional" { + for_each = var.instances + + availability_zone = aws_instance.servers[each.key].availability_zone + size = var.ebs_volume_size + type = "gp3" + + tags = { + Name = "${var.trigramme}-ebs-${each.key}" + } +} + +resource "aws_volume_attachment" "attach" { + for_each = var.instances + + device_name = "/dev/sdf" + volume_id = aws_ebs_volume.additional[each.key].id + instance_id = aws_instance.servers[each.key].id +} diff --git a/outputs.tf b/outputs.tf index d508d73..6659751 100644 --- a/outputs.tf +++ b/outputs.tf @@ -5,15 +5,20 @@ output "vpc_id" { output "subnet_ids" { description = "IDs des sous-reseaux" - value = aws_subnet.subnets[*].id + value = { for k, s in aws_subnet.subnets : k => s.id } } -output "instance_id" { - description = "ID de l'instance EC2" - value = aws_instance.server.id +output "instance_ids" { + description = "IDs des instances EC2" + value = { for k, i in aws_instance.servers : k => i.id } } -output "instance_private_ip" { - description = "IP privee de l'instance EC2" - value = aws_instance.server.private_ip +output "instance_private_ips" { + description = "IPs privees des instances EC2" + value = { for k, i in aws_instance.servers : k => i.private_ip } +} + +output "ebs_volume_ids" { + description = "IDs des volumes EBS additionnels" + value = { for k, v in aws_ebs_volume.additional : k => v.id } } diff --git a/plan2.tfplan b/plan2.tfplan new file mode 100644 index 0000000..e0f3110 Binary files /dev/null and b/plan2.tfplan differ diff --git a/variables.tf b/variables.tf index 71c7df0..161fba9 100644 --- a/variables.tf +++ b/variables.tf @@ -59,42 +59,42 @@ variable "vpc_cidr" { } } -variable "subnet_cidrs" { - description = "Liste des CIDR pour les sous-reseaux (un par AZ)" - type = list(string) - default = ["10.0.1.0/24", "10.0.2.0/24"] - - validation { - condition = length(var.subnet_cidrs) == 2 - error_message = "Il faut exactement 2 sous-reseaux." +variable "subnets" { + description = "Map des sous-reseaux avec name et cidr" + type = map(object({ + name = string + cidr = string + })) + default = { + subnet1 = { + name = "subnet-1" + cidr = "10.0.1.0/24" + } + subnet2 = { + name = "subnet-2" + cidr = "10.0.2.0/24" + } } } -variable "availability_zones" { - description = "Liste des zones de disponibilite" - type = list(string) - default = ["eu-west-3a", "eu-west-3b"] - - validation { - condition = length(var.availability_zones) == 2 - error_message = "Il faut exactement 2 zones de disponibilite." - } -} - -variable "ami_id" { - description = "ID de l'AMI pour l'instance EC2" - type = string - default = "ami-03638fc4f87bac487" -} - -variable "instance_type" { - description = "Type d'instance EC2" - type = string - default = "t3.micro" - - validation { - condition = var.instance_type == "t3.micro" - error_message = "Le type d'instance doit etre t3.micro." +variable "instances" { + description = "Map des instances EC2 avec ami, type et subnet" + type = map(object({ + ami = string + instance_type = string + subnet_key = string + })) + default = { + ubuntu = { + ami = "ami-03638fc4f87bac487" + instance_type = "t3.micro" + subnet_key = "subnet1" + } + amazon_linux = { + ami = "ami-063039a3666cc5ce3" + instance_type = "t3.micro" + subnet_key = "subnet2" + } } } @@ -108,3 +108,9 @@ variable "root_volume_size" { error_message = "La taille du disque doit etre entre 1 et 30 Go." } } + +variable "ebs_volume_size" { + description = "Taille du volume EBS additionnel en Go" + type = number + default = 10 +}