Problematik
Die Erweiterung des Datatransfer-Frameworks "BigData" wurde erstellt, weil bei grösseren Dateien die LogicApps auf Limitierungen gestossen sind. Konkret konnte der HTTP-Trigger der LogicApp keine Requests entgegennehmen, die grösser waren als 105 MB.
Limits and configuration reference guide - Azure Logic Apps | Microsoft Docs
Lösungsansatz
Um diese Limitierung zu umgehen, wurde eine Logic App (Standard) erstellt, da dort die Limitierungen manuell angepasst werden können. Leider funktionierte aber auch diese Lösung nicht, da wir auf einen Bug gestossen sind. Die Anpassung an den Limitierungen ist grundsätzlich möglich, jedoch nicht für den HTTP-Trigger: LogicApp Standard - 413 Request entity too large - Microsoft Q&A
Die bestehende Lösung schickt nun direkt aus der Orchestration über einen Helper in den Storage Account. In der LogicApp Consumption wurde der Trigger dementsprechend auf einen BlobStorage-Trigger angepasst, welcher erst bei 1 GB eine Limitierung aufweist.
Falls die Limitierung von 1 GB künftig nicht ausreichen sollte, müsste auf eine LogicApp Standard umgestellt und dort die Limitierung des Triggers hochgestuft werden.
Ablauf
BizTalk Helper Klasse
TLS
Am Anfang der Methode in der Helper-Klasse, wird das Sicherheitsprotokoll vom standardmässigen TLS1.0 auf TLS1.2 umgestellt, da man ansonsten in den StorageAccount-Properties auf TLS1.0 umstellen müsste.
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
Dies kann auch in Azure konfiguriert werden:
Cloud Storage Account
Im nächsten Schritt wird in einer Helper-Klasse, anhand des Strings „sendPort“, der den ConncetionString beinhaltet, eine Verbindung zum StorageAccount aufgebaut und der Container "bigdata" ausgewählt. Anhand der Metadata-Property "message.FileName" wird ein Blob mit dem entsprechenden Namen erzeugt:
// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(sendPort);
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("bigdata");
// Retrieve reference to a blob by the given filename
CloudBlockBlob blockBlob = container.GetBlockBlobReference(message.FileName);
Anschliessend wird der FileContent als Byte-Array als BlobContent hochgeladen:
// Create or overwrite the blob with contents from the message
blockBlob.UploadFromByteArray(content, 0, content.Length);
Azure
KeyVault
Im KeyVault werden die neuen Secrets "AZURE-StorageAccountConnectionString" für die spätere Verwendung angelegt.
Trigger / LogicApp
"When a blob is added or modified in Azure Storage"
Der Trigger ist mit dem StorageAccount und dem Container bigdata verbunden. Es wird jede Minute geprüft, ob ein neuer Blob hinzugefügt wurde.
Die JSON-Response wird geparsed, um die Properties verwenden zu können.
Get blob Content
Anschliessend holen wir uns mit "Get blob Content" den FileContent. Dieser kann dann verarbeitet und zum Schluss an ein Zielsystem geschickt werden.
Fazit
Es gibt viele Wege, grosse Datenmengen zu übertragen. Die in diesem Artikel beschriebene Art ist nur eine Variante, die spezifisch für ein Übertragen mit BizTalk und Azure verwendet werden kann. Jedoch stellen wir fest, dass auch in der Cloud immer wieder (Grössen-) Grenzen gesetzt werden und man sich gut überlegen sollte, welche Architektur man verwendet.
Das ist Beitrag von Alain Germann, QUIBIQ Schweiz AG