Essen­zi­elle Grund­lage für Cloud DevOps

Das DevOps-Arbeits­mo­dell und Metho­di­ken stei­gern die Qua­li­tät und beschleu­ni­gen die Ent­wick­lung eines Pro­dukts. Wich­tige Bestand­teile von DevOps sind Ver­si­ons­ver­wal­tung von Code (oder GitOps) und CI/CD Pipe­line zum auto­ma­ti­sier­ten Tes­ten und pro­duk­ti­ven Bereit­stel­len neuer Features. 

Durch Ange­bote von Cloud Pro­vi­dern in den Berei­chen Infrastructure‑, Platt­form- und Soft­ware-as-a-Ser­vice kann die grund­lie­gende Infrastruktur schnell und bei­nah unbe­grenzt pro­vi­sio­niert wer­den. Viele Cloud Pro­vi­der erlau­ben es, Infrastruktur als Code (IaC) zu defi­nie­ren und somit kann nun auch die erfor­der­li­che Infrastruktur in die Ver­si­ons­ver­wal­tung und auto­ma­ti­schen CI/CD Pro­zesse inklu­diert wer­den. IaC in der Kom­bi­na­tion mit DevOps bringt meh­rere bedeut­same Vor­teile für Infrastruktur in den fol­gen­den Punkten: 

  • Ver­sio­nie­rung und Wiederverwendung 
  • Schnelle Bereit­stel­lung und Anpassung 
  • Auto­ma­ti­sierte Tests 
  • Ver­mei­dung von manu­el­len Konfigurationsfehlern 

IaC Tools im Vergleich

IaC kann mit ver­schie­de­nen Tools rea­li­siert wer­den. Dabei ist es wich­tig, zwi­schen der Pro­vi­sio­nie­rung von Infrastruktur und dem Bereit­stel­len und der Kon­fi­gu­ra­tion von Soft­ware und Appli­ka­tio­nen zu unter­schei­den. Ent­spre­chend las­sen sich die Tools je nach ihrem Schwer­punkt in zwei Kate­go­rien unter­tei­len (siehe Bild). Viele IaC Tools kön­nen schwer­punkt­über­grei­fend ein­ge­setzt und, wenn dies nicht mög­lich oder opti­mal ist, mit den ande­ren Tools kom­bi­niert wer­den. Der Fokus des aktu­el­len Blog­bei­trags liegt vor allem auf der Pro­vi­sio­nie­rung von Cloud Infra­struk­tu­ren; daher wird die andere Kate­go­rie nicht näher betrachtet. 

IaC Tool im Vergleich
Ven­dor Lock-in 

Die Wahl der IaC-Tech­no­lo­gie ist von ver­schie­de­nen Fak­to­ren abhän­gig.  Einer der wich­tigs­ten Punkte dabei ist die Ver­mei­dung von Ven­dor-Lock-In. Unter Ven­dor-Lock-In ver­steht man eine so starke Abhän­gig­keit von den Pro­duk­ten eines Anbie­ters, dass ein Wech­sel des Anbie­ters unver­hält­nis­mä­ßig auf­wän­dig wird. In Bezug auf IaC bedeu­tet dies, eine Tech­no­lo­gie zu nut­zen, die auf ver­schie­de­nen Cloud Platt­for­men anwend­bar ist. 

Cloud Tem­pla­tes wie AWS Cloud­For­ma­tion, Google Deploy­ment Mana­ger und Azure Resource Mana­ger mit dem Nach­fol­ger Bicep decken nur Res­sour­cen in ihren eige­nen Cloud Umge­bun­gen ab. Dage­gen unter­stüt­zen die Tools wie Ter­ra­form und Pulumi den Multi-Cloud Ansatz und kön­nen Res­sour­cen platt­form­über­grei­fend pro­vi­sio­nie­ren. Es ist zu beach­ten, dass ein mit Ter­ra­form oder Pulumi geschrie­be­ner Code für die Infrastruktur auf einer Cloud Platt­form nicht direkt auf andere Cloud Platt­for­men über­trag­bar ist, son­dern erfor­dert eine gewisse Migra­tion oder Anpas­sung. Der Grund dafür sind man­gelnde stan­dar­di­sierte Schnitt­stel­len von Cloud Services. 

