commit 3b27b0157caaf42dd0ef124a63fa76ad65d2db32 Author: Johan LEROY Date: Mon Mar 30 13:14:41 2026 +0200 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0411e86 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +# Terraform +.terraform/ +*.tfstate +*.tfstate.backup +*.tfvars + +# IDE +.idea/ diff --git a/.terraform.lock.hcl b/.terraform.lock.hcl new file mode 100644 index 0000000..39a6fbd --- /dev/null +++ b/.terraform.lock.hcl @@ -0,0 +1,25 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/aws" { + version = "5.100.0" + constraints = "~> 5.0" + hashes = [ + "h1:edXOJWE4ORX8Fm+dpVpICzMZJat4AX0VRCAy/xkcOc0=", + "zh:054b8dd49f0549c9a7cc27d159e45327b7b65cf404da5e5a20da154b90b8a644", + "zh:0b97bf8d5e03d15d83cc40b0530a1f84b459354939ba6f135a0086c20ebbe6b2", + "zh:1589a2266af699cbd5d80737a0fe02e54ec9cf2ca54e7e00ac51c7359056f274", + "zh:6330766f1d85f01ae6ea90d1b214b8b74cc8c1badc4696b165b36ddd4cc15f7b", + "zh:7c8c2e30d8e55291b86fcb64bdf6c25489d538688545eb48fd74ad622e5d3862", + "zh:99b1003bd9bd32ee323544da897148f46a527f622dc3971af63ea3e251596342", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:9f8b909d3ec50ade83c8062290378b1ec553edef6a447c56dadc01a99f4eaa93", + "zh:aaef921ff9aabaf8b1869a86d692ebd24fbd4e12c21205034bb679b9caf883a2", + "zh:ac882313207aba00dd5a76dbd572a0ddc818bb9cbf5c9d61b28fe30efaec951e", + "zh:bb64e8aff37becab373a1a0cc1080990785304141af42ed6aa3dd4913b000421", + "zh:dfe495f6621df5540d9c92ad40b8067376350b005c637ea6efac5dc15028add4", + "zh:f0ddf0eaf052766cfe09dea8200a946519f653c384ab4336e2a4a64fdd6310e9", + "zh:f1b7e684f4c7ae1eed272b6de7d2049bb87a0275cb04dbb7cda6636f600699c9", + "zh:ff461571e3f233699bf690db319dfe46aec75e58726636a0d97dd9ac6e32fb70", + ] +} diff --git a/atelier01.pdf b/atelier01.pdf new file mode 100644 index 0000000..77f215b Binary files /dev/null and b/atelier01.pdf differ diff --git a/main.tf b/main.tf new file mode 100644 index 0000000..7959f9f --- /dev/null +++ b/main.tf @@ -0,0 +1,77 @@ +terraform { + required_version = ">= 1.0" + + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.0" + } + } +} + +provider "aws" { + region = var.aws_region + + default_tags { + tags = { + Owner = var.owner + CourseId = var.course_id + } + } +} + +# --- VPC --- +resource "aws_vpc" "main" { + cidr_block = var.vpc_cidr + enable_dns_support = true + enable_dns_hostnames = true + + tags = { + Name = "${var.trigramme}-vpc" + } +} + +# --- Sous-reseaux --- +resource "aws_subnet" "subnets" { + count = length(var.subnet_cidrs) + + vpc_id = aws_vpc.main.id + cidr_block = var.subnet_cidrs[count.index] + availability_zone = var.availability_zones[count.index] + + tags = { + Name = "${var.trigramme}-subnet-${count.index + 1}" + } +} + +# --- AMI Amazon Linux 2023 (derniere version) --- +data "aws_ami" "amazon_linux" { + most_recent = true + owners = ["amazon"] + + filter { + name = "name" + values = ["al2023-ami-*-x86_64"] + } + + filter { + name = "virtualization-type" + values = ["hvm"] + } +} + +# --- Instance EC2 --- +resource "aws_instance" "server" { + ami = data.aws_ami.amazon_linux.id + instance_type = var.instance_type + subnet_id = aws_subnet.subnets[0].id + + root_block_device { + volume_size = var.root_volume_size + volume_type = "gp3" + } + + tags = { + Name = "${var.trigramme}-instance" + } +} diff --git a/outputs.tf b/outputs.tf new file mode 100644 index 0000000..d508d73 --- /dev/null +++ b/outputs.tf @@ -0,0 +1,19 @@ +output "vpc_id" { + description = "ID du VPC" + value = aws_vpc.main.id +} + +output "subnet_ids" { + description = "IDs des sous-reseaux" + value = aws_subnet.subnets[*].id +} + +output "instance_id" { + description = "ID de l'instance EC2" + value = aws_instance.server.id +} + +output "instance_private_ip" { + description = "IP privee de l'instance EC2" + value = aws_instance.server.private_ip +} diff --git a/variables.tf b/variables.tf new file mode 100644 index 0000000..6363f0d --- /dev/null +++ b/variables.tf @@ -0,0 +1,98 @@ +variable "aws_region" { + description = "Region AWS de deploiement" + type = string + default = "eu-west-3" + + validation { + condition = can(regex("^eu-west-3$", var.aws_region)) + error_message = "La region doit etre eu-west-3." + } +} + +variable "owner" { + description = "Identifiant du proprietaire des ressources (tag Owner)" + type = string + default = "johan.leroy2023" + + validation { + condition = length(var.owner) > 0 + error_message = "Le owner ne peut pas etre vide." + } +} + +variable "course_id" { + description = "Identifiant du cours (tag CourseId)" + type = string + default = "cours-tf-aws-s14" + + validation { + condition = length(var.course_id) > 0 + error_message = "Le CourseId ne peut pas etre vide." + } +} + +variable "trigramme" { + description = "Trigramme pour prefixer les ressources" + type = string + default = "jle" + + validation { + condition = can(regex("^[a-z]{3}$", var.trigramme)) + error_message = "Le trigramme doit etre compose de 3 lettres minuscules." + } +} + +variable "vpc_cidr" { + description = "CIDR du VPC" + type = string + default = "10.0.0.0/16" + + validation { + condition = can(cidrhost(var.vpc_cidr, 0)) + error_message = "Le CIDR du VPC doit etre un bloc CIDR valide." + } +} + +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 "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 "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 "root_volume_size" { + description = "Taille du disque racine en Go (max 30)" + type = number + default = 30 + + validation { + condition = var.root_volume_size > 0 && var.root_volume_size <= 30 + error_message = "La taille du disque doit etre entre 1 et 30 Go." + } +}