Infraestructura Terraform
Terraform es una herramienta de software de infraestructura como código de código abierto que te permite crear, cambiar y mejorar infraestructura de manera segura y predecible.
El generador de infraestructura Terraform crea un proyecto de infraestructura Terraform. La aplicación generada incluye mejores prácticas de seguridad a través de verificaciones de seguridad de Checkov.
Generar un Proyecto Terraform
Sección titulada «Generar un Proyecto Terraform»Puedes generar un nuevo proyecto Terraform de dos maneras:
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-infraTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
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- Instale el Nx Console VSCode Plugin si aún no lo ha hecho
- Abra la consola Nx en VSCode
- Haga clic en
Generate (UI)en la sección "Common Nx Commands" - Busque
@aws/nx-plugin - terraform#project - Complete los parámetros requeridos
- name: tf-infra
- Haga clic en
Generate
Opciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| name Requerido | string | - | El nombre del proyecto. |
| type | application | library | application | Si esto es una lib de terraform (módulos reutilizables) o app (desplegable). |
| directory | string | packages | El directorio del nuevo proyecto. |
| subDirectory | string | - | El subdirectorio en el que se coloca el proyecto. Por defecto, este es el nombre del proyecto. |
| preferInstallDependencies | boolean | true | Si se prefiere instalar las dependencias después de que se ejecute el generador. Establecer en false para diferir la instalación cuando se ejecutan múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsiguientes puedan calcular el grafo de proyectos de Nx); instalar una vez al final. |
Salida del Generador
Sección titulada «Salida del Generador»El generador crea diferentes estructuras de archivos dependiendo del tipo de proyecto:
Tipo Application
Sección titulada «Tipo Application»Para proyectos de aplicación (--type=application), el generador crea una aplicación Terraform completa con gestión de estado remoto:
Directoriosrc
- main.tf Main Terraform configuration file
- providers.tf Provider configuration with S3 backend
- variables.tf Input variable definitions
- outputs.tf Output value definitions
Directorioenv Environment-specific variable files
- dev.tfvars Development environment variables
Directoriobootstrap Bootstrap configuration for remote state
- main.tf S3 bucket and policies for state storage
- providers.tf AWS provider configuration
- variables.tf Bootstrap variable definitions
Directorioscripts Node helpers run by the nx
bootstrapandinittargets- aws-config.ts Resolves account + region via the AWS SDK credential chain
- bootstrap.ts Pulls/pushes the bootstrap tfstate and runs
terraform apply - init.ts Runs
terraform initwith the S3 backend config
- project.json Project configuration and build targets
Tipo Library
Sección titulada «Tipo Library»Para proyectos de biblioteca (--type=library), el generador crea una estructura más simple para módulos Terraform reutilizables:
Directoriosrc
- main.tf Main Terraform module file
- project.json Project configuration and build targets
Implementar tu Infraestructura Terraform
Sección titulada «Implementar tu Infraestructura Terraform»Puedes comenzar a escribir tu infraestructura Terraform dentro de src/main.tf, por ejemplo:
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"}Dependencias entre proyectos
Sección titulada «Dependencias entre proyectos»Si quisieras ejecutar un módulo desde un proyecto separado (lib), podrías hacerlo de la siguiente manera:
module "lib_module" { source = "../../path/to/my-lib/src"}Esto actualizará automáticamente el grafo de Nx para agregar una dependencia entre tu aplicación consumidora y tu lib.
Configuración de Entorno
Sección titulada «Configuración de Entorno»Configura variables específicas del entorno en los archivos src/env/*.tfvars.
Para agregar nuevos entornos, crea un nuevo archivo src/env/<environment>.tfvars con las variables específicas del entorno y agrega nuevas entradas para apply, destroy, init, plan en el project.json para la nueva configuración de entorno. Por ejemplo, supongamos que queremos agregar un entorno 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 Estado Remoto (Solo Proyectos Application)
Sección titulada «Bootstrap de Estado Remoto (Solo Proyectos Application)»Antes de desplegar tu infraestructura, necesitarás hacer el bootstrap del backend de estado remoto. Esto crea un bucket S3 para almacenar tus archivos de estado de Terraform:
pnpm nx bootstrap tf-infrayarn nx bootstrap tf-infranpx nx bootstrap tf-infrabunx nx bootstrap tf-infraTargets Disponibles
Sección titulada «Targets Disponibles»Los targets disponibles dependen del tipo de tu proyecto:
Targets Comunes (Tanto Application como Library)
Sección titulada «Targets Comunes (Tanto Application como Library)»Validar tu Infraestructura
Sección titulada «Validar tu Infraestructura»Puedes validar tu configuración de Terraform usando el target validate:
pnpm nx validate tf-infrayarn nx validate tf-infranpx nx validate tf-infrabunx nx validate tf-infraFormatear tu Código
Sección titulada «Formatear tu Código»Formatea tu código Terraform usando el target fmt:
pnpm nx fmt tf-infrayarn nx fmt tf-infranpx nx fmt tf-infrabunx nx fmt tf-infraPruebas de Seguridad
Sección titulada «Pruebas de Seguridad»Ejecuta verificaciones de seguridad en tu infraestructura usando Checkov con el target test:
pnpm nx test tf-infrayarn nx test tf-infranpx nx test tf-infrabunx nx test tf-infraEncontrarás los resultados de tus pruebas de seguridad en la carpeta raíz dist, bajo dist/packages/<my-terraform-project>/checkov.
Targets Solo para Application
Sección titulada «Targets Solo para Application»Los siguientes targets solo están disponibles para proyectos de tipo application:
Planificar tu Infraestructura
Sección titulada «Planificar tu Infraestructura»Antes de aplicar cambios, puedes ver qué hará Terraform ejecutando el target plan:
pnpm nx plan tf-infrayarn nx plan tf-infranpx nx plan tf-infrabunx nx plan tf-infraEsto creará un archivo de plan en dist/packages/<my-terraform-project>/terraform/dev.tfplan.
Inicializar Terraform
Sección titulada «Inicializar Terraform»Inicializa tu directorio de trabajo de Terraform con el target init:
pnpm nx run tf-infra:inityarn nx run tf-infra:initnpx nx run tf-infra:initbunx nx run tf-infra:initDesplegar a AWS
Sección titulada «Desplegar a AWS»Después de planificar, puedes desplegar tu infraestructura a AWS usando el target apply:
pnpm nx apply tf-infrayarn nx apply tf-infranpx nx apply tf-infrabunx nx apply tf-infraObtener Outputs
Sección titulada «Obtener Outputs»Recupera valores de salida de tu configuración de Terraform:
pnpm nx output tf-infrayarn nx output tf-infranpx nx output tf-infrabunx nx output tf-infraDestruir Infraestructura
Sección titulada «Destruir Infraestructura»Cuando necesites desmantelar tu infraestructura, usa el target destroy:
pnpm nx destroy tf-infrayarn nx destroy tf-infranpx nx destroy tf-infrabunx nx destroy tf-infraDestruir Recursos de Bootstrap
Sección titulada «Destruir Recursos de Bootstrap»Para limpiar los recursos de bootstrap (bucket S3 para almacenamiento de estado):
pnpm nx bootstrap-destroy tf-infrayarn nx bootstrap-destroy tf-infranpx nx bootstrap-destroy tf-infrabunx nx bootstrap-destroy tf-infraMás Información
Sección titulada «Más Información»Para más información sobre Terraform, consulta la Documentación de Terraform y la Documentación del Proveedor AWS.