deploy done atelier 2
This commit is contained in:
38
README.md
38
README.md
@@ -1,17 +1,20 @@
|
|||||||
# ENI Terraform - Atelier 01
|
# ENI Terraform - Atelier 02
|
||||||
|
|
||||||
## Description
|
## 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
|
### Ressources creees
|
||||||
|
|
||||||
| Ressource | Type | Details |
|
| Ressource | Type | Details |
|
||||||
|-----------|------|---------|
|
|-----------|------|---------|
|
||||||
| VPC | `aws_vpc` | CIDR `10.0.0.0/16` |
|
| 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 1 | `aws_subnet` | CIDR `10.0.1.0/24` - AZ dynamique |
|
||||||
| Sous-reseau 2 | `aws_subnet` | CIDR `10.0.2.0/24` - AZ `eu-west-3b` |
|
| Sous-reseau 2 | `aws_subnet` | CIDR `10.0.2.0/24` - AZ dynamique |
|
||||||
| Instance EC2 | `aws_instance` | Type `t3.micro`, disque 30 Go (gp3) |
|
| 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
|
### Tags appliques
|
||||||
|
|
||||||
@@ -94,7 +97,7 @@ terraform show
|
|||||||
terraform state list
|
terraform state list
|
||||||
|
|
||||||
# Detail d'une ressource specifique
|
# 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.)
|
# Affiche les outputs (vpc_id, subnet_ids, etc.)
|
||||||
terraform output
|
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
|
├── 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
|
├── .gitignore # Fichiers exclus du depot
|
||||||
├── .terraform.lock.hcl # Verrouillage des versions de providers
|
├── .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
|
└── README.md # Ce fichier
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -138,9 +142,10 @@ terraform plan -var-file="custom.tfvars"
|
|||||||
| Nom | Description |
|
| Nom | Description |
|
||||||
|-----|-------------|
|
|-----|-------------|
|
||||||
| `vpc_id` | ID du VPC |
|
| `vpc_id` | ID du VPC |
|
||||||
| `subnet_ids` | IDs des 2 sous-reseaux |
|
| `subnet_ids` | Map des IDs des sous-reseaux |
|
||||||
| `instance_id` | ID de l'instance EC2 |
|
| `instance_ids` | Map des IDs des instances EC2 |
|
||||||
| `instance_private_ip` | IP privee de l'instance EC2 |
|
| `instance_private_ips` | Map des IPs privees des instances EC2 |
|
||||||
|
| `ebs_volume_ids` | Map des IDs des volumes EBS additionnels |
|
||||||
|
|
||||||
## Variables
|
## Variables
|
||||||
|
|
||||||
@@ -151,8 +156,7 @@ terraform plan -var-file="custom.tfvars"
|
|||||||
| `course_id` | `cours-tf-aws-s14` | Tag CourseId |
|
| `course_id` | `cours-tf-aws-s14` | Tag CourseId |
|
||||||
| `trigramme` | `jle` | Prefixe des ressources |
|
| `trigramme` | `jle` | Prefixe des ressources |
|
||||||
| `vpc_cidr` | `10.0.0.0/16` | CIDR du VPC |
|
| `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 |
|
| `subnets` | `map(object)` | Sous-reseaux avec name et cidr |
|
||||||
| `availability_zones` | `["eu-west-3a", "eu-west-3b"]` | Zones de disponibilite |
|
| `instances` | `map(object)` | Instances avec ami, type et subnet_key |
|
||||||
| `ami_id` | `ami-03638fc4f87bac487` | AMI de l'instance |
|
| `root_volume_size` | `30` | Taille du disque racine (Go) |
|
||||||
| `instance_type` | `t3.micro` | Type d'instance |
|
| `ebs_volume_size` | `10` | Taille du volume EBS additionnel (Go) |
|
||||||
| `root_volume_size` | `30` | Taille du disque (Go) |
|
|
||||||
|
|||||||
BIN
atelier02.pdf
Normal file
BIN
atelier02.pdf
Normal file
Binary file not shown.
48
main.tf
48
main.tf
@@ -21,6 +21,11 @@ provider "aws" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# --- Zones de disponibilite ---
|
||||||
|
data "aws_availability_zones" "available" {
|
||||||
|
state = "available"
|
||||||
|
}
|
||||||
|
|
||||||
# --- VPC ---
|
# --- VPC ---
|
||||||
resource "aws_vpc" "main" {
|
resource "aws_vpc" "main" {
|
||||||
cidr_block = var.vpc_cidr
|
cidr_block = var.vpc_cidr
|
||||||
@@ -34,24 +39,24 @@ resource "aws_vpc" "main" {
|
|||||||
|
|
||||||
# --- Sous-reseaux ---
|
# --- Sous-reseaux ---
|
||||||
resource "aws_subnet" "subnets" {
|
resource "aws_subnet" "subnets" {
|
||||||
count = length(var.subnet_cidrs)
|
for_each = var.subnets
|
||||||
|
|
||||||
vpc_id = aws_vpc.main.id
|
vpc_id = aws_vpc.main.id
|
||||||
cidr_block = var.subnet_cidrs[count.index]
|
cidr_block = each.value.cidr
|
||||||
availability_zone = var.availability_zones[count.index]
|
availability_zone = data.aws_availability_zones.available.names[index(keys(var.subnets), each.key)]
|
||||||
|
|
||||||
tags = {
|
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 ---
|
ami = each.value.ami
|
||||||
resource "aws_instance" "server" {
|
instance_type = each.value.instance_type
|
||||||
ami = var.ami_id
|
subnet_id = aws_subnet.subnets[each.value.subnet_key].id
|
||||||
instance_type = var.instance_type
|
|
||||||
subnet_id = aws_subnet.subnets[0].id
|
|
||||||
|
|
||||||
root_block_device {
|
root_block_device {
|
||||||
volume_size = var.root_volume_size
|
volume_size = var.root_volume_size
|
||||||
@@ -59,6 +64,27 @@ resource "aws_instance" "server" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tags = {
|
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
|
||||||
|
}
|
||||||
|
|||||||
19
outputs.tf
19
outputs.tf
@@ -5,15 +5,20 @@ output "vpc_id" {
|
|||||||
|
|
||||||
output "subnet_ids" {
|
output "subnet_ids" {
|
||||||
description = "IDs des sous-reseaux"
|
description = "IDs des sous-reseaux"
|
||||||
value = aws_subnet.subnets[*].id
|
value = { for k, s in aws_subnet.subnets : k => s.id }
|
||||||
}
|
}
|
||||||
|
|
||||||
output "instance_id" {
|
output "instance_ids" {
|
||||||
description = "ID de l'instance EC2"
|
description = "IDs des instances EC2"
|
||||||
value = aws_instance.server.id
|
value = { for k, i in aws_instance.servers : k => i.id }
|
||||||
}
|
}
|
||||||
|
|
||||||
output "instance_private_ip" {
|
output "instance_private_ips" {
|
||||||
description = "IP privee de l'instance EC2"
|
description = "IPs privees des instances EC2"
|
||||||
value = aws_instance.server.private_ip
|
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 }
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
plan2.tfplan
Normal file
BIN
plan2.tfplan
Normal file
Binary file not shown.
70
variables.tf
70
variables.tf
@@ -59,42 +59,42 @@ variable "vpc_cidr" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "subnet_cidrs" {
|
variable "subnets" {
|
||||||
description = "Liste des CIDR pour les sous-reseaux (un par AZ)"
|
description = "Map des sous-reseaux avec name et cidr"
|
||||||
type = list(string)
|
type = map(object({
|
||||||
default = ["10.0.1.0/24", "10.0.2.0/24"]
|
name = string
|
||||||
|
cidr = string
|
||||||
validation {
|
}))
|
||||||
condition = length(var.subnet_cidrs) == 2
|
default = {
|
||||||
error_message = "Il faut exactement 2 sous-reseaux."
|
subnet1 = {
|
||||||
|
name = "subnet-1"
|
||||||
|
cidr = "10.0.1.0/24"
|
||||||
|
}
|
||||||
|
subnet2 = {
|
||||||
|
name = "subnet-2"
|
||||||
|
cidr = "10.0.2.0/24"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "availability_zones" {
|
variable "instances" {
|
||||||
description = "Liste des zones de disponibilite"
|
description = "Map des instances EC2 avec ami, type et subnet"
|
||||||
type = list(string)
|
type = map(object({
|
||||||
default = ["eu-west-3a", "eu-west-3b"]
|
ami = string
|
||||||
|
instance_type = string
|
||||||
validation {
|
subnet_key = string
|
||||||
condition = length(var.availability_zones) == 2
|
}))
|
||||||
error_message = "Il faut exactement 2 zones de disponibilite."
|
default = {
|
||||||
|
ubuntu = {
|
||||||
|
ami = "ami-03638fc4f87bac487"
|
||||||
|
instance_type = "t3.micro"
|
||||||
|
subnet_key = "subnet1"
|
||||||
|
}
|
||||||
|
amazon_linux = {
|
||||||
|
ami = "ami-063039a3666cc5ce3"
|
||||||
|
instance_type = "t3.micro"
|
||||||
|
subnet_key = "subnet2"
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
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."
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,3 +108,9 @@ variable "root_volume_size" {
|
|||||||
error_message = "La taille du disque doit etre entre 1 et 30 Go."
|
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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user