Skip to main content

Terraform

Hva er Terraform?

Å sette opp infrastruktur manuelt i GCP er tidkrevende og vanskelig å reprodusere, spesielt på tvers av flere miljøer. For å automatisere oppsett av infrastruktur bruker vi derfor Terraform fra HashiCorp, et verktøy for "Infrastructure as Code". Alle ressurser blir definert i Terraform-filer (.tf), sjekkes inn i Git, og kan parameteriseres med ulike variabler per miljø.

Terraform brukes av Google selv, og det finnes mange gode ressurser for å lære seg Terraform:

Fordeler med Terraform:

  • Infrastruktur blir reprodusertbart på tvers av miljøer
  • Man får bedre oversikt over hvilke endringer som utføres på infrastruktur
  • Man kan ta i bruk ferdige moduler for sett med ressurser som ofte hører sammen, eller som alltid konfigureres på et gitt vis. Se for eksempel repoet 'terraform-modules' (krever innlogging).

Terragrunt

Når man har mange ulike Terraform-moduler kan det bli mye boilerplate. Det er også ønskelig å kunne enkelt skifte mellom ulike miljøer. Terragrunt er et lite verktøy som wrapper Terraform med støtte for genererte filer, miljøvariabler og felles oppsett.

saga-team-template

Vi har laget et mal-repo, saga-team-template (krever innlogging), som benytter Terraform for å sette opp en enkel ingest-pipeline. Her benyttes også Terragrunt, for å hente ut og samle felles oppsett.

Det anbefales å se på repoet for bruk av Terraform og Terragrunt, og gjerne prøv å sette opp pipelinen selv for ditt prosjekt.

Import av eksisterende infrastruktur til Terraform

Det er mulig å importere enkeltressurser som har blitt opprettet utenfor Terraform. Dette gjøres ved å først skrive Terraform-koden som vanlig, deretter kjøre terraform import eller terragrunt import.

Dersom man er usikker på hvordan Terraform-koden skal skrives, eller har et mer omfattende oppsett med mange ressurser man ønsker å få inn i Terraform, kan man benytte terraformer fra Google: et CLI som lar deg spesifisere prosjekt og hvilke ressurstyper som skal importeres, og genererer Terraform-kode for disse.

Alternativer til Terraform

Terraform kan virke avskrekkende og av og til overkill. Når trenger man ikke Terraform?

  • I en utforskingsperiode kan det være bedre å lage ressurser direkte i GCP Console. Dette har man tilganger til å gjøre i teamets egne STM-prosjekt, samt i ditt personlige utvikler-sandbox-prosjekt. Bare husk at disse må ryddes opp manuelt også.
  • Av og til har man behov for å opprette ressurser dynamisk/programmatisk, for eksempel en ingest-pipeline som lager nye midlertidige BigQuery-tabeller. I disse tilfellene gjøres endringene av Service Account'en som pipelinen bruker, og denne må ha fått tildelt tilganger til å opprette ressurser.
  • Ved andre behov, kontakt plattformteamet Yggdrasil på Slack: #saga-support.

Dersom man ønsker å beskrive infrastruktur i et kjent kodespråk som TypeScript, Java eller Python, heller enn Terraforms deklarative HCL-syntaks, finnes det to muligheter for dette:

  • Cloud Development Kit for Terraform (CDKTF) - HashiCorps egen løsning for å kunne skrive kode som genererer Terraform-oppsett. Fremdeles i preview, men virker lovende.
  • Pulumi - Konkurrerende verktøy for Infrastructure as Code, med støtte for en rekke kodespråk. Vi har ingen erfaring med Pulumi, men tar gjerne imot synspunkter og erfaringer.