Salta ai contenuti

Infrastruttura Terraform

Filter this guidePick generator option values to hide sections that don't apply.

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.

Puoi generare un nuovo progetto Terraform in due modi:

Terminal window
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra
Puoi anche eseguire una prova per vedere quali file verrebbero modificati
Terminal window
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
ParametroTipoPredefinitoDescrizione
name Obbligatoriostring-Il nome del progetto.
type application | libraryapplicationSe si tratta di una libreria terraform (moduli riutilizzabili) o di un'app (distribuibile).
directory stringpackagesLa directory del nuovo progetto.
subDirectory string-La sottodirectory in cui viene posizionato il progetto. Per impostazione predefinita corrisponde al nome del progetto.
preferInstallDependencies booleantrueSe 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.

Il generatore crea diverse strutture di file a seconda del tipo di progetto:

type = 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 bootstrap e init
    • 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 init con la configurazione del backend S3
  • project.json Configurazione del progetto e target di build
type = 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

Puoi iniziare a scrivere la tua infrastruttura Terraform all’interno di src/main.tf, per esempio:

src/main.tf
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 here
resource "aws_s3_bucket" "my_bucket" {
bucket = "my-unique-bucket-name"
}

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.

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 variables
environment = "prod"
region = "us-west-2"
type = application

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:

Terminal window
pnpm nx bootstrap tf-infra

I target disponibili dipendono dal tipo di progetto:

Puoi validare la tua configurazione Terraform utilizzando il target validate:

Terminal window
pnpm nx validate tf-infra

Formatta il tuo codice Terraform utilizzando il target fmt:

Terminal window
pnpm nx fmt tf-infra

Esegui controlli di sicurezza sulla tua infrastruttura utilizzando Checkov con il target test:

Terminal window
pnpm nx test tf-infra

Troverai i risultati dei test di sicurezza nella cartella dist principale, sotto dist/packages/<my-terraform-project>/checkov.

type = application

I seguenti target sono disponibili solo per i progetti di tipo application:

Prima di applicare le modifiche, puoi vedere cosa farà Terraform eseguendo il target plan:

Terminal window
pnpm nx plan tf-infra

Questo creerà un file di piano in dist/packages/<my-terraform-project>/terraform/dev.tfplan.

Inizializza la tua directory di lavoro Terraform con il target init:

Terminal window
pnpm nx run tf-infra:init

Dopo la pianificazione, puoi distribuire la tua infrastruttura su AWS utilizzando il target apply:

Terminal window
pnpm nx apply tf-infra

Recupera i valori di output dalla tua configurazione Terraform:

Terminal window
pnpm nx output tf-infra

Quando devi smantellare la tua infrastruttura, usa il target destroy:

Terminal window
pnpm nx destroy tf-infra

Per pulire le risorse di bootstrap (bucket S3 per l’archiviazione dello stato):

Terminal window
pnpm nx bootstrap-destroy tf-infra

Per ulteriori informazioni su Terraform, consulta la Documentazione Terraform e la Documentazione del provider AWS.