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 | - | 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. |
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 run tf-infra:bootstrapyarn nx run tf-infra:bootstrapnpx nx run tf-infra:bootstrapbunx nx run tf-infra:bootstrapObjetivos 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 run tf-infra:validateyarn nx run tf-infra:validatenpx nx run tf-infra:validatebunx nx run tf-infra:validateFormatear tu código
Sección titulada «Formatear tu código»Formatea tu código Terraform con el objetivo fmt:
pnpm nx run tf-infra:fmtyarn nx run tf-infra:fmtnpx nx run tf-infra:fmtbunx nx run tf-infra:fmtPruebas de seguridad
Sección titulada «Pruebas de seguridad»Ejecuta verificaciones de seguridad en tu infraestructura con Checkov usando el objetivo test:
pnpm nx run tf-infra:testyarn nx run tf-infra:testnpx nx run tf-infra:testbunx nx run tf-infra:testEncontrará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:planyarn nx run tf-infra:plannpx nx run tf-infra:planbunx nx run tf-infra:planEsto 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 run tf-infra:applyyarn nx run tf-infra:applynpx nx run tf-infra:applybunx nx run tf-infra:applyObtener outputs
Sección titulada «Obtener outputs»Recupera valores de salida de tu configuración Terraform:
pnpm nx run tf-infra:outputyarn nx run tf-infra:outputnpx nx run tf-infra:outputbunx nx run tf-infra:outputDestruir infraestructura
Sección titulada «Destruir infraestructura»Cuando necesites eliminar tu infraestructura, usa el objetivo destroy:
pnpm nx run tf-infra:destroyyarn nx run tf-infra:destroynpx nx run tf-infra:destroybunx nx run tf-infra:destroyDestruir recursos de bootstrap
Sección titulada «Destruir recursos de bootstrap»Para eliminar los recursos de bootstrap (bucket S3 para almacenamiento de estado):
pnpm nx run tf-infra:bootstrap-destroyyarn nx run tf-infra:bootstrap-destroynpx nx run tf-infra:bootstrap-destroybunx nx run tf-infra:bootstrap-destroyMá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.