Infrastructure Terraform
Terraform est un outil open source d’infrastructure as code qui permet de créer, modifier et améliorer une infrastructure de manière sécurisée et prévisible.
Le générateur d’infrastructure Terraform crée un projet d’infrastructure Terraform. L’application générée intègre des bonnes 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 :
- 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
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| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
| name Requis | string | - | The name of the project. |
| type | string | application | Whether this is a terraform lib (re-usable modules) or app (deployable). |
| directory | string | packages | The directory of the new project. |
Sortie du générateur
Section intitulée « Sortie du générateur »Le générateur crée différentes structures de fichiers selon le 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 d’état distant :
Répertoiresrc
- main.tf Fichier de configuration principal Terraform
- providers.tf Configuration des providers avec backend S3
- variables.tf Définition des variables d’entrée
- outputs.tf Définition des valeurs de sortie
Répertoireenv Fichiers de variables spécifiques à l’environnement
- dev.tfvars Variables d’environnement de développement
Répertoirebootstrap Configuration du backend pour l’état distant
- main.tf Bucket S3 et politiques de stockage d’état
- providers.tf Configuration du provider AWS
- variables.tf Définition des variables de bootstrap
- 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 simplifiée pour des modules Terraform réutilisables :
Répertoiresrc
- main.tf Fichier principal du module Terraform
- project.json Configuration du projet et cibles de build
Implémentation de votre infrastructure Terraform
Section intitulée « Implémentation de 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}'" }}
# Déclarez votre infrastructure iciresource "aws_s3_bucket" "my_bucket" { bucket = "my-unique-bucket-name"}Dépendances inter-projets
Section intitulée « Dépendances inter-projets »Pour exécuter un module d’un projet séparé (lib), vous pouvez procéder ainsi :
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 librairie.
Configuration d’environnement
Section intitulée « Configuration d’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 et ajoutez de nouvelles entrées pour apply, destroy, init, plan dans le project.json. Par exemple, ajoutons un environnement prod :
# Variables d'environnement de productionenvironment = "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": { "command": "terraform init -reconfigure -backend-config=\"region=$(aws configure get region)\" -backend-config=\"bucket=$(aws sts get-caller-identity --query Account --output text)-tf-state-$(aws configure get region)\" -backend-config=\"key=my-scope-my-project/dev/terraform.tfstate\"" }, "prod": { "command": "terraform init -reconfigure -backend-config=\"region=$(aws configure get region)\" -backend-config=\"bucket=$(aws sts get-caller-identity --query Account --output text)-tf-state-$(aws configure get region)\" -backend-config=\"key=my-scope-my-project/prod/terraform.tfstate\"" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" } }, "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 du backend distant (Projets application uniquement)
Section intitulée « Bootstrap du backend distant (Projets application uniquement) »Pour les projets application, avant de déployer votre infrastructure, vous devez initialiser le backend distant. Cela crée un bucket S3 pour stocker les fichiers d’état Terraform :
pnpm nx run tf-infra:bootstrapyarn nx run tf-infra:bootstrapnpx nx run tf-infra:bootstrapbunx nx run tf-infra:bootstrapCibles disponibles
Section intitulée « Cibles disponibles »Les cibles disponibles dépendent du type de projet :
Cibles communes (Application et Bibliothèque)
Section intitulée « Cibles communes (Application et Bibliothèque) »Validation de l’infrastructure
Section intitulée « Validation de l’infrastructure »Validez votre configuration Terraform avec la cible validate :
pnpm nx run tf-infra:validateyarn nx run tf-infra:validatenpx nx run tf-infra:validatebunx nx run tf-infra:validateFormatage du code
Section intitulée « Formatage du code »Formatez votre code Terraform avec la cible fmt :
pnpm nx run tf-infra:fmtyarn nx run tf-infra:fmtnpx nx run tf-infra:fmtbunx nx run tf-infra:fmtTests de sécurité
Section intitulée « Tests de sécurité »Exécutez des contrôles de sécurité sur votre infrastructure avec Checkov via la cible test :
pnpm nx run tf-infra:testyarn nx run tf-infra:testnpx nx run tf-infra:testbunx nx run tf-infra:testVous trouverez les résultats des tests de sécurité dans le dossier dist racine, sous dist/packages/<my-terraform-project>/checkov.
Cibles spécifiques aux applications
Section intitulée « Cibles spécifiques aux applications »Les cibles suivantes sont uniquement disponibles pour les projets de type application :
Planification de l’infrastructure
Section intitulée « Planification de l’infrastructure »Avant d’appliquer les changements, visualisez les modifications avec la cible plan :
pnpm nx run tf-infra:planyarn nx run tf-infra:plannpx nx run tf-infra:planbunx nx run tf-infra:planCela crée un fichier de plan dans dist/packages/<my-terraform-project>/terraform/dev.tfplan.
Initialisation de Terraform
Section intitulée « Initialisation de 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éploiement sur AWS
Section intitulée « Déploiement sur AWS »Après la planification, déployez votre infrastructure sur AWS avec la cible apply :
pnpm nx run tf-infra:applyyarn nx run tf-infra:applynpx nx run tf-infra:applybunx nx run tf-infra:applyRécupération des outputs
Section intitulée « Récupération des outputs »Récupérez les valeurs de sortie de votre configuration Terraform :
pnpm nx run tf-infra:outputyarn nx run tf-infra:outputnpx nx run tf-infra:outputbunx nx run tf-infra:outputDestruction de l’infrastructure
Section intitulée « Destruction de l’infrastructure »Pour supprimer votre infrastructure, utilisez la cible destroy :
pnpm nx run tf-infra:destroyyarn nx run tf-infra:destroynpx nx run tf-infra:destroybunx nx run tf-infra:destroyDestruction des ressources de bootstrap
Section intitulée « Destruction des ressources de bootstrap »Pour nettoyer les ressources de bootstrap (bucket S3 de stockage d’état) :
pnpm nx run tf-infra:bootstrap-destroyyarn nx run tf-infra:bootstrap-destroynpx nx run tf-infra:bootstrap-destroybunx nx run tf-infra:bootstrap-destroyPlus d’informations
Section intitulée « Plus d’informations »Pour plus d’informations sur Terraform, consultez la Documentation Terraform et la Documentation du provider AWS.