Microsoft Fabric Notebook aus SSIS (Integration Services) per REST API starten

In diesem Beitrag zeige ich Schritt für Schritt, wie sich aus einem SQL Server Integration Services (SSIS) Paket heraus ein Microsoft Fabric Notebook starten lässt.

Das Szenario ist einfach:
Nach einem erfolgreichen Datenupload oder einer sonstigen ETL-Verarbeitung soll in Fabric eine weiterführende Verarbeitung angestoßen werden, beispielsweise Transformationen, Validierungen oder ein Import in ein Lakehouse. Statt diesen Schritt manuell oder zeitgesteuert auszuführen, kann das Notebook direkt aus dem SSIS-Paket heraus per REST API gestartet werden.

Im Folgenden beschreibe ich die notwendigen Schritte und zeige die relevanten Codebestandteile.

Architekturüberblick

Die Lösung besteht aus folgenden Komponenten:

  1. App-Registrierung (Service Principal) in Azure
  2. Berechtigung des Service Principals im Fabric-Arbeitsbereich
  3. Fabric Notebook
  4. SSIS-Paket mit Script Task
  5. Authentifizierung per OAuth2 (Client Credentials Flow)
  6. REST API-Aufruf zum Start des Notebooks

1. App-Registrierung (Service Principal) in Azure

Zunächst wird im Azure-Portal eine App-Registrierung erstellt.

Benötigt werden:

  • Client-ID
  • Tenant-ID
  • Client-Secret

Diese Informationen werden später im SSIS-Paket als Projektparameter hinterlegt.

Azure App-Registrierung – Übersicht mit Client-ID, Tenant-ID und Client Secret

2. Service Principal im Fabric-Arbeitsbereich berechtigen

Damit das Notebook gestartet werden kann, muss der Service Principal im entsprechenden Fabric-Arbeitsbereich berechtigt werden.

Vorgehen:

  • Arbeitsbereich öffnen
  • Zugriff verwalten
  • Service Principal hinzufügen
  • Mindestens „Mitwirkender“ oder entsprechend ausreichende Berechtigung vergeben
Fabric Workspace – Zugriff verwalten

3. Notebook-ID und Workspace-ID ermitteln

Für den REST-Aufruf werden zwei IDs benötigt:

  • Workspace-ID
  • Notebook-ID

Die Workspace-ID findet sich in der URL des Arbeitsbereichs.
Die Notebook-ID kann ebenfalls aus der URL des Notebooks entnommen werden.

Beispielstruktur:

https://app.powerbi.com/groups/<Workspace-ID>/synapsenotebooks/<Notebook-ID>
URL mit markierter Workspace-ID und Notebook-ID

4. Projektparameter im SSIS-Paket definieren

In Visual Studio (SSDT) werden zunächst Projektparameter angelegt:

  • ClientId
  • TenantId
  • ClientSecret

Diese enthalten die Informationen aus der App-Registrierung.

SSIS Projektparameter

Zusätzlich werden auf Paketebene Variablen definiert:

  • WorkspaceId
  • NotebookId
SSIS Paketvariablen

5. Script Task konfigurieren

Im Control Flow wird ein Script Task eingefügt.

Dort müssen die Projektparameter und Paketvariablen als ReadOnlyVariables eingebunden werden.

6. Benötigte Namespaces hinzufügen

Im Script-Editor müssen folgende Namespaces ergänzt werden:

#region Namespaces
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Web.Script.Serialization;
using STT = System.Threading.Tasks;   // Alias for System.Threading.Tasks
#endregion

Zusätzlich müssen die entsprechenden Referenzen eingebunden werden:

  • System.Net.Http
  • System.Web
  • System.Web.Extensions

7. Access Token abrufen (Client Credentials Flow)

Zunächst wird ein Access Token vom Microsoft Identity Platform Endpoint angefordert.

Methode zum Abrufen des Tokens

        /// <summary>
        /// Get an access token for the Fabric API via client credentials flow.
        /// Scope: https://api.fabric.microsoft.com/.default
        /// </summary>
        private static async STT.Task<string> GetAccessTokenAsync(
            string tenantId,
            string clientId,
            string clientSecret)
        {
            string url = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token";

            using (var client = new HttpClient())
            {
                var body = new FormUrlEncodedContent(new[]
                {
            new KeyValuePair<string,string>("client_id", clientId),
            new KeyValuePair<string,string>("client_secret", clientSecret),
            new KeyValuePair<string,string>("grant_type", "client_credentials"),
            new KeyValuePair<string,string>("scope", "https://api.fabric.microsoft.com/.default")
        });

                var response = await client.PostAsync(url, body);
                var json = await response.Content.ReadAsStringAsync();

                if (!response.IsSuccessStatusCode)
                {
                    throw new ApplicationException(
                        $"Token Request failed: {(int)response.StatusCode} {response.ReasonPhrase}\r\n" +
                        $"Body: {json}");
                }

                var serializer = new JavaScriptSerializer();
                var dict = serializer.Deserialize<Dictionary<string, object>>(json);

                if (!dict.ContainsKey("access_token"))
                    throw new ApplicationException("Token Response enth�lt kein access_token.");

                return dict["access_token"].ToString();
            }
        }

