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-infra
yarn nx g @aws/nx-plugin:terraform#project --name=tf-infra
npx nx g @aws/nx-plugin:terraform#project --name=tf-infra
bunx nx g @aws/nx-plugin:terraform#project --name=tf-infra
Vous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
yarn nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
npx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
bunx 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 des structures de fichiers différentes selon le type de projet :
Type d’application
Section intitulée « Type d’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é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 bootstrap pour l’état distant
- main.tf Bucket S3 et politiques de stockage d’état
- providers.tf Configuration du provider AWS
- variables.tf Définitions des variables bootstrap
- project.json Configuration du projet et cibles de build
Type de bibliothèque
Section intitulée « Type de 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=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=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 d’état distant (Projets application uniquement)
Section intitulée « Bootstrap d’état distant (Projets application uniquement) »Pour les projets application, avant de déployer votre infrastructure, vous devez initialiser le backend d’état distant. Cela crée un bucket S3 pour stocker vos fichiers d’état Terraform :
pnpm nx run tf-infra:bootstrap
yarn nx run tf-infra:bootstrap
npx nx run tf-infra:bootstrap
bunx nx run tf-infra:bootstrap
Cibles 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:validate
yarn nx run tf-infra:validate
npx nx run tf-infra:validate
bunx nx run tf-infra:validate
Formatage du code
Section intitulée « Formatage du code »Formatez votre code Terraform avec la cible fmt
:
pnpm nx run tf-infra:fmt
yarn nx run tf-infra:fmt
npx nx run tf-infra:fmt
bunx nx run tf-infra:fmt
Tests de sécurité
Section intitulée « Tests de sécurité »Exécutez des vérifications de sécurité sur votre infrastructure avec Checkov via la cible test
:
pnpm nx run tf-infra:test
yarn nx run tf-infra:test
npx nx run tf-infra:test
bunx nx run tf-infra:test
Vous 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 des changements, visualisez les actions Terraform avec la cible plan
:
pnpm nx run tf-infra:plan
yarn nx run tf-infra:plan
npx nx run tf-infra:plan
bunx nx run tf-infra:plan
Cela 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:init
yarn nx run tf-infra:init
npx nx run tf-infra:init
bunx nx run tf-infra:init
Dé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:apply
yarn nx run tf-infra:apply
npx nx run tf-infra:apply
bunx nx run tf-infra:apply
Ré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:output
yarn nx run tf-infra:output
npx nx run tf-infra:output
bunx nx run tf-infra:output
Destruction de l’infrastructure
Section intitulée « Destruction de l’infrastructure »Pour supprimer votre infrastructure, utilisez la cible destroy
:
pnpm nx run tf-infra:destroy
yarn nx run tf-infra:destroy
npx nx run tf-infra:destroy
bunx nx run tf-infra:destroy
Destruction des ressources bootstrap
Section intitulée « Destruction des ressources bootstrap »Pour nettoyer les ressources bootstrap (bucket S3 de stockage d’état) :
pnpm nx run tf-infra:bootstrap-destroy
yarn nx run tf-infra:bootstrap-destroy
npx nx run tf-infra:bootstrap-destroy
bunx nx run tf-infra:bootstrap-destroy
Informations complémentaires
Section intitulée « Informations complémentaires »Pour plus d’informations sur Terraform, consultez la Documentation Terraform et la Documentation du provider AWS.