Best practice per la conversione a Terraform
Stato
Il file di stato memorizza le informazioni sulle risorse gestite da Terraform. Per impostazione predefinita, Terraform archivia lo stato localmente sul disco. Se archivi lo stato in remoto, puoi consentire la collaborazione distribuita, difendere le informazioni sensibili ed eseguire Terraform in un ambiente di integrazione continua (CI).
Dopo aver convertito il modello Deployment Manager in Terraform e, facoltativamente, importato le risorse, ti consigliamo di seguire i passaggi per archiviare lo stato in remoto in Cloud Storage.
Moduli
Se vuoi ridurre la complessità, applicare la coerenza e promuovere la riutilizzabilità della tua configurazione, puoi utilizzare i moduli Terraform per incapsulare raccolte di risorse.
Per utilizzare i moduli, puoi procedere in uno dei seguenti modi:
Crea un modulo personalizzato dalle risorse esportate da DM Convert. In questo modo avrai la massima flessibilità.
Utilizza un modulo pubblicato dalla raccolta di moduli ufficiali di Google Cloudo dal registro Terraform.
Per la maggior parte dei casi d'uso, ti consigliamo di utilizzare un modulo pubblicato.
Creare un modulo personalizzato
Dopo aver convertito la configurazione, identificate le risorse che volete spostare in un modulo.
Sposta le configurazioni di queste risorse in una directory del modulo e converti le variabili richieste in parametri.
L'esempio seguente mostra come spostare
google_bigquery_dataset
egoogle_bigquery_table
in un modulo:# bq-module/main.tf resource "google_bigquery_dataset" "bigquerydataset" { provider = google-beta default_table_expiration_ms = 36000000 location = "us-west1" dataset_id = var.dataset_id project = var.project_id } resource "google_bigquery_table" "bigquerytable" { provider = google-beta labels = { data-source = "external" schema-type = "auto-junk" } dataset_id = var.dataset_id project = var.project_id table_id = var.table_id depends_on = [ google_bigquery_dataset.bigquerydataset ] }
# bq-module/variables.tf variable "project_id" { description = "Project ID" type = string } variable "dataset_id" { description = "Dataset ID" type = string } variable "table_id" { description = "Table ID" type = string }
Nel file
main.tf
esportato, sostituisci la configurazione originale con il modulo che hai creato.L'esempio seguente mostra questa sostituzione utilizzando il modulo creato nell'esempio del passaggio precedente.
# main.tf module "bq" { source = "./bq-module" project_id = "PROJECT_ID" dataset_id = "bigquerydataset" table_id = "bigquerytable" }
Per inizializzare il modulo locale, esegui il seguente comando:
terraform init
Sposta lo stato Terraform associato alle risorse nell'istanza del modulo.
Per spostare il modulo dall'esempio nel passaggio precedente, esegui il seguente comando:
terraform state mv google_bigquery_dataset.bigquerydataset module.bq.google_bigquery_dataset.bigquerydataset terraform state mv google_bigquery_table.bigquerytable module.bq.google_bigquery_table.bigquerytable
Per questo esempio, l'output dello spostamento è:
Move "google_bigquery_dataset.bigquerydataset" to "module.bq.google_bigquery_dataset.bigquerydataset" Successfully moved 1 object(s). Move "google_bigquery_table.bigquerytable" to "module.bq.google_bigquery_table.bigquerytable" Successfully moved 1 object(s).
Verifica che nessuna risorsa sia cambiata eseguendo il seguente comando:
terraform plan
Di seguito è riportato un esempio dell'output visualizzato dopo l'esecuzione del comando:
No changes. Your infrastructure matches the configuration.
Utilizzare un modulo pubblicato
Dopo aver convertito la configurazione, identifica un modulo pubblicato e le risorse che vuoi spostare al suo interno.
Identifica le opzioni di configurazione per il modulo leggendo la relativa documentazione.
Crea un'istanza del modulo configurato in base alla configurazione delle risorse attuale.
Ad esempio, se vuoi spostare
google_bigquery_dataset
egoogle_bigquery_table
nel modulo BigQuery ufficiale, il seguente esempio mostra come potrebbe essere il tuo modulo:module "bq" { source = "terraform-google-modules/bigquery/google" version = "~> 5.0" project_id = "PROJECT_ID" dataset_id = "bigquerydataset" location = "us-west1" deletion_protection = true tables = [ { table_id = "bigquerytable", friendly_name = "bigquerytable" time_partitioning = null, range_partitioning = null, expiration_time = null, clustering = [], schema = null, labels = { data-source = "external" schema-type = "auto-junk" }, } ] }
Per inizializzare il modulo locale, esegui il seguente comando:
terraform init
Leggi il codice sorgente del modulo per identificare gli indirizzi delle risorse all'interno del modulo a monte e per creare i comandi move.
terraform state mv google_bigquery_dataset.bigquerydataset module.bq.google_bigquery_dataset.main terraform state mv google_bigquery_table.bigquerytable 'module.bq.google_bigquery_table.main["bigquerytable"]'
Per visualizzare eventuali modifiche alla configurazione, esegui il seguente comando:
terraform plan
Se il modulo pubblicato selezionato ha impostazioni predefinite diverse o è configurato in modo diverso rispetto alla tua configurazione, potresti notare delle differenze evidenziate nell'output dell'esecuzione del comando.
Attivazione
Ti consigliamo di utilizzare un sistema di integrazione continua (CI), come Cloud Build, Jenkins o GitHub Actions, per automatizzare l'esecuzione di Terraform su larga scala. Per saperne di più, consulta Gestione dell'infrastruttura come codice con Terraform, Cloud Build e GitOps.
Se vuoi avviare la creazione di trigger e semplificare l'autenticazione, puoi scegliere di utilizzare il blueprint Spazio di lavoro Cloud Build.
Strutturazione
Ogni configurazione convertita da DM Convert è una singola configurazione principale mappata a un singolo file di stato. Non è consigliabile configurare un unico file di stato per contenere un numero elevato di risorse. Dopo aver convertito la configurazione, ti consigliamo di assicurarti che la nuova configurazione segua le best practice per i moduli principali.