Provisjonere infrastruktur med Terraform
Et vanlig brukstilfelle med Terraform i Github Actions er å provisjonere infrastruktur. For eksempel kan dette være å opprette servicekontoer i GCP, lage lagringsbøtter og gi servicekontoer tilgang til disse.
Hjelp, jeg har ingen erfaring med Terraform!
Ingen fare - Terraform er enkelt å komme i gang med. Hashicorp, firmaet bak Terraform, har mange tutorials som hjelper deg i gang. Det finnes også mange repoer i Kartverkets organisasjon på Github som gjør bruk av Terraform som det er mulig å hente inspirasjon fra, i tillegg til en del gjenbrukbare moduler i SKIPS eget terraform-modules repo. Er du fortsatt i tvil? Spør på Slack i #gen-skip - hvis ikke vi kan hjelpe deg, finnes det mange knallflinke folk med kompetanse på TF blant brukerne våre.
Hvordan kommer jeg i gang?
Du trenger et infrastruktur-repo som inneholder Terraform-kode, konfigurasjon og Github Action for å kunne provisjonere opp GCP-infrastruktur. For å opprette GCP-ressurser bruker vi Googles egen provider, som støtter de fleste av Googles tjenester. Github Action kjøres med deploy-serviceaccount som er opprettet for de fleste prosjekter med formål å deploye applikasjonen.
Hvis denne deploy-kontoen ikke eksisterer ennå kan du opprette en ved å lage en pull request i dette repoet: https://github.com/kartverket/gcp-service-accounts. I resources.yaml fila i dette repoet defineres det opp produkt, hvilke GCP-prosjekter det gjelder, hvilke Github-repositories det skal gjelde for, samt hvilke roller deploy-servicekontoen trenger for å opprette ressurser i GCP. Hvilke roller denne deploykontoen trenger avhenger av hvilke ressurser man ønsker å opprette, ofte vil de være på admin-nivå - typiske roller man trenger vil være:
- Oppretting av bøtter -
roles/storage.admin - Administere rettigheter til andre brukere og servicekontoer -
roles/iam.securityAdmin - Administrering av WIF -
roles/iam.workloadIdentityPoolAdmin - Impersonate for WIF -
roles/iam.workloadIdentityUser
Du kan bruke Googles dokumentasjon på denne siden for å søke deg fram til riktige roller.
Hvis du trenger å teste terraform-koden ved å kjøre terraform plan lokalt, så vil dette i utgangspunktet feile fordi du kjører som egen bruker istedenfor deploykontoen.
Du kan impersonate deploykontoen ved å sette en env-variabel for dette på denne måten: GOOGLE_IMPERSONATE_SERVICE_ACCOUNT="<team/produkt>-deploy@<prosjekt-id>.iam.gserviceaccount.com terraform plan
Husk at du må være autentisert mot gcloud for å kjøre Terraform-kommandoer, så sørg for å¨ logg deg inn med gcloud auth application-default login.
Man må også bruke deploy-sa-user under PAM i prosjektet som tilhører deploy-kontoen for at det skal fungere - se Hvordan bruke PAM
For eksempler på hvordan dette kan settes opp med tanke på opprettelse av bl.a. lagringsbøtter i GCP, se vårt terraform-modules repository på Github - modulen cloud_storage inneholder noen gode eksempler og kan også brukes i egen kildekode som modul. Se også Googles dokumentasjon av terraform-provider for utvidet dokumentasjon og eksempler. Vi legger ikke føringer på hvordan infrastruktur-repo struktureres ut over det som er best practice for Kartverket generelt og Terraform spesielt. Noen hete tips er:
- Unngå bruk av workspaces, bruk mapper for ulike miljøer i stedet
- Samle kode som gjenbrukes på tvers av miljøer i egne moduler som kan importeres ved behov.
- Les output av "terraform plan" nøye før du godkjenner kjøring av en Github Action, så du ikke kommer i skade for å slette og gjenopprette ressurser ved endringer.'
Når det gjelder workflows for kjøring av selve Terraform-koden i Github, anbefaler vi vår egen run-terraform workflow. I tillegg bør selve github-repoet beskyttes mot utilsiktede endringer - se denne Confluence-siden for hvilke tiltak som bør gjennomføres som et minimum.