Comprensione delle variabili Terraform, dei valori locali e degli output - AWS Guida prescrittiva

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Comprensione delle variabili Terraform, dei valori locali e degli output

Le variabili migliorano la flessibilità del codice consentendo l'inserimento di segnaposti all'interno di blocchi di codice. Le variabili possono rappresentare valori diversi ogni volta che il codice viene riutilizzato. Terraform distingue tra i suoi tipi di variabili in base al loro ambito modulare. Le variabili di input sono valori esterni che possono essere inseriti in un modulo, i valori di output sono valori interni che possono essere condivisi esternamente e i valori locali rimangono sempre all'interno del loro ambito originale.

Variables

AWS CloudFormation utilizza i parametri per rappresentare valori personalizzati che possono essere impostati e reimpostati da una distribuzione dello stack all'altra. Allo stesso modo, Terraform utilizza variabili di input o variabili. Le variabili possono essere dichiarate ovunque in un file di configurazione Terraform e di solito sono dichiarate con il tipo di dati richiesto o il valore predefinito. Tutte e tre le seguenti espressioni sono dichiarazioni di variabili Terraform valide.

variable "thing_i_made_up" { type = string } variable "random_number" { default = 5 } variable "dogs" { type = list(object({ name = string breed = string })) default = [ { name = "Sparky", breed = "poodle" } ] }

Per accedere alla razza di Sparky all'interno della configurazione, dovresti usare la variabile. var.dogs[0].breed Se una variabile non ha valori predefiniti e non è classificata come annullabile, il valore della variabile deve essere impostato per ogni distribuzione. Altrimenti, è facoltativo impostare un nuovo valore per la variabile. In un modulo root, puoi impostare i valori delle variabili correnti sulla riga di comando, come variabili di ambiente o nel file terraform.tfvars. L'esempio seguente mostra come inserire i valori delle variabili nel file terraform.tfvars, che è archiviato nella directory di primo livello del modulo.

# terraform.tfvars dogs = [ { name = "Sparky", breed = "poodle" }, { name = "Fluffy", breed = "chihuahua" } ] random_number = 7 thing_i_made_up = "Kabibble"

Il valore del file dogs terraform.tfvars di esempio sovrascriverebbe il valore predefinito nella dichiarazione della variabile. Se stai dichiarando variabili all'interno di un modulo figlio, puoi impostare i valori delle variabili direttamente all'interno del blocco di dichiarazione del modulo, come mostrato nell'esempio seguente.

module "my_custom_module" { source = "modulesource/custom" version = "0.0.1" random_number = 8 }

Alcuni degli altri argomenti che è possibile utilizzare per dichiarare una variabile includono:

  • sensitive- Impostandola per true evitare che il valore della variabile venga esposto negli output del processo Terraform. 

  • nullable— L'impostazione di questa opzione true consente alla variabile di non avere alcun valore. Ciò è utile per le variabili in cui non è impostato un valore predefinito.

  • description— Aggiungere una descrizione della variabile ai metadati dello stack.

  • validation— Imposta le regole di convalida per la variabile.

Uno degli aspetti più convenienti delle variabili Terraform è la possibilità di aggiungere uno o più oggetti di convalida all'interno della dichiarazione della variabile. È possibile utilizzare oggetti di convalida per aggiungere una condizione che la variabile deve superare, altrimenti la distribuzione fallisce. Puoi anche impostare un messaggio di errore personalizzato da mostrare ogni volta che la condizione viene violata.

Ad esempio, stai configurando un file di configurazione Terraform che verrà eseguito dai membri del tuo team. Prima di distribuire gli stack, un membro del team deve creare un file terraform.tfvars per impostare un valore di configurazione importante. Per ricordarglielo, puoi fare qualcosa di simile a quanto segue.

variable "important_config_setting" { type = string validation { condition = length(var.important_config_setting) > 0 error_message = "Don't forget to create the terraform.tfvars file!" } validation { condition = substr(var.important_config_setting, 0, 7) == "prefix-" error_message = "Remember that the value always needs to start with 'prefix-'" } }

Come mostrato in questo esempio, puoi impostare più condizioni all'interno di una singola variabile. Terraform mostra solo messaggi di errore per condizioni non riuscite. In questo modo, puoi applicare tutti i tipi di regole sui valori delle variabili. Se un valore variabile causa un errore nella pipeline, sapresti esattamente perché.

Valori locali

Se ci sono valori all'interno di un modulo a cui desideri assegnare un alias, usa la locals parola chiave anziché dichiarare una variabile predefinita che non verrà mai aggiornata. Come suggerisce il nome, un locals blocco contiene termini che rientrano nell'ambito interno di quel modulo specifico. Se desideri trasformare un valore di stringa, ad esempio aggiungendo un prefisso a un valore variabile da utilizzare nel nome di una risorsa, l'utilizzo di un valore locale potrebbe essere una buona soluzione. Un singolo locals blocco può dichiarare tutti i valori locali per il modulo, come illustrato nell'esempio seguente.

locals { moduleName = "My Module" localConfigId = concat("prefix-", var.important_config_setting) }

Ricorda solo che quando accedi al valore, la locals parola chiave diventa singolare, ad esempio. local.LocalConfigId

Valori di output

Se le variabili di input Terraform sono come CloudFormation i parametri, allora potresti dire che i valori di output di Terraform sono come CloudFormation gli output. Entrambi vengono utilizzati per esporre valori dall'interno di uno stack di distribuzione. Tuttavia, poiché il modulo Terraform è più radicato nella struttura dello strumento, i valori di output di Terraform vengono utilizzati anche per esporre i valori all'interno di un modulo a un modulo principale o ad altri moduli figlio, anche se tali moduli si trovano tutti all'interno dello stesso stack di distribuzione. Se stai creando due moduli personalizzati e il primo modulo deve accedere al valore ID del secondo modulo, dovrai aggiungere il blocco seguente output al secondo modulo.

output "module_id" { value = local.module_id } Then in the first module you could use it like this: module "first_module" { source = "path/to/first/module" } resource "example_resource" "example_resource_name" { module_id = module.first_module.module_id }

Poiché i valori di output di Terraform possono essere utilizzati all'interno dello stesso stack, puoi anche utilizzare l'sensitiveattributo in un output blocco per impedire che il valore venga visualizzato nell'output dello stack. Inoltre, un output blocco può utilizzare i precondition blocchi nello stesso modo in cui le variabili utilizzano i validation blocchi: per garantire che le variabili seguano un determinato insieme di regole. Questo aiuta a garantire che tutti i valori all'interno di un modulo esistano come previsto prima di procedere con la distribuzione.

output "important_config_setting" { value = var.important_config_setting precondition { condition = length(var.important_config_setting) > 0 error_message = "You forgot to create the terraform.tfvars file again." } }