Infrastruttura Terraform
Terraform è uno strumento software open-source per l’infrastruttura come codice 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 migliori pratiche 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:
- 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-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
Puoi anche eseguire una prova per vedere quali file verrebbero modificati
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
Opzioni
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 tipo 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 delle variabili di input
- outputs.tf Definizioni dei valori di output
Directoryenv File di variabili specifici per ambiente
- dev.tfvars Variabili per ambiente di sviluppo
Directorybootstrap Configurazione bootstrap per lo stato remoto
- main.tf Bucket S3 e politiche per lo storage dello stato
- providers.tf Configurazione provider AWS
- variables.tf Definizioni delle variabili bootstrap
- project.json Configurazione del progetto e target di build
Tipo Libreria
Sezione intitolata “Tipo Libreria”Per progetti di tipo libreria (--type=library
), il generatore crea una struttura più semplice per moduli Terraform riutilizzabili:
Directorysrc
- main.tf File principale del modulo Terraform
- 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
, 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 libreria.
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/<ambiente>.tfvars
con le variabili specifiche e aggiungi nuove voci per apply, destroy, init, plan
nel project.json
per la nuova configurazione ambiente. Ad esempio, supponiamo di voler aggiungere un ambiente prod
:
# Variabili per 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=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 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:bootstrap
yarn nx run tf-infra:bootstrap
npx nx run tf-infra:bootstrap
bunx nx run tf-infra:bootstrap
Target Disponibili
Sezione intitolata “Target Disponibili”I target disponibili dipendono dal tipo di progetto:
Target Comuni (Sia Applicazione che Libreria)
Sezione intitolata “Target Comuni (Sia Applicazione che Libreria)”Convalida dell’Infrastruttura
Sezione intitolata “Convalida dell’Infrastruttura”Puoi convalidare la configurazione Terraform con il target 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
Formattazione del Codice
Sezione intitolata “Formattazione del Codice”Formatta il codice Terraform con il target 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
Test di Sicurezza
Sezione intitolata “Test di Sicurezza”Esegui controlli di sicurezza sull’infrastruttura con Checkov usando il target 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
Troverai 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:plan
yarn nx run tf-infra:plan
npx nx run tf-infra:plan
bunx nx run tf-infra:plan
Questo creerà un file di pianificazione 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:init
yarn nx run tf-infra:init
npx nx run tf-infra:init
bunx nx run tf-infra:init
Deploy 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:apply
yarn nx run tf-infra:apply
npx nx run tf-infra:apply
bunx nx run tf-infra:apply
Ottenere Output
Sezione intitolata “Ottenere Output”Recupera i valori di output dalla configurazione 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
Distruzione Infrastruttura
Sezione intitolata “Distruzione Infrastruttura”Per eliminare l’infrastruttura, usa il target 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
Distruzione Risorse Bootstrap
Sezione intitolata “Distruzione Risorse Bootstrap”Per pulire le risorse bootstrap (bucket S3 per lo stato):
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
Ulteriori Informazioni
Sezione intitolata “Ulteriori Informazioni”Per maggiori informazioni su Terraform, consulta la Documentazione Terraform e la Documentazione AWS Provider.