Der Vor­teil von Ter­ra­form oder Pulumi im Ver­gleich zu den platt­form­na­ti­ven Tools besteht darin, dass der Ent­wick­ler prin­zi­pi­ell nur ein ein­zel­nes Werk­zeug beherr­schen muss, um ver­schie­dene Cloud Platt­for­men zu bedie­nen, statt für jede Cloud-Platt­form eine neue IaC Spra­che ler­nen zu müs­sen. Die Cloud Tem­pla­tes loh­nen sich haupt­säch­lich dann, wenn neue Cloud Pro­vi­der Fea­tures nach ihrem Release ohne Ver­zug eige­setzt wer­den sol­len, denn Ter­ra­form und Pulumi brau­chen dafür zusätz­li­che Imple­men­tie­rungs­zeit. Alter­na­tiv kön­nen Cloud Tem­pla­tes aber auch mit Ter­ra­form oder Pulumi aus­ge­rollt werden. 

Inte­gra­tion 

Der zweite ent­schei­dende Fak­tor für ein IaC Tool sind Funk­ti­ons­um­fang und Inte­gra­tion mit ande­ren Soft­ware-Lösun­gen. Wie bereits erwähnt beschrän­ken sich die Cloud Tem­pla­tes von AWS, GCP und Azure sich ledig­lich auf Ihre eige­nen Ser­vices und erlau­ben keine Inte­gra­tion mit ande­ren Platt­for­men. Im Gegen­satz dazu unter­stüt­zen Ter­ra­form und Pulumi nicht nur die drei größ­ten Cloud Anbie­ter AWS, Azure und GCP, son­dern auch zahl­rei­che andere Pro­dukte. Zu den letz­ten gehö­ren unter ande­rem sol­che Pro­vi­der wie Snow­flake, Kuber­netes, VMware und Ora­cle Cloud. Dabei ist zu beach­ten, dass Ter­ra­form deut­lich mehr andere Tech­no­lo­gien unter­stützt als Pulumi, obwohl Pulumi sicher­lich eine gute Alter­na­tive zu Ter­ra­form bei den wich­tigs­ten Pro­vi­dern darstellt. 

Umfang und Reifegrad 

Schließ­lich unter­schei­den sich die IaC Tools im Umfang und Rei­fe­grad der Fea­tures. Dazu gehö­ren vor allem die unter­stütz­ten Pro­gram­mier­spra­chen. Native Cloud Tem­pla­tes und Ter­ra­form haben ihre eige­nen Skript­spra­chen. Die Spra­chen sind zwar gut doku­men­tiert und erlau­ben einen schnel­len Ein­stieg, die Benut­zung von kom­ple­xe­ren Sprach­funk­tio­na­li­tä­ten erfor­dert jedoch Pra­xis­er­fah­rung und tie­fes Ver­ständ­nis des jewei­li­gen Tools. Zusätz­lich bie­ten Ter­ra­form und die größ­ten Cloud Platt­for­men wie AWS, Azure und Google ein Ser­vice oder Cloud Deve­lo­p­ment Kit (SDK/CDK), um den Code in ande­ren Spra­chen wie Python, C#, Go, Type­script, Java, Java­script oder .NET zu schrei­ben. Pulumi besitzt keine eigene Spra­che und ver­wen­det Python, Go, Java­Script, Type­Script, C# und Java. Durch die gän­gi­gen Skript­spra­chen bekommt der Ent­wick­ler den Zugang zu ver­trau­ten Kon­struk­ten und Tech­ni­ken inkl. Testing. 

Wei­tere Anfor­de­run­gen an Sprach­fea­tures sind: 

  • dyna­mi­sche Pro­vi­sio­nie­rung von Res­sour­cen, wenn die Anzahl von Res­sour­cen und Ihre Kon­fi­gu­ra­tion erst zur Lauf­zeit des Skripts bekannt werden; 
  • benut­zer­de­fi­nierte Vali­die­rung von Para­me­tern und Res­sour­cen vor und nach dem Bereitstellen; 
  • Defi­ni­tion von Update- und Delete-Ver­hal­ten von Ressourcen. 

Ter­ra­form und Pulumi kön­nen sol­che Sze­na­rien Out-of-the-Box imple­men­tie­ren. Cloud Tem­pla­tes las­sen das aber ohne eine Erwei­te­rung mit SDK/CDK nur sehr begrenzt zu. 

