Pinterest rakensi oman Terraform-moottorin – RPP rajaa pilvi-infran käyttöoikeuksia

Pinterestin moottori

Pinterest on esitellyt oman Terraform-suoritusjärjestelmänsä Resource Provisioner Pipelinen eli RPP. Sen tarkoituksena on hallita AWS-infrastruktuurin muutoksia nykyistä tiukemmin ja estää tilanteet, joissa CI/CD-järjestelmälle joudutaan antamaan tarpeettoman laajoja käyttöoikeuksia.

RPP toimii Pinterestin GitHub Actions -työnkulkujen yhteydessä ja hallitsee Terraform-työtiloja, joiden kautta ylläpidetään tuhansia pilviresursseja. Näihin kuuluvat esimerkiksi IAM-käytännöt, VPC-verkot, kuormantasaajat, S3-tallennustilat ja Kubernetes-klusterit.

Pinterestin Terraform-koodi sijaitsee tällä hetkellä useissa eri repositorioissa, joita hallitsevat eri tiimit. Yhtiö on siirtymässä kohti monorepo-rakennetta, mutta prosessi ei ole vielä valmis. RPP tehtävänä on tarjota turvallisempi tapa hallita nykyistä hajautettua rakennetta jo ennen migraation valmistumista.

Käyttöoikeudet rajataan työtilakohtaisesti

RPP käynnistyy GitHubin pull request -tapahtumista ja käyttää keskitettyjä GitHub Actions -toimintoja yksittäisiin repositorioihin sijoitettujen omien skriptien sijaan.

Kun pull request vaikuttaa useisiin Terraform-työtiloihin, RPP jakaa muutokset erillisiksi plan- ja apply-suorituksiksi.

Käyttöoikeuksien hallinta perustuu ketjutettuihin IAM-rooleihin. Työnkulku ottaa ensin käyttöön keskitetyn RPPActionsRole-roolin. Sen käyttö on rajattu ennalta hyväksyttyihin GitHub-työnkulkuihin OIDC-tunnisteiden tarkistamisen avulla.

Tämän jälkeen järjestelmä lukee keskitetystä määritystiedostosta, mikä repositorio, hakemisto, omistava tiimi ja IAM-rooli kuuluvat kyseiselle Terraform-työtilalle.

RPP tarkistaa myös, että Terraform-koodin käyttämä backend vastaa työtilalle määritettyä S3-tallennustilaa ja KMS-avainta. Tarkistuksen tarkoituksena on estää esimerkiksi tilanne, jossa yhden työtilan Terraform-koodi yhdistetään vahingossa toisen työtilan state-tiedostoon.

Vasta tarkistusten jälkeen järjestelmä ottaa käyttöön työtilalle määritetyn rajatun IAM-roolin.

Terraform-muutokset vaativat kaksi ihmisen tekemää vaihetta

RPP suorittaa automaattisesti muun muassa Terraformin fmt- ja plan-komennot, mutta varsinaisia infrastruktuurimuutoksia ei tehdä pelkän pull requestin perusteella.

Koodimuutos tarvitsee ensin hyväksynnän kyseisen repositorion hyväksytyltä tarkastajalta. Lisäksi apply-vaihe käynnistyy vasta erillisellä kommentilla pull requestissa.

Pinterest käyttää näin kaksivaiheista ihmisen tekemää kontrollia ennen varsinaisten muutosten suorittamista. Plan- ja apply-vaiheet pysyvät samalla erillisinä ja jäljitettävinä tapahtumina.

Keskitetyn rakenteen etuna on myös se, että pipelineen liittyvät turvallisuusongelmat voidaan korjata yhdestä paikasta. Muutosta ei tarvitse tehdä erikseen jokaisen tiimin Terraform-repositorioon.

Mukana myös automaattisia turvallisuustarkistuksia

RPP voi suorittaa Terraform-muutoksille muitakin tarkistuksia ennen niiden viemistä AWS-ympäristöön.

Pinterest käyttää esimerkiksi omia Semgrep-sääntöjä staattiseen analyysiin sekä tekoälyavusteista koodin tarkistusta. Muutoksia voidaan lisäksi testata LocalStackin avulla simuloidussa AWS-ympäristössä ennen oikeisiin pilviresursseihin koskemista.

RPP ei ole avoimen lähdekoodin projekti. Sen käyttämät perusratkaisut, kuten OIDC-pohjainen tunnistautuminen, IAM-roolien ketjuttaminen ja työtilakohtaiset käyttöoikeudet, perustuvat kuitenkin yleisesti saatavilla oleviin teknologioihin.

Pinterestin ratkaisussa erityisen keskeinen osa on Terraform-backendin tarkistaminen ennen työtilakohtaisen IAM-roolin käyttöönottoa. Näin käyttöoikeuksien rajaamisen lisäksi pyritään estämään eri työtilojen state-tiedostojen sekoittuminen.

Ratkaisu antaa Pinterestille mahdollisuuden jatkaa useisiin repositorioihin hajautetun Terraform-infrastruktuurin käyttöä samalla, kun yhtiö etenee kohti keskitetympää rakennetta ja ohjelmistoa.