Terraform est devenu incontournable pour les Data Engineers qui provisionnent des ressources cloud. En entretien, on evalue la capacite a ecrire des modules reutilisables et a gerer le state en equipe.
Quelle est la difference entre terraform plan et terraform apply ? Et entre un resource et un data source ?
# Structure d un projet Terraform data
.
├── main.tf # ressources principales
├── variables.tf # inputs
├── outputs.tf # outputs
├── versions.tf # versions des providers
└── modules/
├── bigquery/
│ ├── main.tf
│ └── variables.tf
└── gcs/
└── main.tf
# versions.tf
terraform {
required_version = '>= 1.5'
required_providers {
google = {
source = 'hashicorp/google'
version = '~> 5.0'
}
}
}Comment creez-vous un module Terraform reutilisable pour un dataset BigQuery ?
# modules/bigquery/main.tf
resource 'google_bigquery_dataset' 'this' {
dataset_id = var.dataset_id
project = var.project_id
location = var.location
description = var.description
labels = var.labels
dynamic 'access' {
for_each = var.access_roles
content {
role = access.value.role
user_by_email = access.value.email
}
}
delete_contents_on_destroy = var.delete_on_destroy
}
# Appel du module
module 'dataset_analytics' {
source = './modules/bigquery'
dataset_id = 'analytics_prod'
project_id = var.project_id
location = 'EU'
access_roles = [
{ role = 'READER', email = 'analysts@company.com' }
]
}Pourquoi ne faut-il jamais stocker le state Terraform localement en equipe ? Comment le gerez-vous ?
# backend.tf - remote state dans GCS
terraform {
backend 'gcs' {
bucket = 'mon-projet-tfstate'
prefix = 'terraform/data-platform'
}
}
# Locking automatique via Cloud Storage
# Empêche deux apply simultanes
# Workspaces : environnements separes
terraform workspace new staging
terraform workspace select productionComment integrez-vous Terraform dans un pipeline CI/CD ?
# .github/workflows/terraform.yml
name: Terraform
on:
pull_request:
paths: ['infra/**']
push:
branches: [main]
jobs:
terraform:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- name: Terraform Init
run: terraform init
working-directory: infra/
- name: Terraform Plan
run: terraform plan -out=tfplan
- name: Terraform Apply # uniquement sur main
if: github.ref == 'refs/heads/main'
run: terraform apply tfplanComment gerez-vous l infrastructure existante qui n a pas ete creee avec Terraform ?
# terraform import : prendre le controle d une ressource existante
terraform import google_bigquery_dataset.analytics \
projects/mon-projet/datasets/analytics
# Terraform 1.5+ : import block dans le code
import {
to = google_bigquery_dataset.analytics
id = 'projects/mon-projet/datasets/analytics'
}
# terraform plan -generate-config-out=generated.tf
# Genere automatiquement le code Terraform pour les ressources importees| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Junior | Syntaxe HCL, plan/apply, ressources basiques | Cree un bucket GCS et un dataset BigQuery, sait faire un plan | Ne sait pas ce qu est le state Terraform |
| Confirme | Modules, remote backend, variables et outputs | A cree un module reutilisable, configure un remote backend GCS/S3 | Stocke le state en local, ne sait pas creer un module |
| Senior | CI/CD, import, workspaces, gestion des secrets | A integre Terraform dans GitHub Actions, a fait un terraform import | Ne sait pas ce qu est le state locking |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.