Usare Terraform import

banner

Dopo l’ennesimo bucket creato a mano, hai convinto il tuo manager. Finalmente comincerete a utilizzare Terraform per il provisioning e la gestione dell’infrastruttura cloud.
Tutto tranquillo: c’è un team dedicato, avete già installato in locale e creato lo stato remoto… perfetto!

E mentre sembra che vada tutto fin troppo liscio, proprio in questo momento ti assale il dubbio: come faccio a portarmi dietro ciò che ho già creato a mano?

Fortunatamente, ci pensa terraform import.

Perché importare risorse esistenti nel Terraform state

Lasciare risorse fuori da Terraform crea un ambiente ibrido difficile da gestire.

Migrando le risorse all’interno dello .tfstate otteniamo invece diversi vantaggi:

  • Single Source of Truth (SSOT): Se metà infrastruttura è su Terraform e l’altra metà è nella testa di chi l’ha creata (o persa tra mille click sulla console AWS), non hai mai una visione reale dello stato del sistema. Importare tutto ti dà un unico punto di verità.

  • Rilevamento del Drift: Una volta importata la risorsa, Terraform sa come dovrebbe essere. Se qualcuno modifica manualmente quel bucket S3 domani, al prossimo terraform plan vedrai immediatamente la discrepanza (Drift).

  • Riproducibilità e Disaster Recovery: Se cancelli per sbaglio una risorsa manuale, auguri a ricrearla identica (ricordi quel flag specifico che avevi attivato 6 mesi fa?). Se è in Terraform, basta un terraform apply.

Come importare: ieri vs. oggi

Fino a poco tempo fa, l’importazione era un tedioso processo a due step che poteva spaventare a prima vista:

  1. Scrivere manualmente il codice HCL della risorsa (sperando di azzeccare i parametri).

  2. Lanciare il comando CLI terraform import per mappare l’ID reale alla risorsa nel codice.

La buona notizia? Dalla versione 1.5, Terraform ha reso tutto tremendamente più semplice.

Il blocco import (non il comando!)

Invece di usare comandi imperativi nella CLI, definiamo l’intenzione di importare direttamente nel codice.
Ora possiamo utilizzare un approccio dichiarativo.

Per questa dimostrazione prendiamo come esempio un bucket creato dalla console, chiamato s3-creato-a-mano.

Ecco come ce lo portiamo a casa:

![]/(/images/blog/9h3L8aK.png)

Definiamo il blocco import

In un file .tf dedicato (oppure ovunque vuoi, siccome è un’azione una-tantum), aggiungi questo blocco:

import {
  to = aws_s3_bucket.s3-creato-a-mano
  id = "s3-creato-a-mano"  # arn-senza-boilerplate arn:aws:s3:::s3-creato-a-mano
}
  • to: È il nome che vuoi dare alla risorsa dentro Terraform.

  • id: È l’identificativo univoco della risorsa sul cloud (per S3 è il nome del bucket, per una EC2 è l’instance-id, ecc.).

Generiamo il codice terraform per la risorsa

Non lanciamo terraform plan a manetta aggiungendo man mano ciò che manca, come si faceva prima.
Una volta definito il blocco import, lancia questo comando:

terraform plan -generate-config-out=s3-creato-a-mano.tf

Terraform si connetterà ad AWS, leggerà la configurazione attuale del bucket e scriverà automaticamente il codice HCL necessario nel file s3-creato-a-mano.tf.

Aprendo il file appena generato, troviamo la definizione completa della risorsa aws_s3_bucket.

resource "aws_s3_bucket" "s3-creato-a-mano" {
  bucket              = "s3-creato-a-mano"
  force_destroy       = false
  object_lock_enabled = false
  region              = "eu-west-1"
  tags                = {}
  tags_all            = {}
}

Mi raccomando, controlla sempre che tutto abbia senso, ripulendo eventuali attributi deprecati o non necessari prima di rendere tutto ufficiale.

Applichiamo le modifiche, aggiungendo effettivamente la risorsa nello stato

terraform apply

Ed è fatta! Il bucket “artigianale” è ora ufficialmente sotto la gestione di Terraform.

Il blocco import può essere rimosso una volta completata l’operazione, poiché lo stato è ormai aggiornato.

terraform state list
> aws_s3_bucket.s3-creato-a-mano

Conclusioni: meglio tardi che mai, in entrambi i casi

Quando Terraform genera il codice per noi importa tutto pari-pari, incluse configurazioni sporche, tag obsoleti o impostazioni di sicurezza precarie impostate ’temporaneamente’ mesi fa.
Il processo di importazione è l’occasione perfetta per chiedersi: ‘Mi serve davvero questo permesso pubblico su S3?’

Possiamo usare la fase di review del codice generato non soltanto per validarlo ma per fare refactoring, cogliendo l’occasione per migliorarlo.

Non lasciare che il debito tecnico dell’infrastruttura manuale ti spaventi.
Con i nuovi strumenti a disposizione, migrare risorse dentro lo stato di Terraform è diventato esponenzialmente più semplice.

TheRedCode.it - Il mondo #tech a piccoli #bit

Partners

Community, aziende e persone che supportano attivamente il blog

Logo di Welyk
Logo di GrUSP
Logo di Python Milano
Logo di Schrodinger Hat
Logo di Python Biella Group
Logo di Fuzzy Brains
Logo di Django Girls Italy
Logo di Improove
Logo de Il Libro Open Source
Logo di NgRome
Logo de La Locanda del Tech
Logo di Tomorrow Devs
Logo di DevDojo

Vuoi diventare tech content creator? 🖊️

Se ti va di raccontare la tua esperienza nel mondo tech, questo è il posto giusto.

Cerchiamo voci autentiche, esempi pratici e punti di vista utili per chi legge.

Scrivici a collaborazioni[at]theredcode.it con una proposta: idea, taglio del contenuto e una breve presentazione. Non vediamo l'ora di leggere la tua esperienza!

Invia la tua idea