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 | - | 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. |
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
- 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": { "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 Stato Remoto (Solo Progetti Applicazione)
Sezione intitolata “Bootstrap Stato Remoto (Solo Progetti Applicazione)”Per i 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 run tf-infra:bootstrapyarn nx run tf-infra:bootstrapnpx nx run tf-infra:bootstrapbunx nx run tf-infra:bootstrapTarget 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 run tf-infra:validateyarn nx run tf-infra:validatenpx nx run tf-infra:validatebunx nx run tf-infra:validateFormattazione del Codice
Sezione intitolata “Formattazione del Codice”Formatta il codice Terraform con il target fmt:
pnpm nx run tf-infra:fmtyarn nx run tf-infra:fmtnpx nx run tf-infra:fmtbunx nx run tf-infra:fmtTest di Sicurezza
Sezione intitolata “Test di Sicurezza”Esegui controlli di sicurezza sull’infrastruttura con Checkov usando il target test:
pnpm nx run tf-infra:testyarn nx run tf-infra:testnpx nx run tf-infra:testbunx nx run tf-infra:testTroverai 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 run tf-infra:planyarn nx run tf-infra:plannpx nx run tf-infra:planbunx nx run tf-infra:planQuesto 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 run tf-infra:applyyarn nx run tf-infra:applynpx nx run tf-infra:applybunx nx run tf-infra:applyOttenere Output
Sezione intitolata “Ottenere Output”Recupera i valori di output dalla configurazione Terraform:
pnpm nx run tf-infra:outputyarn nx run tf-infra:outputnpx nx run tf-infra:outputbunx nx run tf-infra:outputDistruzione Infrastruttura
Sezione intitolata “Distruzione Infrastruttura”Per eliminare l’infrastruttura, usa il target destroy:
pnpm nx run tf-infra:destroyyarn nx run tf-infra:destroynpx nx run tf-infra:destroybunx nx run tf-infra:destroyDistruzione Risorse Bootstrap
Sezione intitolata “Distruzione Risorse Bootstrap”Per eliminare le risorse bootstrap (bucket S3 per lo stato):
pnpm nx run tf-infra:bootstrap-destroyyarn nx run tf-infra:bootstrap-destroynpx nx run tf-infra:bootstrap-destroybunx nx run tf-infra:bootstrap-destroyUlteriori Informazioni
Sezione intitolata “Ulteriori Informazioni”Per maggiori informazioni su Terraform, consulta la Documentazione Terraform e la Documentazione AWS Provider.