Aller au contenu

Infrastructure Terraform

Filter this guidePick generator option values to hide sections that don't apply.

Terraform est un outil logiciel open-source d’infrastructure as code qui vous permet de créer, modifier et améliorer votre infrastructure de manière sûre et prévisible.

Le générateur d’infrastructure Terraform crée un projet d’infrastructure Terraform. L’application générée inclut les meilleures pratiques de sécurité grâce aux vérifications de sécurité Checkov.

Vous pouvez générer un nouveau projet Terraform de deux manières :

Terminal window
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra
Vous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
Terminal window
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
ParamètreTypePar défautDescription
name Requisstring-Le nom du projet.
type application | libraryapplicationSi c'est une bibliothèque terraform (modules réutilisables) ou une application (déployable).
directory stringpackagesLe répertoire du nouveau projet.
subDirectory string-Le sous-répertoire dans lequel le projet est placé. Par défaut, il s'agit du nom du projet.
preferInstallDependencies booleantrueIndique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir sur false pour différer l'installation lors de l'exécution de plusieurs générateurs en lot (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin.

Le générateur crée différentes structures de fichiers en fonction du type de projet :

type = application

Pour les projets d’application (--type=application), le générateur crée une application Terraform complète avec gestion de l’état distant :

  • Répertoiresrc
    • main.tf Fichier de configuration Terraform principal
    • providers.tf Configuration du fournisseur avec backend S3
    • variables.tf Définitions des variables d’entrée
    • outputs.tf Définitions des valeurs de sortie
    • Répertoireenv Fichiers de variables spécifiques à l’environnement
      • dev.tfvars Variables d’environnement de développement
  • Répertoirebootstrap Configuration de bootstrap pour l’état distant
    • main.tf Bucket S3 et politiques pour le stockage de l’état
    • providers.tf Configuration du fournisseur AWS
    • variables.tf Définitions des variables de bootstrap
  • Répertoirescripts Helpers Node exécutés par les cibles nx bootstrap et init
    • aws-config.ts Résout le compte + la région via la chaîne de credentials AWS SDK
    • bootstrap.ts Récupère/pousse le tfstate de bootstrap et exécute terraform apply
    • init.ts Exécute terraform init avec la configuration du backend S3
  • project.json Configuration du projet et cibles de build
type = library

Pour les projets de bibliothèque (--type=library), le générateur crée une structure plus simple pour les modules Terraform réutilisables :

  • Répertoiresrc
    • main.tf Fichier de module Terraform principal
  • project.json Configuration du projet et cibles de build

Vous pouvez commencer à écrire votre infrastructure Terraform dans src/main.tf, par exemple :

src/main.tf
locals {
account_id = data.aws_caller_identity.current.account_id
aws_region = data.aws_region.current.id
}
resource "null_resource" "print_info" {
# triggers = {
# always_run = timestamp()
# }
provisioner "local-exec" {
command = "echo 'AWS Region: ${local.aws_region}, AWS Account: ${local.account_id}, Environment: ${var.environment}'"
}
}
# Declare your infrastructure here
resource "aws_s3_bucket" "my_bucket" {
bucket = "my-unique-bucket-name"
}

Si vous souhaitez exécuter un module à partir d’un projet séparé (lib), vous pouvez le faire comme suit :

module "lib_module" {
source = "../../path/to/my-lib/src"
}

Cela mettra automatiquement à jour le graphe Nx pour ajouter une dépendance entre votre application consommatrice et votre lib.

Configurez les variables spécifiques à l’environnement dans les fichiers src/env/*.tfvars.

Pour ajouter de nouveaux environnements, créez un nouveau fichier src/env/<environment>.tfvars avec les variables spécifiques à l’environnement et ajoutez de nouvelles entrées pour apply, destroy, init, plan dans le project.json pour la nouvelle configuration d’environnement. Par exemple, supposons que nous voulions ajouter un environnement prod :

# Production environment variables
environment = "prod"
region = "us-west-2"
type = application

Bootstrap de l’état distant (Projets d’application uniquement)

Section intitulée « Bootstrap de l’état distant (Projets d’application uniquement) »

Avant de déployer votre infrastructure, vous devrez initialiser le backend d’état distant. Cela crée un bucket S3 pour stocker vos fichiers d’état Terraform :

Terminal window
pnpm nx bootstrap tf-infra

Les cibles disponibles dépendent du type de votre projet :

Vous pouvez valider votre configuration Terraform en utilisant la cible validate :

Terminal window
pnpm nx validate tf-infra

Formatez votre code Terraform en utilisant la cible fmt :

Terminal window
pnpm nx fmt tf-infra

Exécutez des vérifications de sécurité sur votre infrastructure en utilisant Checkov avec la cible test :

Terminal window
pnpm nx test tf-infra

Vous trouverez vos résultats de tests de sécurité dans le dossier dist racine, sous dist/packages/<my-terraform-project>/checkov.

type = application

Les cibles suivantes ne sont disponibles que pour les projets de type application :

Avant d’appliquer des modifications, vous pouvez voir ce que Terraform va faire en exécutant la cible plan :

Terminal window
pnpm nx plan tf-infra

Cela créera un fichier de plan dans dist/packages/<my-terraform-project>/terraform/dev.tfplan.

Initialisez votre répertoire de travail Terraform avec la cible init :

Terminal window
pnpm nx run tf-infra:init

Après la planification, vous pouvez déployer votre infrastructure sur AWS en utilisant la cible apply :

Terminal window
pnpm nx apply tf-infra

Récupérez les valeurs de sortie de votre configuration Terraform :

Terminal window
pnpm nx output tf-infra

Lorsque vous devez démanteler votre infrastructure, utilisez la cible destroy :

Terminal window
pnpm nx destroy tf-infra

Pour nettoyer les ressources de bootstrap (bucket S3 pour le stockage de l’état) :

Terminal window
pnpm nx bootstrap-destroy tf-infra

Pour plus d’informations sur Terraform, veuillez vous référer à la Documentation Terraform et à la Documentation du fournisseur AWS.