Aller au contenu principal

Providers Terraform


Objectifs du chapitre

  • Comprendre le rôle des providers
  • Configurer les providers principaux
  • Gérer plusieurs providers
  • Utiliser les alias de providers

1 - Qu'est-ce qu'un provider ?

Définition

Un provider est un plugin qui permet à Terraform de communiquer avec une API externe.

Types de providers

TypeExemplesUsage
Cloudaws, azurerm, googleInfrastructure cloud
Infrastructurekubernetes, helm, dockerOrchestration
SaaSgithub, gitlab, datadogServices tiers
Utilityrandom, local, nullHelpers

2 - Registry Terraform

Sources de providers

Format de source

terraform {
required_providers {
# Format: namespace/name
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}

# Provider partenaire
datadog = {
source = "DataDog/datadog"
version = "~> 3.0"
}

# Provider communautaire
github = {
source = "integrations/github"
version = "~> 5.0"
}
}
}

3 - Configuration du provider AWS

Configuration de base

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

provider "aws" {
region = "eu-west-1"
}

Méthodes d'authentification

Configuration avancée

provider "aws" {
region = "eu-west-1"

# Profil AWS CLI
profile = "production"

# Assume role
assume_role {
role_arn = "arn:aws:iam::123456789012:role/TerraformRole"
session_name = "terraform"
}

# Tags par défaut
default_tags {
tags = {
Environment = "Production"
ManagedBy = "Terraform"
}
}

# Ignorer certains tags
ignore_tags {
keys = ["LastModified", "CreatedBy"]
}
}

4 - Configuration du provider Azure

Configuration de base

terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
}
}

provider "azurerm" {
features {}
}

Authentification

# Via Service Principal
provider "azurerm" {
features {}

subscription_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
client_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
client_secret = var.client_secret
tenant_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

# Ou via variables d'environnement
# ARM_SUBSCRIPTION_ID
# ARM_CLIENT_ID
# ARM_CLIENT_SECRET
# ARM_TENANT_ID

Features block

provider "azurerm" {
features {
resource_group {
prevent_deletion_if_contains_resources = false
}

virtual_machine {
delete_os_disk_on_deletion = true
graceful_shutdown = true
skip_shutdown_and_force_delete = false
}

key_vault {
purge_soft_delete_on_destroy = true
}
}
}

5 - Configuration du provider GCP

Configuration de base

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

provider "google" {
project = "my-project-id"
region = "europe-west1"
}

Authentification

# Via fichier de credentials
provider "google" {
credentials = file("service-account-key.json")
project = "my-project-id"
region = "europe-west1"
}

# Ou via variable d'environnement
# GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json

6 - Providers multiples et alias

Plusieurs régions

# Provider par défaut
provider "aws" {
region = "eu-west-1"
}

# Provider avec alias pour une autre région
provider "aws" {
alias = "us_east"
region = "us-east-1"
}

# Utilisation
resource "aws_instance" "eu_server" {
# Utilise le provider par défaut
ami = "ami-12345678"
instance_type = "t2.micro"
}

resource "aws_instance" "us_server" {
# Utilise le provider avec alias
provider = aws.us_east
ami = "ami-87654321"
instance_type = "t2.micro"
}

Multi-cloud

# AWS
provider "aws" {
region = "eu-west-1"
}

# Azure
provider "azurerm" {
features {}
}

# GCP
provider "google" {
project = "my-project"
region = "europe-west1"
}

# Ressources dans chaque cloud
resource "aws_instance" "web" {
ami = "ami-12345678"
instance_type = "t2.micro"
}

resource "azurerm_linux_virtual_machine" "web" {
# ...
}

resource "google_compute_instance" "web" {
# ...
}

Plusieurs comptes

provider "aws" {
alias = "production"
profile = "prod"
region = "eu-west-1"
}

provider "aws" {
alias = "development"
profile = "dev"
region = "eu-west-1"
}

# Prod resources
resource "aws_instance" "prod_server" {
provider = aws.production
# ...
}

# Dev resources
resource "aws_instance" "dev_server" {
provider = aws.development
# ...
}

7 - Providers utilitaires

Random

provider "random" {}

resource "random_id" "bucket_suffix" {
byte_length = 4
}

resource "random_password" "db" {
length = 16
special = true
}

resource "random_pet" "server" {
length = 2
}

# Utilisation
resource "aws_s3_bucket" "example" {
bucket = "my-bucket-${random_id.bucket_suffix.hex}"
}

Local

provider "local" {}

# Créer un fichier local
resource "local_file" "config" {
filename = "${path.module}/config.json"
content = jsonencode({
server = aws_instance.web.public_ip
port = 8080
})
}

Null

provider "null" {}

# Provisioner sans ressource réelle
resource "null_resource" "setup" {
triggers = {
instance_id = aws_instance.web.id
}

provisioner "local-exec" {
command = "echo 'Instance ${aws_instance.web.id} created'"
}
}

8 - Providers Kubernetes et Docker

Kubernetes

terraform {
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.0"
}
}
}

provider "kubernetes" {
config_path = "~/.kube/config"
}

resource "kubernetes_namespace" "example" {
metadata {
name = "my-namespace"
}
}

resource "kubernetes_deployment" "nginx" {
metadata {
name = "nginx"
namespace = kubernetes_namespace.example.metadata[0].name
}

spec {
replicas = 3

selector {
match_labels = {
app = "nginx"
}
}

template {
metadata {
labels = {
app = "nginx"
}
}

spec {
container {
image = "nginx:latest"
name = "nginx"

port {
container_port = 80
}
}
}
}
}
}

Docker

terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}

provider "docker" {
host = "unix:///var/run/docker.sock"
}

resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}

resource "docker_container" "nginx" {
image = docker_image.nginx.image_id
name = "nginx-server"

ports {
internal = 80
external = 8080
}
}

9 - Verrouillage des versions

Lock file

# .terraform.lock.hcl (généré automatiquement)
provider "registry.terraform.io/hashicorp/aws" {
version = "5.31.0"
constraints = "~> 5.0"
hashes = [
"h1:abcdef...",
"zh:123456...",
]
}

Commandes

# Mettre à jour le lock file
terraform init -upgrade

# Vérifier les providers
terraform providers

# Afficher les versions
terraform version

10 - Bonnes pratiques

Versions

# ✅ Toujours spécifier les versions
terraform {
required_version = ">= 1.5.0"

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

# ❌ Éviter
provider "aws" {}

Sécurité

# ✅ Ne jamais hardcoder les credentials
provider "aws" {
region = "eu-west-1"
# Utilise les env vars ou profil par défaut
}

# ❌ Éviter
provider "aws" {
access_key = "AKIAIOSFODNN7EXAMPLE"
secret_key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
}

Résumé

Points clés
  • Les providers sont des plugins pour communiquer avec les APIs
  • Utilisez toujours des versions fixées
  • Ne hardcodez jamais les credentials
  • Utilisez les alias pour multi-région/compte
  • Le fichier .terraform.lock.hcl verrouille les versions

Exercices pratiques

  1. Configurez le provider AWS avec un profil
  2. Créez deux providers AWS pour deux régions
  3. Utilisez le provider random pour générer des noms
  4. Configurez un provider Kubernetes

← Syntaxe HCL | Ressources →