Terraform

Infrastructure as Code - provisionner des ressources cloud sur AWS, Azure, GCP avec gestion d'etat

TL;DR

Quoi : Un outil d’infrastructure as code pour provisionner des ressources cloud.

Pourquoi : Syntaxe déclarative, multi-cloud, gestion d’état, infrastructure reproductible.

Quick Start

Installer :

brew install terraform  # macOS
# or download from terraform.io

Create main.tf :

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "example-instance"
  }
}

Exécuter :

terraform init
terraform plan
terraform apply

Cheatsheet

CommandeDescription
terraform initInitialiser le répertoire de travail
terraform planPrévisualiser les changements
terraform applyAppliquer les changements
terraform destroyDétruire l’infrastructure
terraform fmtFormater le code
terraform validateValider la configuration
terraform outputAfficher les outputs
terraform state listLister les ressources dans l’état

Gotchas

Variables

# variables.tf
variable "instance_type" {
  description = "EC2 instance type"
  type        = string
  default     = "t2.micro"
}

# main.tf
resource "aws_instance" "example" {
  instance_type = var.instance_type
}

# terraform.tfvars
instance_type = "t3.small"

Outputs

output "instance_ip" {
  value       = aws_instance.example.public_ip
  description = "Public IP of the instance"
}

Data sources

data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }
  owners = ["099720109477"]
}

resource "aws_instance" "example" {
  ami = data.aws_ami.ubuntu.id
}

Modules

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.0.0"

  name = "my-vpc"
  cidr = "10.0.0.0/16"
}

Next Steps