Infrastruttura Terraform
Terraform è uno strumento open-source per l’infrastruttura come codice che ti permette 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 best practice di sicurezza attraverso i controlli di sicurezza di Checkov.
Utilizzo
Sezione intitolata “Utilizzo”Genera un Progetto Terraform
Sezione intitolata “Genera un Progetto Terraform”Puoi generare un nuovo progetto Terraform in due modi:
- 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
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-runOpzioni
Sezione intitolata “Opzioni”| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| name Obbligatorio | string | - | Il nome del progetto. |
| type | string | 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. |
Output del Generatore
Sezione intitolata “Output del Generatore”Il generatore crea strutture di file diverse in base al tipo di progetto:
Tipo Applicazione
Sezione intitolata “Tipo Applicazione”Per progetti di applicazione (--type=application), il generatore crea un’applicazione Terraform completa con gestione dello stato remoto:
Directorysrc
- main.tf File di configurazione principale Terraform
- providers.tf Configurazione provider con backend S3
- variables.tf Definizioni variabili di input
- outputs.tf Definizioni valori di output
Directoryenv File di variabili specifici per ambiente
- dev.tfvars Variabili ambiente di sviluppo
Directorybootstrap Configurazione bootstrap per stato remoto
- main.tf Bucket S3 e politiche per lo storage dello stato
- providers.tf Configurazione provider AWS
- variables.tf Definizioni variabili bootstrap
Directoryscripts Helper Node eseguiti dai target nx
bootstrapeinit- aws-config.ts Risolve account + regione tramite la catena di credenziali AWS SDK
- bootstrap.ts Effettua pull/push del tfstate bootstrap ed esegue
terraform apply - init.ts Esegue
terraform initcon la configurazione backend S3
- project.json Configurazione progetto e target di build
Tipo Libreria
Sezione intitolata “Tipo Libreria”Per progetti libreria (--type=library), il generatore crea una struttura più semplice per moduli Terraform riutilizzabili:
Directorysrc
- main.tf File principale modulo Terraform
- project.json Configurazione 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 in src/main.tf, ad 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}'" }}
# Dichiarare la propria infrastruttura quiresource "aws_s3_bucket" "my_bucket" { bucket = "my-unique-bucket-name"}Dipendenze cross-project
Sezione intitolata “Dipendenze cross-project”Se vuoi eseguire un modulo da un progetto separato (lib), puoi farlo così:
module "lib_module" { source = "../../path/to/my-lib/src"}Questo aggiornerà automaticamente il grafo Nx per aggiungere una dipendenza tra la tua applicazione consumer e la tua lib.
Configurazione Ambiente
Sezione intitolata “Configurazione 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 e aggiungi nuove voci per apply, destroy, init, plan nel project.json per la nuova configurazione ambiente. Ad esempio, aggiungiamo un ambiente prod:
# Variabili ambiente produzioneenvironment = "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 Stato Remoto (Solo Progetti Applicazione)
Sezione intitolata “Bootstrap Stato Remoto (Solo Progetti Applicazione)”Prima di deployare l’infrastruttura devi eseguire il bootstrap del backend per lo stato remoto. Questo crea un bucket S3 per archiviare i 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 (Applicazione e Libreria)
Sezione intitolata “Target Comuni (Applicazione e Libreria)”Convalida della tua Infrastruttura
Sezione intitolata “Convalida della tua Infrastruttura”Puoi validare la configurazione Terraform con il target validate:
pnpm nx validate tf-infrayarn nx validate tf-infranpx nx validate tf-infrabunx nx validate tf-infraFormattazione del Codice
Sezione intitolata “Formattazione del Codice”Formatta il codice Terraform con 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 sull’infrastruttura con Checkov usando 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 Applicazione
Sezione intitolata “Target Solo Applicazione”I seguenti target sono disponibili solo per progetti di tipo applicazione:
Pianificazione dell’Infrastruttura
Sezione intitolata “Pianificazione dell’Infrastruttura”Prima di applicare modifiche, puoi vedere cosa farà Terraform con il target plan:
pnpm nx plan tf-infrayarn nx plan tf-infranpx nx plan tf-infrabunx nx plan tf-infraQuesto creerà un file di plan in dist/packages/<my-terraform-project>/terraform/dev.tfplan.
Inizializzazione Terraform
Sezione intitolata “Inizializzazione Terraform”Inizializza la 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:initDeploy su AWS
Sezione intitolata “Deploy su AWS”Dopo la pianificazione, puoi deployare l’infrastruttura su AWS con il target apply:
pnpm nx apply tf-infrayarn nx apply tf-infranpx nx apply tf-infrabunx nx apply tf-infraOttenere Output
Sezione intitolata “Ottenere Output”Recupera i valori di output dalla configurazione Terraform:
pnpm nx output tf-infrayarn nx output tf-infranpx nx output tf-infrabunx nx output tf-infraDistruzione Infrastruttura
Sezione intitolata “Distruzione Infrastruttura”Per eliminare l’infrastruttura, usa il target destroy:
pnpm nx destroy tf-infrayarn nx destroy tf-infranpx nx destroy tf-infrabunx nx destroy tf-infraDistruzione Risorse Bootstrap
Sezione intitolata “Distruzione Risorse Bootstrap”Per eliminare le risorse bootstrap (bucket S3 per lo 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 maggiori informazioni su Terraform, consulta la Documentazione Terraform e la Documentazione AWS Provider.