Verarbeitung von Azure Blob Storage-Ereignissen mit Azure Event Grid, Logic Apps und Azure Functions (Real Case)

Von einem Kunden gemeldetes Problem:Wir verwenden Azure Blob Storage mit einer Dynamics 365 Business Central-Lösung. Die Lösung ermöglicht das Erstellen und Löschen von Dateien in einem Blob-Storage-Container direkt aus Business Central. Wir hätten gerne einen Prozess, der beim Löschen einer Datei aus dem Blob-Storage automatisch in einen Backup-Storage kopiert und eine Benachrichtigung an die IT-Abteilung sendet“.

Partnerlösung: Codeunit mit folgenden Verfahren:

  • Verfahren zur Verarbeitung des Uploads von Dateien in einen Blob-Storage-Speicher
  • Verfahren zum Löschen von Blobs aus einem Speicher
  • Verfahren zum Kopieren eines Blobs von Speicher A nach Speicher B vor dem Löschen
  • Verfahren zum Senden von E-Mails an eine E-Mail-Adresse

Hauptprobleme:

  • Zuverlässigkeit des gesamten Prozesses (einige Fehler können den Backup-Prozess unterbrechen)
  • Durchführung der Transaktion

Ich denke, dies ist ein Beispiel für eine Lösung, die „normalerweise funktioniert“ (und möchten Sie eine Lösung, die normalerweise funktioniert?), die ich aber nicht „Cloud-optimiert“ und „gut strukturiert“ definieren kann. Wieso den? Hauptsächlich, weil:

  • Sie sollten nicht alle Prozesse in AL-Code abwickeln (ich werde nie aufhören, das zu sagen!)
  • In einer Cloud-Welt können Sie es besser

Wie können wir diesen Workflow neu gestalten, um einen leistungsfähigeren und zuverlässigeren Prozess in der Cloud zu haben? Nur durch die Verwendung der richtigen Dienste, anstatt alles innerhalb des ERP-Codes zu erledigen!

Mithilfe von können Sie zuverlässig auf Azure Storage-Ereignisse reagieren Azure Event Grid. Ereignisraster ist ein hochskalierbarer, serverloser Event-Broker, mit dem Sie Anwendungen mithilfe von Ereignissen integrieren können (ereignisgesteuerte Architektur). Veranstaltungen werden geliefert von Ereignisraster das Teilnehmer Ziele wie Anwendungen, Azure-Dienste oder beliebige Endpunkte, auf die Event Grid Netzwerkzugriff hat. Die Quelle dieser Ereignisse können andere Anwendungen, SaaS-Dienste und Azure-Dienste sein. Mit Ereignisraster Sie können Ereignisse verwenden, um Ereignisse in Systemstatusänderungen an andere Anwendungen oder Dienste zu übermitteln, und Sie können Filter verwenden, um bestimmte Ereignisse an verschiedene Endpunkte weiterzuleiten, an mehrere Endpunkte zu multicasten und sicherzustellen, dass Ihre Ereignisse zuverlässig übermittelt werden.

In einer modernen SaaS-Architektur kann der zuvor beschriebene Prozess wie im folgenden Diagramm implementiert werden:

Hier:

  • Ein Blob-Speicher (hier als Hauptspeicher) sendet jedes Mal, wenn Sie ein Blob löschen, ein Löschereignis an Azure Event Grid.
  • Das Azure Event Grid löst eine Azure Logic-App-Instanz (Ereignishandler) aus.
  • Die Logik-App sendet eine E-Mail mit den Details der gelöschten Datei an die IT-Abteilung.
  • Die Logik-App löst eine Azure-Funktion aus, die die Details des Blob-Löschereignisses übergibt.
  • Die Azure-Funktion übernimmt die Verarbeitung des gelöschten Blobs, etwa:
    • Protokollieren der Löschdetails in Azure Application Insights
    • Archivieren einer Kopie der gelöschten Datei in einem anderen Speicherkonto (hier als backup_storage).

Wie können Sie die Architektur konfigurieren?

Der Hauptteil hier besteht darin, die Quelle und das Ziel von Event Grid zu konfigurieren. Bevor Sie dies tun, denken Sie bitte daran, dass Sie den Event Grid-Anbieter aktiviert haben müssen, damit Ereignisse in einem Abonnement korrekt ausgelöst werden. Dies ist eine wichtige Sache, die Sie sich merken sollten, denn wenn es nicht aktiviert ist, werden Ihre Ressourcenereignisse nie ausgelöst (und Sie verlieren Stunden, um zu prüfen, warum …).

Wählen Sie dazu Ihr Abonnement aus und klicken Sie dann auf Ressourcenanbieter und suche nach “Microsoft.EventGrid“. Wenn der Anbieter nicht registriert ist, klicken Sie auf Registrieren um es zu aktivieren:

Dies ist zwingend erforderlich, damit Ereignisse korrekt geroutet werden.

Lassen Sie uns nun einen Ereignisabonnenten konfigurieren, indem Sie ein neues Leerzeichen erstellen Azure-Logik-App (Verbrauchsplan hier, empfohlen, wenn Sie planen, nicht viele dieser Ereignisse pro Tag zu haben). In dem Löst aus Definition, Suche nach Azure Event Grid und wählen Sie die aus Wenn ein Ressourcenereignis eintritt Abzug:

Wir können unseren Ereignisabonnement-Trigger wie folgt konfigurieren:

Hier:

  • Ressourcentyp muss in diesem Fall der Typ der Azure-Ressource sein, um Ereignisse zu abonnieren Microsoft.Storage.StorageAccounts.
  • Ressourcenname ist der Name Ihres Speicherkontos.
  • In dem Ereignistyp fügen Sie alle Ereignisse hinzu, die Sie abonnieren möchten (in diesem Szenario möchten wir abonnieren Microsoft.Storage.BlobDeleted Veranstaltung).

