IaC en CI/CD best practices combineren met low code?

Joost van Dam

Case
17 november 2023
Hoe we een internationaal SaaS-platform deployen met behulp van low code, IaC en CI/CD best practices.

In één van mijn vorige blog posts sprak ik over het inzetten van Azure Function Apps via Custom connectors om de functionaliteiten van het Power Platform gemakkelijk uit te breiden. Recent hebben we echter nieuwe situaties ontdekt waarin het omgekeerde ook waar bleek te zijn! Ik wil je dan ook graag laten zien hoe we low code, IaC en CI/CD best practices inzetten om een internationaal SaaS-platform op het gebied van voedselveiligheid te deployen wat we momenteel bouwen voor een opdrachtgever.

Side note: ben je benieuwd welk SaaS-platform dat is? Houd dan onze communicatiekanalen in de gaten, want binnenkort gaat dit platform live.

Hoewel het een complex proces betreft, zal ik proberen om de relevante technische concepten en afwegingen zo goed mogelijk hieronder toe te lichten.

De uitdaging

Er komt wel wat kijken qua deployment bij de ontwikkeling van een groter SaaS-platform wat tegelijkertijd gebruikt én doorontwikkeld wordt. We moeten ervoor zorgen het platform modulair kan worden uitgebreid en dat elke nieuwe versie minstens zo goed functioneert als de vorige. In dit project hebben we te maken met diverse apps en tal van omliggende services die in wisselende samenstelling moeten communiceren. Ook wijzigen de benodigde (Azure) cloud resources waar de code gebruik van maakt tussen de verschillende releases (nieuwe versie van het platform).

Hoe hebben we dit deploymentproces betrouwbaar ingericht?

Code → Build. Build + Config → Release.

Allereerst passen we binnen Shared de Twelve-Factor App-methodologie toe. Hieruit volgt onder andere dat source code leidt tot een build. Vervolgens leidt deze build aangevuld met een configuratie-bestand tot een release.

Het ontbrekende stuk is de infrastructuur (Azure cloud services). De release moet natuurlijk ook ergens draaien, en is waarschijnlijk afhankelijk van extra services (Databases, app-registraties, …). Hiervoor gebruiken we Infrastructure as Code (IaC), waarmee je op basis van code de benodigde infrastructuur kunt definiëren en in één keer kunt laten neerzetten door de cloud provider (Microsoft Azure). In ons geval maken we gebruik van Bicep en een in-house ontwikkelde Command Line Interface (CLI), wat voor deze toepassing de beste resultaten biedt binnen Microsoft Azure en Microsoft Entra ID.

Versiebeheer in de praktijk

In theorie kunnen we dus alle onderdelen van het SaaS-platform in code en configuratie vatten, waardoor er ook versiebeheer van deze bestanden mogelijk is. Maar hoe werkt dat versiebeheer in de praktijk?

De uitdaging ligt er allereerst in om source code (builds), configuratie en IaC op te kunnen slaan als statische bestanden waarover versiebeheer gevoerd kan worden. Dit hele proces wordt uitgevoerd binnen Github Actions, waarin onder andere de source code wordt omgezet in builds, het volledige pakket geautomatiseerd wordt getest en – indien succesvol – de verschillende onderdelen opslaat binnen Microsoft Azure.

Builds
In de eerste plaats de builds. We doen dit voor de statische onderdelen (bijv. Single Page Applications en Function Apps) in de vorm van ZIP-bestanden en voor de ingewikkelder services gebruiken we Docker images die geüpload worden naar een Azure Container Registry.

Configuratie
In de tweede plaats de configuratie. Die is vrij simpel en bestaat uit JSON-bestanden die ook prima in een Azure Blob Storage container opgeslagen kunnen worden.

