Infrastruttura Terraform
Terraform è uno strumento software open-source di infrastructure as code che consente di creare, modificare e migliorare l’infrastruttura in modo sicuro e prevedibile.
Il generatore di infrastruttura Terraform crea un progetto di infrastruttura Terraform. L’applicazione generata include le best practice di sicurezza attraverso i controlli di sicurezza di Checkov.
Utilizzo
Sezione intitolata “Utilizzo”Generare un progetto Terraform
Sezione intitolata “Generare un progetto Terraform”Puoi generare un nuovo progetto Terraform in due modi:
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-infraPuoi anche eseguire una prova per vedere quali file verrebbero modificati
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- Installa il Nx Console VSCode Plugin se non l'hai già fatto
- Apri la console Nx in VSCode
- Clicca su
Generate (UI)nella sezione "Common Nx Commands" - Cerca
@aws/nx-plugin - terraform#project - Compila i parametri richiesti
- name: tf-infra
- Clicca su
Generate
Opzioni
Sezione intitolata “Opzioni”| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| name Obbligatorio | string | - | Il nome del progetto. |
| type | application | library | application | Se si tratta di una libreria terraform (moduli riutilizzabili) o di un'app (distribuibile). |
| directory | string | packages | La directory del nuovo progetto. |
| subDirectory | string | - | La sottodirectory in cui viene posizionato il progetto. Per impostazione predefinita corrisponde al nome del progetto. |
| preferInstallDependencies | boolean | true | Se preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine. |
Output del generatore
Sezione intitolata “Output del generatore”Il generatore crea diverse strutture di file a seconda del tipo di progetto:
Tipo Application
Sezione intitolata “Tipo Application”Per i progetti application (--type=application), il generatore crea un’applicazione Terraform completa con gestione dello stato remoto:
Directorysrc
- main.tf File di configurazione Terraform principale
- providers.tf Configurazione del provider con backend S3
- variables.tf Definizioni delle variabili di input
- outputs.tf Definizioni dei valori di output
Directoryenv File di variabili specifici per ambiente
- dev.tfvars Variabili dell’ambiente di sviluppo
Directorybootstrap Configurazione di bootstrap per lo stato remoto
- main.tf Bucket S3 e policy per l’archiviazione dello stato
- providers.tf Configurazione del provider AWS
- variables.tf Definizioni delle variabili di bootstrap
Directoryscripts Helper Node eseguiti dai target nx
bootstrapeinit- aws-config.ts Risolve account + regione tramite la catena di credenziali AWS SDK
- bootstrap.ts Esegue pull/push del tfstate di bootstrap ed esegue
terraform apply - init.ts Esegue
terraform initcon la configurazione del backend S3
- project.json Configurazione del progetto e target di build
Tipo Library
Sezione intitolata “Tipo Library”Per i progetti library (--type=library), il generatore crea una struttura più semplice per moduli Terraform riutilizzabili:
Directorysrc
- main.tf File del modulo Terraform principale
- project.json Configurazione del progetto e target di build
Implementare la tua infrastruttura Terraform
Sezione intitolata “Implementare la tua infrastruttura Terraform”Puoi iniziare a scrivere la tua infrastruttura Terraform all’interno di src/main.tf, per esempio:
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"}Dipendenze tra progetti
Sezione intitolata “Dipendenze tra progetti”Se volessi eseguire un modulo da un progetto separato (lib), potresti farlo come segue:
module "lib_module" { source = "../../path/to/my-lib/src"}Questo aggiornerà automaticamente il grafo Nx per aggiungere una dipendenza tra la tua applicazione consumatrice e la tua lib.
Configurazione dell’ambiente
Sezione intitolata “Configurazione dell’ambiente”Configura le variabili specifiche per ambiente nei file src/env/*.tfvars.
Per aggiungere nuovi ambienti, crea un nuovo file src/env/<environment>.tfvars con le variabili specifiche per l’ambiente e aggiungi nuove voci per apply, destroy, init, plan nel project.json per la nuova configurazione dell’ambiente. Per esempio, supponiamo di voler aggiungere un ambiente 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 dello stato remoto (solo progetti Application)
Sezione intitolata “Bootstrap dello stato remoto (solo progetti Application)”Prima di distribuire la tua infrastruttura, dovrai eseguire il bootstrap del backend dello stato remoto. Questo crea un bucket S3 per archiviare i tuoi file di stato Terraform:
pnpm nx bootstrap tf-infrayarn nx bootstrap tf-infranpx nx bootstrap tf-infrabunx nx bootstrap tf-infraTarget disponibili
Sezione intitolata “Target disponibili”I target disponibili dipendono dal tipo di progetto:
Target comuni (sia Application che Library)
Sezione intitolata “Target comuni (sia Application che Library)”Validare la tua infrastruttura
Sezione intitolata “Validare la tua infrastruttura”Puoi validare la tua configurazione Terraform utilizzando il target validate:
pnpm nx validate tf-infrayarn nx validate tf-infranpx nx validate tf-infrabunx nx validate tf-infraFormattare il tuo codice
Sezione intitolata “Formattare il tuo codice”Formatta il tuo codice Terraform utilizzando il target fmt:
pnpm nx fmt tf-infrayarn nx fmt tf-infranpx nx fmt tf-infrabunx nx fmt tf-infraTest di sicurezza
Sezione intitolata “Test di sicurezza”Esegui controlli di sicurezza sulla tua infrastruttura utilizzando Checkov con il target test:
pnpm nx test tf-infrayarn nx test tf-infranpx nx test tf-infrabunx nx test tf-infraTroverai i risultati dei test di sicurezza nella cartella dist principale, sotto dist/packages/<my-terraform-project>/checkov.
Target solo per Application
Sezione intitolata “Target solo per Application”I seguenti target sono disponibili solo per i progetti di tipo application:
Pianificare la tua infrastruttura
Sezione intitolata “Pianificare la tua infrastruttura”Prima di applicare le modifiche, puoi vedere cosa farà Terraform eseguendo il target plan:
pnpm nx plan tf-infrayarn nx plan tf-infranpx nx plan tf-infrabunx nx plan tf-infraQuesto creerà un file di piano in dist/packages/<my-terraform-project>/terraform/dev.tfplan.
Inizializzare Terraform
Sezione intitolata “Inizializzare Terraform”Inizializza la tua directory di lavoro Terraform con il target init:
pnpm nx run tf-infra:inityarn nx run tf-infra:initnpx nx run tf-infra:initbunx nx run tf-infra:initDistribuire su AWS
Sezione intitolata “Distribuire su AWS”Dopo la pianificazione, puoi distribuire la tua infrastruttura su AWS utilizzando il target apply:
pnpm nx apply tf-infrayarn nx apply tf-infranpx nx apply tf-infrabunx nx apply tf-infraOttenere gli output
Sezione intitolata “Ottenere gli output”Recupera i valori di output dalla tua configurazione Terraform:
pnpm nx output tf-infrayarn nx output tf-infranpx nx output tf-infrabunx nx output tf-infraDistruggere l’infrastruttura
Sezione intitolata “Distruggere l’infrastruttura”Quando devi smantellare la tua infrastruttura, usa il target destroy:
pnpm nx destroy tf-infrayarn nx destroy tf-infranpx nx destroy tf-infrabunx nx destroy tf-infraDistruggere le risorse di bootstrap
Sezione intitolata “Distruggere le risorse di bootstrap”Per pulire le risorse di bootstrap (bucket S3 per l’archiviazione dello stato):
pnpm nx bootstrap-destroy tf-infrayarn nx bootstrap-destroy tf-infranpx nx bootstrap-destroy tf-infrabunx nx bootstrap-destroy tf-infraUlteriori informazioni
Sezione intitolata “Ulteriori informazioni”Per ulteriori informazioni su Terraform, consulta la Documentazione Terraform e la Documentazione del provider AWS.