Dieses Ereignis gibt einen JSON-Text zurück, der Informationen über das gelöschte Blob enthält. Der Körper ist in etwa so:

{
  "topic": "/subscriptions/YOURSUBSCRIPTIONID/resourceGroups/d365bcdemo/providers/Microsoft.Storage/storageAccounts/d365bcdemostorage",
  "subject": "/blobServices/default/containers/main_storage/blobs/MyFile.jpg",
  "eventType": "Microsoft.Storage.BlobDeleted",
  "id": "11856a49-a01e-0041-568d-c61731068475",
  "data": {
    "api": "DeleteBlob",
    "requestId": "11856a49-a01e-0041-568d-c61731000000",
    "eTag": "0x8DA94A4F06C103D",
    "contentType": "image/jpeg",
    "contentLength": 71982,
    "blobType": "BlockBlob",
    "url": "https://d365bcdemostorage.blob.core.windows.net/imagecontainer/MyFile.jpg",
    "sequencer": "000000000000000000000000000021AF0000000001accbc7",
    "storageDiagnostics": {
      "batchId": "87a5c50f-4006-0076-008d-c6c59d000000"
    }
  },
  "dataVersion": "",
  "metadataVersion": "1",
  "eventTime": "2022-09-12T09:55:35.5507773Z"
}

Um eine E-Mail mit den Details des ausgelösten Ereignisses zu senden, können Sie eine Outlook-Aktion wie die folgende hinzufügen (wählen Sie die Ausgabefelder aus der vorherigen Aktion aus):

Was passiert, wenn Sie die Logik-App speichern?

Wenn Sie Ihr Speicherkonto auswählen und auf klicken Veranstaltungenkönnen Sie sehen, dass ein Ereignisabonnement hinzugefügt wurde:

Das erstellte Ereignisabonnement ist unsere als Webhook registrierte Logik-App. Auf diese Weise, Azure Event Grid ruft einen HTTPS-Endpunkt auf, der von unserer Logik-App überwacht wird, wenn das Löschereignis im Blobspeicher ausgelöst wird.

Sie können das Ereignisabonnement testen, indem Sie eine Datei aus dem Blobspeicher hochladen und herunterladen. Sie können sehen, dass ein Ereignis ausgelöst wird:

Wenn Sie zum Ereignisabonnenten (unsere Azure Logic App) gehen, können Sie sehen, dass es korrekt ausgelöst wurde und dass die Ausgabe des Auslösers den JSON-Text mit den Details des gelöschten Blobs enthält:

Um diese Löschung zu handhaben, übergeben wir diesen JSON-Text an eine Azure-Funktion (HttpTrigger), die ihn analysiert, und:

  • ruft die Operation aus der ab Ereignistyp aufstellen (BlobGelöscht oder andere Ereignisse, die Sie behandeln möchten);
  • Ruft die gelöschte Datei und den Containernamen aus der ab URL aufstellen
  • verschiebt die gelöschte Datei in ein neues Speicherkonto (backup_storage)
  • schreibt ein benutzerdefiniertes Protokoll in Application Insights

Die Azure-Funktion verfügt über eine Methode zum Verschieben des Blobs vom ursprünglichen Ziel in den Sicherungsspeicher vor dem Löschen. Der Pseudocode dieser Methode ist der folgende:

private static async Task CopySourceBlobToDestination(CloudBlockBlob sourceBlob,CloudBlockBlob destinationBlob, ILogger log)
{   
    log.LogInformation("Blob copy started...");
    try{
        using (var stream = await sourceBlob.OpenReadAsync())
        {      
          await destinationBlob.UploadFromStreamAsync(stream);
        }
        log.LogInformation("Blob copy completed successfully.");      
    }
    catch(Exception ex){
        log.LogError("Blob copy error: " + ex.Message);        
    }
    finally{
        log.LogInformation("CopySourceBlobToDestination completed");
    }
}

Der vollständige Azure-Funktionscode ist hier auf meinem Github verfügbar.

Auf diese Weise haben wir den Prozess vollständig serverlos und ohne Verwendung des ERP gehandhabt (dies ist keine ERP-Aufgabe, oder?).

Mit dem Event-Grid-Abonnement können Sie auch mehr tun, wie zum Beispiel das Filtern auf Themen anwenden. Stellen Sie sich zum Beispiel vor, dass ich diesen Prozess nur behandeln möchte, wenn eine PDF-Datei aus dem Speicherkonto gelöscht wird (also wird der Prozess ausgelöst, wenn eine .pdf-Datei gelöscht wird, und nicht ausgelöst, wenn eine .jpg-Datei gelöscht wird).

Wählen Sie dazu Ihr Speicherkonto aus und klicken Sie auf Veranstaltungen und wählen Sie dann Ihr registriertes Ereignisabonnement aus (in diesem Fall den Logik-App-Webhook). In dem Filter Auf der Registerkarte des Ereignisabonnements können Sie etwa Folgendes angeben:

Und Sie können auch mehr tun (wie das Sammeln von Nachrichten und mehr), aber das ist eine andere Geschichte.

Wie Sie sehen können, wird ein Geschäftsprozess, der zuvor mit AL-Code mit vielen Zuverlässigkeitsproblemen verarbeitet wurde, jetzt vollständig von der Azure-Plattform mit serverloser Verarbeitung verarbeitet. Mein Mantra „Lass das ERP das ERP machen“ gilt immer…

.

Author: admin

Leave a Reply

Your email address will not be published.