Infrastructuur
Tenslotte infrastructuur. Dit was iets lastiger omdat alleen de inzet van Bicep niet voldoende was. Er waren aanvullend meerdere scripts nodig om onder andere B2C-Tenants te configureren. Dit hebben we opgelost door het hele script (B2C-Tenants, Bicep, etc.) óók in een Docker image te verpakken. Op deze manier kunnen we ook hiervan verschillende ‘versies’ opslaan.

Briljant! We kunnen nu onbeperkt verschillende versies van de drie hoofdingrediënten (build, configuratie en infrastructuur) opslaan en op deze manier verschillende releases samenstellen en deployen. Nu we deze IaC en CI/CD best practices hebben staan rest de vraag: hoe houden we alles bij?

Bijhouden van versies en releases

Om het samengestelde pakket van build, configuratie en infrastructuur als één geheel neer te kunnen zetten in een test-, acceptatie of productie-omgeving, komen we bij het sluitstuk van dit deploymentproces. Allereerst wordt er aan het einde van de pipeline in Github Actions een release configuratie-bestand gemaakt (in JSON-formaat, zie hieronder) met daarin de benodigde versies van de verschillende applicaties, configuratie en infrastructuur. Het mooie van dit systeem is dat we naar oudere versies kunnen verwijzen en er zodoende niks dubbel opgeslagen dient te worden.

Voorbeeld van de JSON-opbouw van een release

De individuele versies en de totale samenstelling van de release worden door middel van een Azure Function App bijgehouden in een Azure Blob Storage tabellen. De app biedt onder andere de volgende endpoints om:

  • nieuwe releases samen te stellen bestaande uit versies van builds, configuratie en infrastructuur;
  • een release naar een specifieke omgeving (bijv. acceptatie of productie) te deployen
  • historische deployments in te zien. Dit geeft bijvoorbeeld zicht op welke release in welke omgeving actief is.

Het is natuurlijk prachtig dat hiervoor een API beschikbaar is, maar dat maakt het beheer nog niet gebruiksvriendelijk. Hiervoor hebben we tenslotte de Power App nodig.

Het orkestreren van releases via een Power App

Nu we een API hebben voor het aanmaken van nieuwe releases en de deployment daarvan, biedt dit de mogelijkheid om snel een low code applicatie neer te zetten in Microsoft Power Apps om het deploymentproces te orkestreren. Alle complexe zaken vinden plaats achter de API en in Github Actions, waardoor een low code oplossing zich uitstekend leent om dit beheer op een gebruiksvriendelijke manier uit te voeren.

De Power App biedt de volgende functionaliteiten:

  • Direct starten of inplannen van deployments op basis van geselecteerde release en doelomgeving.
  • Oude releases herstellen.
  • Inzicht in huidige actieve releases binnen de DTAP-omgevingen.
  • Change log / audit feed van historische releases.
  • Goedkeuringsprocedure voor releases naar productie, bijvoorbeeld via testteam of product owners.
  • Notificaties naar gebruikersgroepen wanneer er een nieuwe release beschikbaar is, inclusief release notes.

Best goed toch?

Tot slot

Zo, nu heb je ruwweg een beeld van het deploymentproces van een SaaS-platform. Je zult zien dat ons huidige proces bij elk nieuw project steeds weer verder bijgeschaafd zal worden; we blijven natuurlijk continue leren!

Mocht het bovenstaande verhaal jou nou aanspreken en kom je graag in gesprek hoe je deze IaC en CI/CD best practices bijvoorbeeld zelf kunt toepassen? Neem dan vooral contact met ons op en wie weet spreken we elkaar hier binnenkort over. Lijkt me leuk!

Meld je aan voor onze nieuwsbrief

Better business dankzij inspiratie, tips, best practices, klantverhalen en meer.


Joost van Dam

17 november 2023

Meer inspiratie

Contact

Je naam
Dit veld is bedoeld voor validatiedoeleinden en moet niet worden gewijzigd.
Shared BV

Vasteland 12G
3011 BL Rotterdam

+085 833 0011 info@shared.nl
Sluiten
Privacyverklaring

