Your web browser is out of date. Update your browser for more security, speed and the best experience on this site.

Zo zet je een eigen Terraform provider op

Toen Axxes-consultant Sander Descamps geen Terraform provider vond die hem kon helpen, besloot hij die zelf te bouwen. Op Haxx gaf hij een demo om te tonen hoe zoiets moet.

Deel dit artikel
Infrastructure
Terraform1

Wie al eens een infrastructuur voor een applicatie moet bouwen, onderhouden of automatiseren, komt vroeg of laat met Terraform in contact. De infrastructuur-als-code-tool van Hashicorp gebruik je onder andere voor fysieke machines, containers en netwerkswitches. Enerzijds focus je daarbij op je eigen platform, maar ook op de services die op dat platform draaien.

Terraform is declaratief: je beschrijft je doel, en de tool zal zelf nagaan hoe je dat kan bereiken. Cruciaal daarbij zijn de providers, die de brug vormen tussen Terraform en de verschillende services en API's die je wil beheren. Dankzij die providers kan je resources beheren binnen een specifieke technologie of service provider, zoals een cloud- of SaaS-provider.

Sander Descamps, consultant bij Axxes, kent de tools uiteraard door en door. Zo werkt hij momenteel als Site Reliability Engineer op een project bij Worldline, waar men zo veel mogelijk taken wil automatiseren. Sander en zijn collega’s gebruiken Terraform providers onder andere om de opslag van gegevens te automatiseren. Doordat er weinig degelijke providers beschikbaar waren die het team daarbij konden helpen, besloten ze die zelf te ontwikkelen. Op onze conferentie Haxx vertelde Sander hoe ze dat precies deden.

Terraform2

De basics van Terraform providers

Terraform providers zijn bijna exclusief in Go geschreven. De gecompileerde Go binaries zorgen ervoor dat Terraform op een betrouwbare, veilige en efficiënte manier kan integreren met een breed scala aan technologieën en platforms. Ze zijn standalone, en dat zijn ze niet zomaar, zegt Sander. In Golang kan je namelijk niet code dynamisch inladen, zoals dat bij Python wel het geval is.

Terraform maakt gebruik van providers als plugins om te communiceren met externe API's via remote procedure calls (RPC's). Het gaat specifiek over gRPC, een high performance RPC framework gebaseerd op HTTP/2 en Protocol Buffers. Deze setup stelt Terraform in staat om te functioneren als een client die gRPC-calls naar de provider plugins doet, die op hun beurt communiceren met clouddiensten zoals AWS en Google Cloud om infrastructuur te beheren.

Providers, die als afzonderlijke processen draaien, definiëren hun services en methoden in .proto-bestanden. Ze ontvangen de configuratie en authenticatie-informatie van Terraform, waarmee ze resources creëren, wijzigen, of verwijderen. Dit systeem biedt efficiëntie, sterke typing, en taalonafhankelijkheid, wat bijdraagt aan de betrouwbaarheid en schaalbaarheid van Terraform's infrastructuurmanagement via code.

Terraform3

De opzet van een eigen provider

Er zijn verschillende interessante providers, van AWS en Azure tot Google Cloud Platform en Kubernetes. Maar wat doe je als je, zoals Sander, je eigen provider wil maken? Begin eerst door online na te gaan wat er al bestaat, want dat kan een goede basis zijn. Wat je ook nodig hebt is een API en een GoLang client, zodat je methodes kunt aanroepen in plaats van zelf je API calls te doen.

Om vervolgens effectief van start te gaan met het bouwen kun je beginnen met het voorbeeldproject op Github te klonen en van daaruit verder te werken. Dat doe je door je eerst stil te staan bij hoe je je resources wil verdelen en hoe je alles wil opbouwen, waarna je code en tests schrijft voor je alles implementeert.

Belangrijk voor je API calls zijn de CRUD-functies, of een gelijkaardig alternatief. CRUD staat voor Create, Read, Update en Delete. Dit zijn dus je standaardacties. Elke resource moet ook een ID hebben, dat is een statisch veld waarop je kan zoeken om resources terug te vinden.

Je API moet ook stabiel zijn, omdat Terraform geen concept als throttling heeft, waardoor je het aantal API calls per seconde zou kunnen limiteren. De GoLang client is dan weer nodig om je logica van je providerlogica te onderscheiden. Zo kan je zo veel mogelijk van je functionaliteit en complexiteit naar je client offloaden, zodat je de providercode eenvoudig kan houden. Ook je error handling en logging worden hierin gedefinieerd.

Om de provider te bouwen kan je een gewone SDK gebruiken. Een andere optie is Framework, dat Terraform een jaar geleden lanceerde. Toch zijn de meeste providers die je online vindt nog in SDKv2 geschreven.

Terraform4

Sander z’n demo en learnings

Het maken van een Terraform provider is een geavanceerd proces dat inzicht vereist in Go programmeren, het Terraform-ecosysteem, en de specifieke API's die je wilt integreren. Er is nog weinig documentatie voorhanden, dus is het belangrijk om bij andere providers te kijken wat je eventueel kan hergebruiken. Laat daarbij de grote spelers links liggen, want zij zijn doorgaans te complex. Providers van kleinere bedrijven kun je vaak makkelijker lezen.

Als je relaties legt tussen verschillende resources is het belangrijk dat in het Child-object de Parent wordt vermeld, en niet omgekeerd. Probeer unieke data ook niet te vervangen of er een nieuwe naam aan te geven, maar probeer je resource opnieuw te creëren als het nodig is.

Benieuwd naar de volledige demo waarin Sander toont hoe je praktisch aan de slag moet gaan? Laat dan hieronder je gegevens achter!

Axxes