Infrastructure Terraform
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.
Utilisation
Section intitulée « Utilisation »Générer un projet Terraform
Section intitulée « Générer un projet Terraform »Vous pouvez générer un nouveau projet Terraform de deux manières :
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infrayarn nx g @aws/nx-plugin:terraform#project --name=tf-infranpx nx g @aws/nx-plugin:terraform#project --name=tf-infrabunx nx g @aws/nx-plugin:terraform#project --name=tf-infraVous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-runyarn nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-runnpx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-runbunx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - terraform#project - Remplissez les paramètres requis
- name: tf-infra
- Cliquez sur
Generate
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
| name Requis | string | - | Le nom du projet. |
| type | application | library | application | Si c'est une bibliothèque terraform (modules réutilisables) ou une application (déployable). |
| directory | string | packages | Le 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 | boolean | true | Indique 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. |
Sortie du générateur
Section intitulée « Sortie du générateur »Le générateur crée différentes structures de fichiers en fonction du type de projet :
Type Application
Section intitulée « 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
bootstrapetinit- 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 initavec la configuration du backend S3
- project.json Configuration du projet et cibles de build
Type Bibliothèque
Section intitulée « Type Bibliothèque »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
Implémenter votre infrastructure Terraform
Section intitulée « Implémenter votre infrastructure Terraform »Vous pouvez commencer à écrire votre infrastructure Terraform dans src/main.tf, par exemple :
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 hereresource "aws_s3_bucket" "my_bucket" { bucket = "my-unique-bucket-name"}Dépendances entre projets
Section intitulée « Dépendances entre projets »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.
Configuration de l’environnement
Section intitulée « Configuration de l’environnement »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 variablesenvironment = "prod"region = "us-west-2"{ "targets": { "apply": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform apply ../../../dist/packages/infra/terraform/dev.tfplan" }, "prod": { "command": "terraform apply ../../../dist/packages/infra/terraform/prod.tfplan" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" }, "dependsOn": ["plan"] }, "destroy": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform destroy -var-file=env/dev.tfvars" }, "prod": { "command": "terraform destroy -var-file=env/prod.tfvars" } }, "options": { "forwardAllArgs": true, "cwd":"{projectRoot}/src" }, "dependsOn": ["init"] }, "init": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "env": { "TF_ENV": "dev" } }, "prod": { "env": { "TF_ENV": "prod" } } }, "options": { "forwardAllArgs": true, "commands": ["tsx {projectRoot}/scripts/init.ts {projectRoot}"], "cwd": "{workspaceRoot}" } }, "plan": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform plan -var-file=env/dev.tfvars -out=../../../dist/packages/infra/terraform/dev.tfplan" }, "prod": { "command": "terraform plan -var-file=env/dev.tfvars -out=../../../dist/packages/infra/terraform/prod.tfplan" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" }, "dependsOn": ["init"] } }}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 :
pnpm nx bootstrap tf-infrayarn nx bootstrap tf-infranpx nx bootstrap tf-infrabunx nx bootstrap tf-infraCibles disponibles
Section intitulée « Cibles disponibles »Les cibles disponibles dépendent du type de votre projet :
Cibles communes (Application et Bibliothèque)
Section intitulée « Cibles communes (Application et Bibliothèque) »Valider votre infrastructure
Section intitulée « Valider votre infrastructure »Vous pouvez valider votre configuration Terraform en utilisant la cible validate :
pnpm nx validate tf-infrayarn nx validate tf-infranpx nx validate tf-infrabunx nx validate tf-infraFormater votre code
Section intitulée « Formater votre code »Formatez votre code Terraform en utilisant la cible fmt :
pnpm nx fmt tf-infrayarn nx fmt tf-infranpx nx fmt tf-infrabunx nx fmt tf-infraTests de sécurité
Section intitulée « Tests de sécurité »Exécutez des vérifications de sécurité sur votre infrastructure en utilisant Checkov avec la cible test :
pnpm nx test tf-infrayarn nx test tf-infranpx nx test tf-infrabunx nx test tf-infraVous trouverez vos résultats de tests de sécurité dans le dossier dist racine, sous dist/packages/<my-terraform-project>/checkov.
Cibles réservées aux applications
Section intitulée « Cibles réservées aux applications »Les cibles suivantes ne sont disponibles que pour les projets de type application :
Planifier votre infrastructure
Section intitulée « Planifier votre infrastructure »Avant d’appliquer des modifications, vous pouvez voir ce que Terraform va faire en exécutant la cible plan :
pnpm nx plan tf-infrayarn nx plan tf-infranpx nx plan tf-infrabunx nx plan tf-infraCela créera un fichier de plan dans dist/packages/<my-terraform-project>/terraform/dev.tfplan.
Initialiser Terraform
Section intitulée « Initialiser Terraform »Initialisez votre répertoire de travail Terraform avec la cible init :
pnpm nx run tf-infra:inityarn nx run tf-infra:initnpx nx run tf-infra:initbunx nx run tf-infra:initDéployer sur AWS
Section intitulée « Déployer sur AWS »Après la planification, vous pouvez déployer votre infrastructure sur AWS en utilisant la cible apply :
pnpm nx apply tf-infrayarn nx apply tf-infranpx nx apply tf-infrabunx nx apply tf-infraObtenir les sorties
Section intitulée « Obtenir les sorties »Récupérez les valeurs de sortie de votre configuration Terraform :
pnpm nx output tf-infrayarn nx output tf-infranpx nx output tf-infrabunx nx output tf-infraDétruire l’infrastructure
Section intitulée « Détruire l’infrastructure »Lorsque vous devez démanteler votre infrastructure, utilisez la cible destroy :
pnpm nx destroy tf-infrayarn nx destroy tf-infranpx nx destroy tf-infrabunx nx destroy tf-infraDétruire les ressources de bootstrap
Section intitulée « Détruire les ressources de bootstrap »Pour nettoyer les ressources de bootstrap (bucket S3 pour le stockage de l’état) :
pnpm nx bootstrap-destroy tf-infrayarn nx bootstrap-destroy tf-infranpx nx bootstrap-destroy tf-infrabunx nx bootstrap-destroy tf-infraPlus d’informations
Section intitulée « Plus d’informations »Pour plus d’informations sur Terraform, veuillez vous référer à la Documentation Terraform et à la Documentation du fournisseur AWS.