Privacyverklaring Shared

Shared, gevestigd aan Vasteland 12G, 3011 BL Rotterdam, is verantwoordelijk voor de verwerking van persoonsgegevens zoals weergegeven in deze privacyverklaring.

Contactgegevens: Website: https://www.shared.nl
Adres: Vasteland 12G, 3011 BL Rotterdam
Telefoon: +31 85 8330011

Persoonsgegevens die wij verwerken Shared verwerkt je persoonsgegevens doordat je gebruik maakt van onze diensten en/of omdat je deze gegevens zelf aan ons verstrekt. Hieronder vind je een overzicht van de persoonsgegevens die wij verwerken:

  • Voor- en achternaam
  • Telefoonnummer
  • E-mailadres
  • IP-adres
  • Gegevens over jouw activiteiten op onze website
  • Internetbrowser en apparaat type

Bijzondere en/of gevoelige persoonsgegevens die wij verwerken Onze website en/of dienst heeft niet de intentie gegevens te verzamelen over websitebezoekers die jonger zijn dan 16 jaar, tenzij ze toestemming hebben van ouders of voogd. We kunnen echter niet controleren of een bezoeker ouder dan 16 is. Wij raden ouders dan ook aan betrokken te zijn bij de online activiteiten van hun kinderen, om zo te voorkomen dat er gegevens over kinderen verzameld worden zonder ouderlijke toestemming. Als je ervan overtuigd bent dat wij zonder die toestemming persoonlijke gegevens hebben verzameld over een minderjarige, neem dan contact met ons op via gerritjan@shared.nl, dan verwijderen wij deze informatie.

Met welk doel en op basis van welke grondslag wij persoonsgegevens verwerken Shared verwerkt jouw persoonsgegevens voor de volgende doelen:

  • Je te kunnen bellen of e-mailen indien dit nodig is om onze dienstverlening uit te kunnen voeren.
  • Shared analyseert jouw gedrag op de website om daarmee de website te verbeteren en het aanbod van producten en diensten af te stemmen op jouw voorkeuren.
  • Shared volgt jouw surfgedrag over verschillende websites waarmee wij onze producten en diensten afstemmen op jouw behoefte.

Geautomatiseerde besluitvorming Shared neemt geen besluiten op basis van geautomatiseerde verwerkingen die aanzienlijke gevolgen kunnen hebben voor personen.

Hoe lang we persoonsgegevens bewaren Shared bewaart je persoonsgegevens niet langer dan strikt nodig is om de doelen te realiseren waarvoor je gegevens worden verzameld. Wij hanteren de volgende bewaartermijnen voor de volgende (categorieën) van persoonsgegevens:

  • Persoonsgegevens: 26 maanden

Delen van persoonsgegevens met derden Shared deelt jouw persoonsgegevens met verschillende derden als dit noodzakelijk is voor het uitvoeren van de overeenkomst en om te voldoen aan een eventuele wettelijke verplichting. Met bedrijven die je gegevens verwerken in onze opdracht, sluiten wij een verwerkersovereenkomst om te zorgen voor eenzelfde niveau van beveiliging en vertrouwelijkheid van jouw gegevens. Shared blijft verantwoordelijk voor deze verwerkingen. Daarnaast verstrekt Shared jouw persoonsgegevens aan andere derden alleen met jouw nadrukkelijke toestemming.

Cookies, of vergelijkbare technieken, die wij gebruiken Shared gebruikt functionele, analytische en tracking cookies. Een cookie is een klein tekstbestand dat bij het eerste bezoek aan deze website wordt opgeslagen in de browser van je computer, tablet of smartphone. Shared gebruikt cookies met een puur technische functionaliteit. Deze zorgen ervoor dat de website naar behoren werkt en dat bijvoorbeeld jouw voorkeursinstellingen onthouden worden. Deze cookies worden ook gebruikt om de website goed te laten werken en deze te kunnen optimaliseren. Daarnaast plaatsen we cookies die jouw surfgedrag bijhouden zodat we op maat gemaakte content en advertenties kunnen aanbieden.

