Terraform: creare ZIP file in un lampo!

Sapevi che lavorando con Terraform hai modo di creare dei file ZIP in maniera semplice ed intuitiva? Nel corso di questo articolo, ti mostrerò come creali utilizzando una directory come sorgente oppure un singolo file. A dire il vero ti mostrerò come lavorare su più sorgenti e destinazione in un solo colpo! Credi sia complicato? Continua a leggere …

Terraform ZIP File

Prima di entrare nel vivo del contenuto tecnico, voglio spiegarti come mai ho realizzato questo articolo per il mio blog. L’esigenza di realizzare questo script Terraform è stata reale. Nonostante non dovessi creare una vera infra, mi sono trovato nella situazione di dovere condividere dei file per poi cancellarli una volta scaricati.

💡 Sapete come ho risolto? Creando un progetto Terraform dove al suo interno ho inserito:

  • Storage
  • Creazione di file zip
  • Upload dei files verso lo storage

Per quanto riguarda l’articolo, vi mostrerò esclusivamente come generare il file zip sfruttando due possibilità.

variable.tf

Il primo file che andremo a vedere è variable.tf dove ho definito tre variabili

  • output_zip_folder: la cartella destinazione dove salvare i file zip
  • folders_to_zip: dictionary key/ value dove indicare l’elenco di folder che dovranno essere “zippate” e la key è il nome del file zip
  • files_to_zip: dictionary key/ value dove indicare l’elenco di files che dovranno essere “zippati” e la key è il nome del file zip

Ho inserito dei default per semplificarvi la vita

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
variable "output_zip_folder" {
  type     = string
  nullable = false
  default  = "zip-folder"
}


variable "folders_to_zip" {
  type = map(any)
  default = {
    "folder-a" : "main-folder/folder-a"
    "folder-b" : "main-folder/folder-b"
  }
}

variable "files_to_zip" {
  type = map(any)
  default = {
    "file-a-one" : "main-folder/folder-a/file-a"
    "file-b-one" : "main-folder/folder-a/file-b"
    "file-b-one" : "main-folder/folder-b/file-a"
    "file-b-one" : "main-folder/folder-b/file-b"    
  }
}

main.tf

All’interno del main.tf ho inserito due blocchi data di tipo archive_file.

1
2
3
4
5
6
data "archive_file" "folder_zip" {
  for_each    = var.folders_to_zip
  type        = "zip"
  source_dir  = "${path.module}/${each.value}"
  output_path = "${path.module}/${var.output_zip_folder}/${each.key}.zip"
}

La risorsa folder_zip andrà a creare una serie di file zip partendo dalla mappa definita in folders_to_zip.

1
2
3
4
5
6
data "archive_file" "file_zip" {
  for_each    = var.files_to_zip
  type        = "zip"
  source_file = "${path.module}/${each.value}"
  output_path = "${path.module}/${var.output_zip_folder}/${each.key}.zip"
}

La risorsa file_zip andrà a creare una serie di file zip partendo dalla mappa definita in files_to_zip.

❓ Dove verranno salvati questi file? Combinando l’uso di path.module e var.output_zip_folder andremo ad ottenere il path finale per il nostro file zip.

Note Finali

Ora non vi resterà che provare il tutto e procedere al caricamento dei file verso lo storage per poi condividere i link.

Sapete la comodità di usare Terraform? Ho creato tutto al volo con un nome random grazie al comando terraform apply ed una volta scaricati tramite il terraform destroy andrò a ripulire il mio ambiente cloud.

Lo ammetto, sono pigro e non amo fare manualmente queste operazioni.

♻️ Conoscevi questo trucco? Condividilo con amici!