8. Notebook per REST API starten

Sobald das Access Token vorliegt, kann das Notebook gestartet werden.

Methode zum Starten des Notebooks

        /// <summary>
        /// Call up the notebook in Fabric via the job scheduler.
        /// POST https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items/{artifactId}/jobs/instances?jobType=RunNotebook
        /// Body: { "executionData": {} }
        /// </summary>
        private static async STT.Task RunNotebookJobAsync(
            string accessToken,
            string workspaceId,
            string artifactId)
        {
            string url = $"https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items/{artifactId}/jobs/instances?jobType=RunNotebook";

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Authorization =
                    new AuthenticationHeaderValue("Bearer", accessToken);

                string jsonBody = "{\"executionData\": {}}";

                using (var content = new StringContent(jsonBody, Encoding.UTF8, "application/json"))
                {
                    var response = await client.PostAsync(url, content);
                    var responseBody = await response.Content.ReadAsStringAsync();

                    if (!response.IsSuccessStatusCode)
                    {
                        throw new ApplicationException(
                            $"Fabric API-Call failed: {(int)response.StatusCode} {response.ReasonPhrase}\r\n" +
                            $"Response: {responseBody}");
                    }
                }
            }
        }

9. Main-Methode im Script Task

In der Main()-Methode werden die SSIS-Variablen ausgelesen und die oben definierten Methoden aufgerufen:

        /// <summary>
        /// This method is called when this script task executes in the control flow.
        /// Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
        /// To open Help, press F1.
        /// </summary>
        public void Main()
        {
            try
            {
                string tenantId = (string)Dts.Variables["$Project::TenantId"].Value;
                string clientId = (string)Dts.Variables["$Project::ClientId"].Value;
                string clientSecret = (string)Dts.Variables["$Project::ClientSecret"].GetSensitiveValue();
                string workspaceId = (string)Dts.Variables["User::WorkspaceId"].Value;
                string notebookItemId = (string)Dts.Variables["User::NotebookItemId"].Value;

                string accessToken = GetAccessTokenAsync(
                    tenantId, clientId, clientSecret
                ).GetAwaiter().GetResult();

                RunNotebookJobAsync(
                    accessToken, workspaceId, notebookItemId
                ).GetAwaiter().GetResult();

                Dts.TaskResult = (int)ScriptResults.Success;
            }
            catch (Exception ex)
            {
                Dts.Events.FireError(
                    0,
                    "RunFabricNotebook",
                    ex.ToString(),
                    string.Empty,
                    0);

                Dts.TaskResult = (int)ScriptResults.Failure;
            }
        }

10. Ablauf testen

Wird das SSIS-Paket nun ausgeführt, sollte im Fabric-Arbeitsbereich unter „Letzte Ausführungen“ ein neuer Notebook-Run erscheinen.

SSIS – erfolgreiche Skript-Task-Ausführung
Fabric – erfolgreiche Notebook-Ausführung

Hinweise zur Praxis

  • Secrets sollten nicht ungeschützt im Projekt gespeichert werden.
  • In produktiven Umgebungen empfiehlt sich eine sichere Ablage (z. B. Azure Key Vault).
  • Fehlerbehandlung kann erweitert werden (Logging der Response-Inhalte).
  • Der Rückgabestatus des Notebook-Jobs kann zusätzlich abgefragt werden, falls eine synchrone Verarbeitung notwendig ist.

Fazit

Mit diesem Ansatz lässt sich ein Fabric Notebook sauber in bestehende SSIS-Prozesse integrieren. Der Aufruf erfolgt standardisiert über die REST API, authentifiziert per Service Principal.

Damit wird es möglich, klassische Integration-Services-Prozesse mit Fabric-Workloads zu kombinieren, ohne manuelle Zwischenschritte.

Bei Bedarf lässt sich das Muster erweitern, etwa um:

  • Übergabe von Parametern an das Notebook
  • Polling auf den Jobstatus
  • Integration in komplexere Orchestrierungen

Der technische Kern bleibt jedoch derselbe. Token beschaffen, REST-Endpunkt aufrufen, Notebook-Job starten.

Veröffentlicht von

Marcus Wegener

Marcus Wegener

Marcus Wegener ist Anwendungsentwickler für Business Intelligence und erstellt Lösungen, mit denen sich große Datenmengen schnell analysieren lassen. Kunden nutzen seine Lösungen, um die Vergangenheit zu analysieren, die Gegenwart zu steuern und die Zukunft zu planen, um damit mehr Erfolg zu generieren. Dabei ist seine einzigartige Kombination aus Wissen und Auffassungsgabe ein Garant für ihren Erfolg.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

I accept that my given data and my IP address is sent to a server in the USA only for the purpose of spam prevention through the Akismet program.More information on Akismet and GDPR.