Bij jouw eerste bezoek aan onze website hebben wij je al geïnformeerd over deze cookies en hebben we je toestemming gevraagd voor het plaatsen ervan.

Je kunt je afmelden voor cookies door je internetbrowser zo in te stellen dat deze geen cookies meer opslaat. Daarnaast kun je ook alle informatie die eerder is opgeslagen via de instellingen van je browser verwijderen. Zie voor een toelichting: https://veiliginternetten.nl/themes/situatie/cookies-wat-zijn-het-en-wat-doe-ik-ermee/

Op deze website worden ook cookies geplaatst door derden. Dit zijn bijvoorbeeld adverteerders en/of sociale media-bedrijven. Hieronder een overzicht:

  • Google Analytics & Ads
    • Naam: _ga & _utma
    • Functie: Analytische cookie die websitebezoek meet
    • Bewaartermijn: 24 maanden
  • LinkedIn
    • Naam: _ligc
    • Functie: Analytische cookie die websitebezoek meet
    • Bewaartermijn: 24 maanden
  • Hotjar
    • Naam: _hjSessionUser_14
    • Functie: Analytische cookie die websitebezoek meet
    • Bewaartermijn: 24 maanden

Gegevens inzien, aanpassen of verwijderen Je hebt het recht om je persoonsgegevens in te zien, te corrigeren of te verwijderen. Dit kun je zelf doen via de persoonlijke instellingen van jouw account. Daarnaast heb je het recht om je eventuele toestemming voor de gegevensverwerking in te trekken of bezwaar te maken tegen de verwerking van jouw persoonsgegevens door ons bedrijf en heb je het recht op gegevensoverdraagbaarheid. Dat betekent dat je bij ons een verzoek kan indienen om de persoonsgegevens die wij van jou beschikken in een computerbestand naar jou of een ander, door jou genoemde organisatie, te sturen.

Wil je gebruik maken van je recht op bezwaar en/of recht op gegevensoverdraagbaarheid of heb je andere vragen/opmerkingen over de gegevensverwerking, stuur dan een gespecificeerd verzoek naar gerritjan@shared.nl.

Om er zeker van te zijn dat het verzoek tot inzage door jou is gedaan, vragen wij jou een kopie van je identiteitsbewijs bij het verzoek mee te sturen. Maak in deze kopie je pasfoto, MRZ (machine readable zone, de strook met nummers onderaan het paspoort), paspoortnummer en Burgerservicenummer (BSN) zwart. Dit ter bescherming van je privacy. Shared zal zo snel mogelijk, maar in ieder geval binnen vier weken, op jouw verzoek reageren.

Shared wil je er tevens op wijzen dat je de mogelijkheid hebt om een klacht in te dienen bij de nationale toezichthouder, de Autoriteit Persoonsgegevens. Dat kan via de volgende link: https://autoriteitpersoonsgegevens.nl/nl/contact-met-de-autoriteit-persoonsgegevens/tip-ons

Hoe wij persoonsgegevens beveiligen Shared neemt de bescherming van jouw gegevens serieus en neemt passende maatregelen om misbruik, verlies, onbevoegde toegang, ongewenste openbaarmaking en ongeoorloofde wijziging tegen te gaan. Als jij het idee hebt dat jouw gegevens toch niet goed beveiligd zijn of er aanwijzingen zijn van misbruik, neem dan contact op met onze klantenservice of via gerritjan@shared.nl. Shared heeft de volgende maatregelen genomen om jouw persoonsgegevens te beveiligen:

  • Gebruik van beveiligde verbindingen (SSL/TLS)
  • Regelmatige beveiligingscontroles en updates
  • Strikte toegangscontroles voor medewerkers en systemen

Deze privacyverklaring is voor het laatst aangepast op 11-06-2024.