Die wich­tigs­ten Punkte aus der Über­sicht von IaC Tools sind: 

  • Die meis­ten Cloud-Pro­jekte sind tech­no­lo­gie- und plattformübergreifend; 
  • Ven­dor Lock-In kann mit Ter­ra­form oder Pulumi ver­mie­den werden; 
  • Platt­form­na­tive Cloud Tem­pla­tes, Ter­ra­form und Pulumi erlau­ben eigene oder wei­ter­ver­brei­tete Skript­spra­chen (Python, Java, C#, Java­Script, usw.) zu nutzen; 
  • Ter­ra­form kann mit deut­lich mehr ande­ren Tech­no­lo­gien inte­griert wer­den als alle ande­ren IaC Tools. 

Es lässt sich zusam­men­fas­send fest­hal­ten, dass Cloud Infra­struk­tu­ren aktu­ell opti­ma­ler­weise mit Ter­ra­form oder Pulumi umge­setzt wer­den kön­nen. Im nächs­ten Kapi­tel wird im Detail auf Anwen­dung von Ter­ra­form ein­ge­gan­gen; ein Ver­gleich mit Pulumi erfolgt im Schlusskapitel. 

Ter­ra­form: High-Level Über­sicht und Best Practices 

Hash­i­Corp Language 

IaC Skripte mit Ter­ra­form wer­den anhand der domä­nen­spe­zi­fi­schen Spra­che Hash­i­Corp Lan­guage (HCL) ver­fasst. HCL ist eine dekla­ra­tive men­schen­les­bare und leicht erlern­bare Spra­che. HCL imple­men­tiert zahl­rei­che Grund­funk­tio­na­li­tä­ten wie For-Schlei­fen, If-Bedin­gun­gen und umfang­rei­che Built-in Funk­tio­nen. Die Aus­füh­rung von Ter­ra­form Skrip­ten erfolgt mit der Open Source CLI terraform. 

Pro­vi­der 

Ter­ra­form ver­fügt über ein Regis­try, in dem soge­nannte Ter­ra­form Pro­vi­der für ver­schie­dene Cloud Platt­for­men und Ser­vices kos­ten­los ange­bo­ten wer­den. Ein Pro­vi­der ist eine Biblio­thek von Modu­len zum Erstel­len von Res­sour­cen, die in Ter­ra­form Skrip­ten ange­bun­den wer­den kön­nen. Ter­ra­form Skripte bestehen im Wesent­li­chen aus Auf­ru­fen von sol­chen bereit­ge­stell­ten Modu­len und deren Abhän­gig­kei­ten. Dar­aus resul­tie­ren Module für ein eige­nes Pro­dukt oder Infrastruktur. 

Para­me­ter 

Die Skripte las­sen sich wie­der­ver­wen­den, indem Ein­ga­be­pa­ra­me­ter dekla­riert wer­den. Die Ein­ga­be­pa­ra­me­ter kön­nen zusätz­lich mit Cus­tom Con­di­tion Checks vali­diert wer­den, was z.B. bei Ver­wen­dun­gen von Ter­ra­form im Self-Ser­vice Bereich sinn­voll ein­ge­setzt wer­den kann. Die Ein­ga­be­pa­ra­me­ter für einen kon­kre­ten Fall kön­nen dann z.B. über .tfvars-Dateien bei der Aus­füh­rung mit­ge­ge­ben wer­den. Die Ter­ra­form Skripte spie­len in dem Fall die Rolle von Tem­pla­tes und die .tfvars-Dateien sind ent­spre­chende Kon­fi­gu­ra­ti­ons­da­teien. Es emp­fiehlt sich, die Tem­pla­tes und die Kon­fi­gu­ra­ti­ons­files sepa­rat zu ver­sio­nie­ren, wobei die Kon­fi­gu­ra­tion eine Release-Ver­sion von den Tem­pla­tes ent­hal­ten soll. Die Ver­sio­nie­rung von den Tem­p­late Skrip­ten z.B. durch Tags ermög­licht die Wie­der­ver­wen­dung die­ser Tem­p­late Module in einem ande­ren Ter­ra­form Code, denn Ter­ra­form erlaubt Module direkt aus einem Git-Repo­si­tory zu referenzieren. 

State-Datei 

Der andere Bestand­teil von Ter­ra­form, abge­se­hen von Skrip­ten, ist Terraform’s .tfstate-Datei. Die Datei gehört zu jedem Ter­ra­form Pro­jekt und mappt die Res­sour­cen aus den Skrip­ten und Kon­fi­gu­ra­tion auf die reale Welt. Die .tfstate-Datei ist ein JSON File und spei­chert Res­sour­cen­at­tri­bute, ‑meta­da­ten und ‑abhän­gig­kei­ten. Per Default aktua­li­siert Ter­ra­form die gecach­ten Attri­bute für alle Res­sour­cen in der State-Datei bei jeder Aus­füh­rung. Für große Cloud-Infra­struk­tu­ren führt dies zur Min­de­rung der Per­for­manz. Um die Per­for­manz für große Workloads auf­recht zu erhal­ten, emp­fiehlt Ter­ra­form die Ver­wen­dung von den Flags –refresh=false und –tar­get.  

Die State-Datei sollte auch in die Ver­si­ons­kon­trolle inklu­diert wer­den, aller­dings ist Git nicht immer sinn­voll dafür, da die Datei sen­si­ble Daten (z.B. Pass­wör­ter) im Klar­text ent­hal­ten kann. Ein ein­fa­ches Bei­spiel dafür ist: Gene­rie­ren eines Pass­worts und Spei­chern als Azure Key Vault Secret. Sowohl das Pass­wort als auch der Secret wer­den in der .tfstate-Datei ohne Ver­schlüs­se­lung geschrie­ben. Als Lösung bie­tet Ter­ra­form Remote Backends als Spei­chert­ort für .tfstate-Dateien. Dazu gehö­ren z.B. Azure Sto­rage, AWS S3, und Arti­fac­tory. Der Zugang zum Remote Backend sollte durch Zugriffs­kon­trolle stark ein­ge­schränkt werden. 

Test­ing 

Zu Ent­wick­lungs­ar­bei­ten mit Ter­ra­form gehört auch das Thema Soft­ware Test­ing. Inte­gra­tion- und Unit­tests kön­nen mit den nati­ven Ter­ra­form Befeh­len „vali­date“, „plan“ und „apply“ durch­ge­führt wer­den. Die Aus­füh­rung durch Ter­ra­form erfolgt in zwei Schrit­ten. Als ers­tes wird der Code vali­diert und ein Ter­ra­form Plan gene­riert, der beschreibt, wel­che Abwei­chun­gen es zwi­schen der Ter­ra­form Kon­fi­gu­ra­tion und den rea­len Res­sour­cen gibt, und, wie Ter­ra­form die Unter­schiede behe­ben würde. Wenn der Plan stim­mig ist, dann kann der Plan mit Ter­ra­form Apply ange­wen­det wer­den und die Res­sour­cen wer­den ent­spre­chend dem Plan ange­passt. Zwi­schen den Vali­date, Plan und Apply Befeh­len kön­nen Prü­fungs­checks erfol­gen, um die erfor­der­li­che Qua­li­tät des Codes sicherzustellen. 

Com­pli­ance Test­ing ist mög­lich mit dem Open Source ter­ra­form-com­pli­ance Tool. Das Tool erlaubt es, eigene Poli­cies (z.B. Unter­bin­den von Azure Sto­rage Account mit Public Access) für Ter­ra­form Code zu defi­nie­ren und den Code dage­gen zu prü­fen. Im Hin­blick auf End-to-End (E2E) Tests emp­fiehlt sich Ter­ra­test, eine Go Biblio­thek zum Imple­men­tie­ren von auto­ma­ti­sier­ten Tests für Ter­ra­form. Schließ­lich ergibt sich die fol­gende DevOps-Archi­tek­tur für Terraform:

Ter­ra­form DevOps Architektur

Zusam­men­fas­sung: wel­ches Tool soll bevor­zugt werden?

Der Schwer­punkt des aktu­el­len Blog­ar­ti­kels liegt auf Pro­vi­sio­nie­rung von Infra­struk­tu­ren, und zwar mit Ter­ra­form. Es gibt momen­tan kein IaC Tool, das alle Bedürf­nisse abdeckt. So haben auch Ter­ra­form und Pulumi ihre Schwie­rig­kei­ten bei der Kon­fi­gu­ra­tion und Ver­wal­tung von bereits pro­vi­sio­nier­ten Ser­vern, im Gegen­satz zu Ansi­ble oder Pup­pet. Ter­ra­form und Pulumi zei­gen deut­lich mehr Stär­ken durch Multi-Cloud Fähig­keit und Inte­gra­tion mit ande­ren Tech­no­lo­gien gegen­über nati­ven Cloud Tem­pla­tes vom Azure, AWS oder GCP.  Die wich­tigs­ten Unter­schiede zwi­schen Ter­ra­form und Pulumi sind: 

  • Pro­vi­der: Ter­ra­form unter­stützt aktu­ell deut­lich mehr Pro­vi­der als Pulumi 
  • Secrets in State-Datei: Pulumi ver­schlüs­selt Secrets in der State-Datei im Gegen­satz zu Terraform. 
  • API: Im Ver­gleich zu Ter­ra­form kann Pulumi kann nur über CLI, son­dern auch über eine API direkt aus dem Pro­gramm­code auf­ge­ru­fen werden. 
  • Refac­to­ring:  Pulumi erlaubt mit­hilfe von Ali­a­ses eine simp­lere Über­ar­bei­tung und Ver­schie­bung von Res­sour­cen inner­halb des Codes als Terraform. 

Da Ter­ra­form und Pulumi gegen­sei­tig sowohl Vor- als auch Nach­teile haben, bleibt die Wahl zwi­schen den bei­den projektspezifisch.