Beheerdershandleiding Airflow: connecties beheren¶
Airflow-connecties die authenticeren met een client_id/client_secret (Databricks, Fabric, Power BI, Synapse, Data Factory, een private git-repo, of elke generieke OAuth-beveiligde API) moeten dat secret laten roteren voordat het verloopt. De Airflow Connections Pipeline is een self-contained Azure DevOps pipelinepakket dat dit automatisch, volgens een schema, doet voor elke connectie die je opgeeft, zonder ooit het eigen applicatiesecret van Airflow prijs te geven.
Overzicht¶
Eén pipeline, één schema, een lijst met connecties. Bij elke geplande run doorloopt de pipeline de lijst en, per item:
Roteert het client secret van de target-appregistratie: de app die eigenaar is van waar Airflow verbinding mee maakt (een Databricks service principal, een Fabric service principal, een appregistratie van een generieke API, enzovoort). Benoem de target via
targetAppNameom de pipeline de appregistratie en service principal te laten aanmaken wanneer die ontbreekt (de aanbevolen manier om elke connectie zijn eigen dedicated SP te geven), of viatargetAppIdom een bestaande te roteren. Een vers aangemaakte SP heeft nog eenmalig, handmatig, resource-toegang nodig (workspace-rollen, ARM RBAC).Zorgt ervoor dat de SP van de service connection de “Admin”-approl van de Airflow-app heeft, en kent deze zelf toe via Microsoft Graph wanneer deze ontbreekt.
Genereert een access token voor de Airflow-applicatie zelf, zonder ooit het eigen client secret van de Airflow-app te gebruiken (zie “Eén service connection” hieronder).
Zet de nieuwe
client_id/client_secretin de opgegeven Airflow-connectie via de Airflow REST API.
Omdat elk item op hetzelfde schema roteert, kies een cron-cadans die korter is dan de kleinste validityDays van al je connecties.
De pipeline verkrijgen¶
Dit is een op zichzelf staand Azure DevOps pipeline-pakket, zonder afhankelijkheid van de rest van de platform-repo. Verkrijg op een van twee manieren een werkende kopie:
Download het pipeline-pakket (zip)— het template, de scripts, en een voorbeeld-connections.yamlom te kopiëren en handmatig te bewerken.Genereer een startpunt-connections.yaml — vul een formulier in en krijg een direct bruikbaar bestand voor precies de connecties die je nodig hebt, in plaats van het voorbeeld handmatig te bewerken.
In beide gevallen: pak het pakket uit in een eigen Azure DevOps repo (of een map van een bestaande) en wijs een nieuwe pipeline ernaar — zie “Je pipeline instellen” hieronder.
Eén service connection¶
Elk item benoemt één Azure DevOps service connection (serviceConnectionName, doorgaans dezelfde voor elk item) waarvan de service principal alles doet:
Taak |
Wat de SP nodig heeft |
|---|---|
Vindt/maakt target-apps aan en roteert hun secrets |
Eigenaar van die appregistraties. Om de pipeline apps per connectie te laten aanmaken ( |
Authenticeert bij de Airflow REST API |
De “Admin”-approl op de Airflow-applicatie — zelf toegekend door de pipeline wanneer de SP |
Je hebt het eigen client secret van de Airflow-applicatie nooit nodig, en zou dit ook nooit moeten krijgen. In plaats daarvan krijgt de SP van de service connection de “Admin”-approl van de Airflow-app. Wanneer de pipeline een token aanvraagt voor de Airflow-app als resource/audience, neemt Microsoft Entra ID die rol op in een roles-claim, ongeacht welke client het token aanvroeg. De auth-laag van Airflow controleert alleen de claim, niet wie het secret van de app in bezit heeft.
Als de SP de rol niet zelf kan toekennen (AppRoleAssignment.ReadWrite.All ontbreekt), mislukt de pipeline met een duidelijke foutmelding en twee oplossingspaden: iemand met rechten over de Airflow-appregistratie draait eenmalig Grant-AirflowAdminRole.ps1, of de SP van de service connection krijgt die Graph-permissie (admin consent vereist) zodat de pipeline bij elke volgende run zelfvoorzienend wordt. Hoe dan ook kan een vers toegekende rol even nodig hebben om door te dringen — draai opnieuw als de eerstvolgende stap nog steeds een 403 geeft.
Je pipeline instellen in Azure DevOps¶
Alles hieronder gebeurt in je eigen Azure DevOps-organisatie, niet die van de leverancier. Voorkennis van Azure DevOps is niet nodig: elke stap noemt het exacte menu om te klikken.
1. Zet de bestanden in een repo¶
Klik in je Azure DevOps-project (linkerbalk) op Repos.
Als het project nog geen repo heeft, biedt Azure DevOps aan om er op datzelfde scherm een aan te maken — accepteer de standaardnaam, of geef het een naam als
airflow-connections. Je kunt deze pipeline ook prima in een bestaande repo zetten in plaats van een nieuwe; elke submap werkt.Voeg de bestanden van de pipeline toe aan die repo, met behoud van de mapstructuur (
templates/,scripts/, en jeconnections.yaml):Geen git-ervaring nodig: klik op het scherm Repos → Files op ⋯ (rechtsboven) → Upload file(s), en herhaal dit per map (
templates/rotate-connection-template.yaml, alles onderscripts/, en jeconnections.yaml).Gebruik je al git: clone de repo, kopieer de inhoud van het uitgepakte pakket erin,
git add/git commit/git push.
2. Vul je connections.yaml in¶
Begin vanuit
examples/connections.yamlin het gedownloade pakket, of gebruik de generator om er direct een te maken.Voeg voor elke benodigde connectie een item toe aan de
connections-lijst — zie de referentie van connectietypes hieronder. GebruiktargetAppNameom de pipeline per connectie een dedicated appregistratie + SP te laten aanmaken, oftargetAppIdom een bestaande vast te leggen.connectionIdis de Airflowconn_iden moet uniek zijn binnen het bestand — alleen letters, cijfers, underscores en hyphens.Kies een cron-cadans onder
schedules:die korter is dan de kortstevalidityDaysvan je connecties, zodat elk secret wordt geroteerd voordat het verloopt.
3. Maak de service connection aan¶
Dit is de ene identiteit waaronder de pipeline draait (zie “Eén service connection” hierboven) — de naam moet exact overeenkomen met de serviceConnectionName-variabele in je YAML-bestand.
Notitie
De Airflow-applicatie zelf is eigendom van het platform en leeft in de eigen tenant van het platform, niet in de jouwe. Zelf de “Admin”-rol toekennen (hieronder) werkt pas zodra je organisatie Entra ID-onboarding heeft doorlopen — dat is wat de Airflow-applicatie van het platform consenteert in jouw tenant, wat nodig is voordat de SP van je service connection er überhaupt een rol aan kan toekennen. Wordt je Airflow-instantie in plaats daarvan beveiligd via het gedeelde Keycloak-realm van het platform, dan is de Airflow-stap van dit rotatiemechanisme niet van toepassing — neem contact op met het platform-team over het roteren van het secret van die connectie.
Klik linksonder in Azure DevOps op Project Settings.
Klik onder Pipelines op Service connections.
Klik op New service connection.
Kies Azure Resource Manager, klik daarna op Next.
Kies Service principal (automatic) — Azure DevOps maakt de appregistratie voor je aan, dus voor dit deel is er geen aparte Entra ID-stap.
Kies je Subscription (elk abonnement in je eigen tenant — dit is alleen van belang voor het aanmaken van de service principal zelf; welke je kiest heeft geen invloed op de rechten, aangezien alles wat deze pipeline nodig heeft wordt verleend op Microsoft Entra ID-niveau, niet op abonnementsniveau). Laat Resource group leeg (scope: Subscription).
Voer onder Service connection name exact dezelfde naam in als
serviceConnectionNamein je YAML-bestand (bijv.customer-connections).Vink uit: Grant access permission to all pipelines. Deze service connection krijgt gevoelige rechten (eigenaarschap van je target-apps, de Graph-permissies hieronder) — laat niet elke pipeline in het project deze vrij kunnen gebruiken. Klik op Save. Bij de eerste run van de pipeline die je in de volgende sectie aanmaakt, toont Azure DevOps een banner om die specifieke pipeline te autoriseren voor deze connection — keur dat daar goed.
De service connection bestaat nu, maar heeft alleen de basis-abonnementsrol die Azure DevOps eraan heeft toegekend. Er zijn nog twee Microsoft Graph applicatiepermissies nodig voordat de pipeline zijn werk kan doen. Ken deze eenmalig toe, als Microsoft Entra ID-beheerder:
Open portal.azure.com, ga dan naar Microsoft Entra ID → App registrations.
Zoek de appregistratie die Azure DevOps zojuist heeft aangemaakt — terug bij de zojuist aangemaakte service connection (Project Settings → Service connections → je connection → Manage Service Principal) opent deze direct in de Entra-portal.
Klik op API permissions → Add a permission → Microsoft Graph → Application permissions.
Zoek beide op en vink ze aan:
Application.ReadWrite.OwnedBy— nodig als een connectietargetAppNamegebruikt (laat de pipeline de appregistratie van die connectie aanmaken).AppRoleAssignment.ReadWrite.All— nodig zodat de pipeline zichzelf de Airflow “Admin”-rol kan toekennen (zie “De Admin-rol toekennen” hierboven).
Klik op Add permissions.
Klik op Grant admin consent for <your organization>, bevestig daarna met Yes. De permissierij toont nu een groen vinkje onder Status.
Gebruik je targetAppName nergens in je bestand, dan kun je Application.ReadWrite.OwnedBy overslaan. Wil je AppRoleAssignment.ReadWrite.All liever helemaal niet toekennen, sla dan ook die over — de pipeline drukt dan bij de eerste run instructies af voor handmatige toekenning (zie “De Admin-rol toekennen” hierboven, optie (a)).
4. Maak de pipeline aan¶
Klik in de linkerbalk op Pipelines → New pipeline.
Where is your code? → Azure Repos Git → selecteer de repo waarin je de bestanden hebt gezet.
Configure your pipeline → Existing Azure Pipelines YAML file.
Branch:
main(of de branch waarnaar je hebt gepusht). Path: kies jeconnections.yaml-bestand (bijv./customer-connections.yaml).Klik op Continue, bekijk de YAML-preview, klik daarna op de vervolgkeuze naast Run en kies Save (niet Save and run — zie eerst de volgende stap).
Optioneel: geef de pipeline een herkenbare naam — open hem, klik op ⋯ (rechtsboven) → Rename/move, bijv. “Rotate Airflow connections”.
5. Draai eenmaal, vertrouw daarna op het schema¶
Open de pipeline en klik op Run pipeline → Run.
Volg elke stap. Als de admin-rol-stap mislukt, drukt deze de twee exacte oplossingen af — zie “De Admin-rol toekennen” hierboven en Probleemoplossing hieronder.
Zodra elke stap groen is, staan je connecties live in Airflow — controleer in de Airflow-UI op de pagina Admin → Connections de ``connectionId``(s) die je hebt geconfigureerd.
Verder niets te doen: het
schedules:-blok in je YAML zet herhalende runs al klaar. Controleer de eerstvolgende runtijd onder Scheduled runs van de pipeline (klokicoon, rechtsboven op de pipeline-pagina).
Referentie connectietypes¶
De pipelinetemplate dispatcht op connType. Types met een dedicated script nemen getypeerde velden direct over (geen handgeschreven extraJson); elk ander connType valt terug op de generieke Set-AirflowConnection.ps1-stap met hostName/extraJson. Login/password zijn altijd de geroteerde client_id/client_secret, en de tenant-ID wordt tijdens runtime afgeleid uit de Azure-context van de service connection, nooit expliciet uitgeschreven in YAML.
Type |
|
Getypeerde velden |
Opmerkingen |
|---|---|---|---|
HTTP (generieke OAuth-beveiligde API) |
|
|
De ingebouwde |
Databricks |
|
|
Komt overeen met de gedocumenteerde Azure AD SPN-authenticatiemethode van |
Fabric ( |
|
|
Extra |
Fabric Capacity ( |
|
— |
Extra |
Power BI |
|
— |
Extra |
Synapse ( |
|
|
Extra’s |
Data Factory ( |
|
|
Extra’s |
Git (private DAGs-repo) |
|
|
Hetzelfde model van een dedicated app per connectie — gebruik |
Fabric Capacity-toegang (eenmalig)¶
De fabric_capacity-connectie stuurt suspend/resume/scale aan via het ARM-managementvlak, dus de SP ervan heeft een rol op de capacity-resource nodig, geen Contributor. Maak eenmalig een minimale custom rol aan (Fabric Capacity (Smooth) Operator) die Microsoft.Fabric/capacities/{read,write}, capacities/suspend/action, capacities/resume/action, en capacities/skus/read / skus/read toekent, en ken deze vervolgens toe aan de door de pipeline aangemaakte SP voor die connectie (draai de pipeline eerst eenmaal zodat de SP bestaat). Laat write weg als je alleen ooit suspend/resume doet, niet scale.
Probleemoplossing¶
Symptoom |
Waarschijnlijke oorzaak |
|---|---|
Kan de Airflow API niet bereiken (na retries) |
|
Admin-rolstap mislukt met handmatige oplossingsstappen |
De SP van de service connection kan de Airflow “Admin”-rol niet zelf toekennen — ken deze handmatig toe of geef de SP |
401/403 van de Airflow API, ook al is de admin-rolstap geslaagd |
Een vers toegekende rol kan even nodig hebben om door te dringen — draai opnieuw. Blijft het aanhouden, controleer dan of de opgeloste Airflow-app de juiste is (leg deze expliciet vast met |
“does not exist” bij het roteren van het target-secret |
Met |
Kan de target-app niet aanmaken |
De SP van de service connection mist rechten om apps aan te maken — laat een admin de app handmatig aanmaken en leg deze vast via |
Pipeline geslaagd, maar het target-systeem geeft 401/403 aan DAGs |
Een vers aangemaakte SP per connectie heeft credentials maar nog geen toegang — ken eenmalig de resource-kant toegang toe (workspace-rol, ARM RBAC, etc.). |