Infraestructura de Terraform
Terraform es una herramienta de código abierto para infraestructura como código que te permite crear, modificar y mejorar infraestructura de forma segura y predecible.
El generador de infraestructura Terraform crea un proyecto de infraestructura con Terraform. La aplicación generada incluye mejores prácticas de seguridad mediante verificaciones de Checkov.
Generar un proyecto Terraform
Sección titulada «Generar un proyecto Terraform»Puedes generar un nuevo proyecto Terraform de dos formas:
- 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
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-runOpciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| name Requerido | string | - | El nombre del proyecto. |
| type | string | 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. |
Resultado del generador
Sección titulada «Resultado del generador»El generador crea diferentes estructuras de archivos según el tipo de proyecto:
Tipo Aplicación
Sección titulada «Tipo Aplicación»Para proyectos de aplicación (--type=application), el generador crea una aplicación Terraform completa con gestión de estado remoto:
Directoriosrc
- main.tf Archivo principal de configuración de Terraform
- providers.tf Configuración de proveedores con backend S3
- variables.tf Definiciones de variables de entrada
- outputs.tf Definiciones de valores de salida
Directorioenv Archivos de variables específicas del entorno
- dev.tfvars Variables de entorno de desarrollo
Directoriobootstrap Configuración de bootstrap para estado remoto
- main.tf Bucket S3 y políticas para almacenamiento de estado
- providers.tf Configuración del proveedor AWS
- variables.tf Definiciones de variables de bootstrap
- project.json Configuración del proyecto y objetivos de construcción
Tipo Biblioteca
Sección titulada «Tipo Biblioteca»Para proyectos de biblioteca (--type=library), el generador crea una estructura más simple para módulos Terraform reutilizables:
Directoriosrc
- main.tf Archivo principal del módulo Terraform
- project.json Configuración del proyecto y objetivos de construcción
Implementando tu infraestructura Terraform
Sección titulada «Implementando tu infraestructura Terraform»Puedes comenzar a escribir tu infraestructura Terraform en 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}'" }}
# Declara tu infraestructura aquíresource "aws_s3_bucket" "my_bucket" { bucket = "my-unique-bucket-name"}Dependencias entre proyectos
Sección titulada «Dependencias entre proyectos»Si deseas ejecutar un módulo de otro proyecto (biblioteca), puedes 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 biblioteca.
Configuración del entorno
Sección titulada «Configuración del entorno»Configura variables específicas del entorno en los archivos src/env/*.tfvars.
Para agregar nuevos entornos, crea un nuevo archivo src/env/<entorno>.tfvars con las variables específicas y agrega nuevas entradas para apply, destroy, init, plan en el project.json para la nueva configuración. 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": { "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 de estado remoto (solo proyectos aplicación)
Sección titulada «Bootstrap de estado remoto (solo proyectos aplicación)»Para proyectos de aplicación, antes de desplegar tu infraestructura, necesitas ejecutar 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-infraObjetivos disponibles
Sección titulada «Objetivos disponibles»Los objetivos disponibles dependen del tipo de proyecto:
Objetivos comunes (aplicación y biblioteca)
Sección titulada «Objetivos comunes (aplicación y biblioteca)»Validar tu infraestructura
Sección titulada «Validar tu infraestructura»Puedes validar tu configuración Terraform con el objetivo 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 con el objetivo 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 con Checkov usando el objetivo test:
pnpm nx test tf-infrayarn nx test tf-infranpx nx test tf-infrabunx nx test tf-infraEncontrarás los resultados de las pruebas de seguridad en la carpeta dist raíz, bajo dist/packages/<mi-proyecto-terraform>/checkov.
Objetivos exclusivos de aplicación
Sección titulada «Objetivos exclusivos de aplicación»Los siguientes objetivos solo están disponibles para proyectos de tipo aplicación:
Planificar tu infraestructura
Sección titulada «Planificar tu infraestructura»Antes de aplicar cambios, puedes ver lo que Terraform hará ejecutando el objetivo 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/<mi-proyecto-terraform>/terraform/dev.tfplan.
Inicializar Terraform
Sección titulada «Inicializar Terraform»Inicializa tu directorio de trabajo de Terraform con el objetivo init:
pnpm nx run tf-infra:inityarn nx run tf-infra:initnpx nx run tf-infra:initbunx nx run tf-infra:initDesplegar en AWS
Sección titulada «Desplegar en AWS»Después de planificar, puedes desplegar tu infraestructura en AWS con el objetivo 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 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 eliminar tu infraestructura, usa el objetivo 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 eliminar 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.