💻 Développement

dev-infrastructure-as-code

Création d'infrastructure as code avec Terraform, Bicep ou Pulumi.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- dev-infrastructure-as-code --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } dev-infrastructure-as-code -Launch"

🚀 Déjà installé ?

claude "/dev-infrastructure-as-code"

Ou tapez /dev-infrastructure-as-code dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

TerraformIaCinfrastructure as codeBicepPulumiARM templateprovisioningcloud infrastructure

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/dev-infrastructure-as-code ~/.claude/skills/

Payload du plugin : skills/dev-infrastructure-as-code · source éditable : dev-skills/infrastructure-as-code

📖 Manuel

Infrastructure as Code

Critères de choix d'outil

CritèreTerraformBicepPulumi
Multi-cloud❌ Azure only
LangageHCL (DSL)Bicep DSLTS / Python / Go / .NET
Maturité étatÉlevéeÉlevée (Azure)Moyenne
Courbe apprentissageFaibleTrès faible (Azure)Nécessite dev skills
Meilleur pourTout cloud, équipes mixtesAzure full-native, Azure DevsTeams avec devs, logique complexe

Règle : si Azure only → Bicep. Si multi-cloud ou équipes mixtes → Terraform. Si la logique dépasse les templates → Pulumi.


Workflow en étapes

1. Analyse du contexte

2. Structure du projet

Terraform (recommandé)

infra/
├── modules/           # modules réutilisables (vnet, aks, sql…)
│   └── vnet/
│       ├── main.tf
│       ├── variables.tf
│       └── outputs.tf
├── environments/
│   ├── dev/
│   │   ├── main.tf
│   │   ├── terraform.tfvars
│   │   └── backend.tf
│   └── prod/
│       ├── main.tf
│       └── terraform.tfvars
└── .terraform-version  # ex: 1.9.0

Bicep

infra/
├── modules/
│   └── storage.bicep
├── main.bicep
└── parameters/
    ├── dev.bicepparam
    └── prod.bicepparam

3. Backend de state (Terraform)

# backend.tf — à créer AVANT terraform init
terraform {
  backend "azurerm" {
    resource_group_name  = "rg-tfstate-prod"
    storage_account_name = "sttfstateprod001"
    container_name       = "tfstate"
    key                  = "myapp/prod.terraform.tfstate"
  }
}

Commandes de bootstrap du backend :

az group create -n rg-tfstate-prod -l westeurope
az storage account create -n sttfstateprod001 -g rg-tfstate-prod --sku Standard_LRS
az storage container create -n tfstate --account-name sttfstateprod001

4. Variables et secrets

# variables.tf
variable "db_password" {
  description = "Mot de passe de la base de données"
  type        = string
  sensitive   = true  # masqué dans les logs
}

# Référence Key Vault (Azure)
data "azurerm_key_vault_secret" "db_password" {
  name         = "db-password"
  key_vault_id = azurerm_key_vault.kv.id
}

Passer les secrets sans les coder en dur :

# Via variable d'environnement (CI/CD)
export TF_VAR_db_password="$(az keyvault secret show --name db-password --vault-name mykv --query value -o tsv)"
terraform apply

5. Cycle plan / apply

# Initialiser
terraform init

# Valider la syntaxe
terraform validate

# Voir les changements avant apply
terraform plan -var-file=environments/prod/terraform.tfvars -out=tfplan

# Appliquer (toujours à partir du plan généré)
terraform apply tfplan

# Vérifier le drift (détection manuelle)
terraform plan -detailed-exitcode   # exit 2 = drift détecté

Bicep :

az deployment group what-if \
  --resource-group rg-myapp-prod \
  --template-file main.bicep \
  --parameters parameters/prod.bicepparam

az deployment group create \
  --resource-group rg-myapp-prod \
  --template-file main.bicep \
  --parameters parameters/prod.bicepparam

6. Import de ressources existantes

# Terraform : importer une ressource créée manuellement
terraform import azurerm_resource_group.main /subscriptions/<sub>/resourceGroups/rg-existing

# Générer la config depuis une ressource existante (Terraform 1.5+)
terraform plan -generate-config-out=generated.tf

7. CI/CD (GitHub Actions, Azure DevOps)

# .github/workflows/terraform.yml (extrait)
jobs:
  plan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: "1.9.0"
      - run: terraform init
      - run: terraform plan -out=tfplan
      - uses: actions/upload-artifact@v4
        with:
          name: tfplan
          path: tfplan

  apply:
    needs: plan
    environment: production   # gate d'approbation manuelle
    steps:
      - uses: actions/download-artifact@v4
        with: { name: tfplan }
      - run: terraform apply tfplan

Bonnes pratiques 2026


Anti-patterns et pièges

PiègeConséquenceRemède
terraform apply sans plan préalableSurprises en prodToujours -out=tfplan + apply depuis le plan
Secrets dans .tfvars commitésFuite de credentialssensitive = true + .gitignore sur *.tfvars
State en localPas de collaboration, perteBackend remote dès le début
Trop de ressources dans un seul stateplan lent, blast radius élevéDécouper par domaine (réseau / app / data)
count pour les environnementsterraform state difficile à lirefor_each sur une map + workspaces séparés
Hardcoder la régionPas réutilisableVariable location systématique
Ignorer les lifecycleRecreations non voulueslifecycle { prevent_destroy = true } sur les bases de données
Bicep sans what-ifChangements destructifs silencieuxToujours what-if avant deployment