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-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
Tambié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-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
Opciones
Sección titulada «Opciones»Parámetro | Tipo | Predeterminado | Descripción |
---|---|---|---|
name Requerido | 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. |
Salida del generador
Sección titulada «Salida 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:
Directorysrc
- 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
Directoryenv Archivos de variables específicas por entorno
- dev.tfvars Variables de entorno de desarrollo
Directorybootstrap 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 para bootstrap
- project.json Configuración del proyecto y objetivos de build
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:
Directorysrc
- main.tf Archivo principal del módulo Terraform
- project.json Configuración del proyecto y objetivos de build
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 un proyecto separado (lib), 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 de entornos
Sección titulada «Configuración de entornos»Configura variables específicas por entorno en los archivos src/env/*.tfvars
.
Para agregar nuevos entornos, crea un nuevo archivo src/env/<entorno>.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
:
# Variables de entorno de producciónenvironment = "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 de estado remoto (Solo proyectos de aplicación)
Sección titulada «Bootstrap de estado remoto (Solo proyectos de aplicación)»Para proyectos de aplicación, antes de desplegar tu infraestructura, necesitas inicializar el backend de estado remoto. Esto crea un bucket S3 para almacenar tus archivos de estado de 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
Objetivos 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 usando el objetivo 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
Formatear tu código
Sección titulada «Formatear tu código»Formatea tu código Terraform usando el objetivo 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
Pruebas de seguridad
Sección titulada «Pruebas de seguridad»Ejecuta verificaciones de seguridad en tu infraestructura usando Checkov con el objetivo 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
Encontrará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 run tf-infra:plan
yarn nx run tf-infra:plan
npx nx run tf-infra:plan
bunx nx run tf-infra:plan
Esto 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:init
yarn nx run tf-infra:init
npx nx run tf-infra:init
bunx nx run tf-infra:init
Desplegar en AWS
Sección titulada «Desplegar en AWS»Después de planificar, puedes desplegar tu infraestructura en AWS usando el objetivo 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
Obtener salidas
Sección titulada «Obtener salidas»Recupera valores de salida de tu configuración 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
Destruir infraestructura
Sección titulada «Destruir infraestructura»Cuando necesites eliminar tu infraestructura, usa el objetivo 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
Destruir recursos de bootstrap
Sección titulada «Destruir recursos de bootstrap»Para limpiar los recursos de bootstrap (bucket S3 para almacenamiento de estado):
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
Má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.