Erste Schritte mit Azure Blob Storage mit F#

Azure Blob Storage ist ein Dienst, der unstrukturierte Daten in der Cloud als Objekte/Blobs speichert. In Blob Storage können alle Arten von Text- oder Binärdaten gespeichert werden, z. B. ein Dokument, eine Mediendatei oder ein Installer einer Anwendung. Der Blobspeicher wird auch als Objektspeicher bezeichnet.

In diesem Artikel wird die Durchführung gängiger Aufgaben mit Blobspeicher demonstriert. Die Beispiele sind in F# geschrieben und verwenden die Azure Storage-Clientbibliothek für .NET. Die behandelten Aufgaben umfassen das Hochladen, Auflisten, Herunterladen und Löschen von Blobs.

Eine konzeptionelle Übersicht über Blobspeicher finden Sie im .NET-Leitfaden für Blobspeicher.

Voraussetzungen

Um diesen Leitfaden verwenden zu können, müssen Sie zuerst ein Azure-Speicherkonto erstellen. Darüber hinaus benötigen Sie Ihren Speicherzugriffsschlüssel für dieses Konto.

Erstellen eines F#-Skripts und Starten von F# Interactive

Die Beispiele in diesem Artikel können in einer F#-Anwendung oder in einem F#-Skript verwendet werden. Um ein F#-Skript zu erstellen, erstellen Sie eine Datei mit der Erweiterung .fsx, z. B. blobs.fsx, in Ihrer F#-Entwicklungsumgebung.

Ausführen von Skripts

F# Interactive dotnet fsi kann interaktiv oder von der Befehlszeile aus gestartet werden, um ein Skript auszuführen. Die Befehlszeilensyntax lautet wie folgt:

> dotnet fsi [options] [ script-file [arguments] ]

Hinzufügen von Paketen in einem Skript

Verwenden Sie als Nächstes #rnuget:package name, um das Paket Azure.Storage.Blobs und die open-Namespaces zu installieren, z. B.

> #r "nuget: Azure.Storage.Blobs"
open Azure.Storage.Blobs
open Azure.Storage.Blobs.Models
open Azure.Storage.Blobs.Specialized

Hinzufügen von Namespace-Deklarationen

Fügen Sie am Anfang der Datei blobs.fsx die folgenden open-Anweisungen ein:

open System
open System.IO
open Azure.Storage.Blobs // Namespace for Blob storage types
open Azure.Storage.Blobs.Models
open Azure.Storage.Blobs.Specialized
open System.Text

Abrufen der Verbindungszeichenfolge

Für dieses Tutorial benötigen Sie eine Azure Storage-Verbindungszeichenfolge. Weitere Informationen zu Verbindungszeichenfolgen finden Sie unter Konfigurieren von Azure Storage-Verbindungszeichenfolgen.

Für das Tutorial geben Sie die Verbindungszeichenfolge ähnlich wie folgt in das Skript ein:

let storageConnString = "..." // fill this in from your storage account

Erstellen von lokalen Dummydaten

Erstellen Sie zunächst einige lokale Dummydaten im Verzeichnis unseres Skripts. Sie laden diese Daten später hoch.

// Create a dummy file to upload
let localFile = "./myfile.txt"
File.WriteAllText(localFile, "some data")

Erstellen des Blob-Dienstclients

Mit dem Typ BlobContainerClient können Sie Container erstellen und Blobs abrufen, die im Blobspeicher gespeichert sind. Hier sehen Sie eine Möglichkeit zum Erstellen des Containerclients:

let container = BlobContainerClient(storageConnString, "myContainer")

Jetzt können Sie Code schreiben, der Daten aus dem Blobspeicher liest und Daten in den Blobspeicher schreibt.

Erstellen eines Containers

Dieses Beispiel zeigt, wie Sie einen Container erstellen, falls er nicht bereits vorhanden ist.

container.CreateIfNotExists()

Standardmäßig ist der neue Container privat. Das bedeutet, Sie müssen Ihren Speicherzugriffsschlüssel angeben, um Blobs aus diesem Container herunterzuladen. Wenn die Dateien im Container für alle verfügbar sein sollen, können Sie den Container mithilfe des folgenden Codes öffentlich machen:

let permissions = PublicAccessType.Blob
container.SetAccessPolicy(permissions)

Jede Person im Internet kann Blobs in einem öffentlichen Container anzeigen, Sie können sie jedoch nur bearbeiten oder löschen, wenn Sie über den entsprechenden Kontozugriffsschlüssel oder eine SAS (Shared Access Signature) verfügen.

Hochladen eines Blobs in einen Container

Azure Blob Storage unterstützt Block- und Seitenblobs. In den meisten Fällen wird die Verwendung eines Blockblobs empfohlen.

Besorgen Sie sich einen Containerclient ab, und verwenden Sie diesen zum Abrufen eines Blockblobverweises, um eine Datei in einen Blockblob hochzuladen. Sobald Sie über einen Blobverweis verfügen, können Sie jeden Datenstrom in diesen hochladen, indem Sie die Upload -Methode aufrufen. Dieser Vorgang überschreibt den Inhalt des Blobs. Falls keins vorhanden ist, wird ein neues Blockblob erstellt.

// Retrieve reference to a blob named "myblob.txt".
let blockBlob = container.GetBlobClient("myblob.txt")

// Create or overwrite the "myblob.txt" blob with contents from the local file.
use fileStream = new FileStream(localFile, FileMode.Open, FileAccess.Read, FileShare.Read)
do blockBlob.Upload(fileStream)

Auflisten der Blobs in einem Container

Um die Blobs in einem Container aufzuführen, müssen Sie zuerst einen Containerverweis abrufen. Danach können Sie mit der GetBlobs -Methode des Containers die Blobs und/oder darin befindlichen Verzeichnisse abrufen. Dies ermöglicht Zugriff auf die umfassenden Eigenschaften und Methoden für ein zurückgegebenes BlobItem.

for item in container.GetBlobsByHierarchy() do
    printfn $"Blob name: {item.Blob.Name}"

Betrachten Sie z. B. den folgenden Satz von Blockblobs in einem Container mit dem Namen photos:

photo1.jpg
2015/architecture/description.txt
2015/architecture/photo3.jpg
2015/architecture/photo4.jpg
2016/architecture/photo5.jpg
2016/architecture/photo6.jpg
2016/architecture/description.txt
2016/photo7.jpg\

Wenn Sie GetBlobsByHierarchy für einen Container aufrufen (wie im obigen Beispiel), wird eine hierarchische Auflistung zurückgegeben.

Directory: https://<accountname>.blob.core.windows.net/photos/2015/
Directory: https://<accountname>.blob.core.windows.net/photos/2016/
Block blob of length 505623: https://<accountname>.blob.core.windows.net/photos/photo1.jpg

Herunterladen von Blobs

Um Blobs herunterzuladen, rufen Sie zuerst einen Blobverweis ab, und rufen Sie dann die DownloadTo -Methode auf. Im folgenden Beispiel wird die DownloadTo -Methode verwendet, um den Blobinhalt auf ein Datenstromobjekt zu übertragen, das danach in einer lokalen Datei gespeichert werden kann.

// Retrieve reference to a blob named "myblob.txt".
let blobToDownload = container.GetBlobClient("myblob.txt")

// Save blob contents to a file.
do
    use fileStream = File.OpenWrite("path/download.txt")
    blobToDownload.DownloadTo(fileStream)

Sie können auch die DownloadContent -Methode verwenden, um den Inhalt eines Blobs als Textzeichenfolge herunterzuladen.

let text = blobToDownload.DownloadContent().Value.Content.ToString()

Löschen von Blobs

Wenn Sie ein Blob löschen möchten, rufen Sie zunächst einen Blobverweis ab und dann die Delete-Methode dafür auf.

// Retrieve reference to a blob named "myblob.txt".
let blobToDelete = container.GetBlobClient("myblob.txt")

// Delete the blob.
blobToDelete.Delete()

Asynchrones Auflisten von Blobs auf Seiten

Wenn Sie eine große Anzahl von Blobs auflisten oder die Anzahl der Ergebnisse steuern möchten, die in einem Auflistungsvorgang zurückgegeben werden, können Sie Blobs auf Ergebnisseiten auflisten. In diesem Beispiel wird gezeigt, wie Ergebnisse seitenweise zurückgegeben werden.

Dieses Beispiel veranschaulicht eine hierarchische Auflistung mit der GetBlobsByHierarchy-Methode von BlobClient.

let ListBlobsSegmentedInHierarchicalListing(container:BlobContainerClient) =
        // List blobs to the console window, with paging.
        printfn "List blobs in pages:"

        // Call GetBlobsByHierarchy to return an async collection 
        // of blobs in this container. AsPages() method enumerate the values 
        //a Page<T> at a time. This may make multiple service requests.

        for page in container.GetBlobsByHierarchy().AsPages() do
            for blobHierarchyItem in page.Values do 
                printf $"The BlobItem is : {blobHierarchyItem.Blob.Name} "

        printfn ""

Wir können diese hierarchische Auflistungsroutine jetzt wie folgt verwenden. Laden Sie zunächst einige Dummydaten hoch (unter Verwendung der lokalen Datei, die zuvor in diesem Tutorial erstellt wurde).

for i in 1 .. 100 do
    let blob  = container.GetBlobClient($"myblob{i}.txt")
    use fileStream = System.IO.File.OpenRead(localFile)
    blob.Upload(localFile)

Rufen Sie nun die Routine auf.

ListBlobsSegmentedInHierarchicalListing container

Beschreiben eines Anfügeblobs

Anfügeblobs sind für Anfügevorgäng wie die Protokollierung optimiert. Ein Anfügeblob besteht wie ein Blockblob aus Blöcken. Allerdings ist es bei einem Anfügeblob so, dass ein neuer Block immer ans Ende des Blobs angefügt wird. Das Aktualisieren oder Löschen eines vorhandenen Blocks ist in einem Anfügeblob nicht möglich. Anders als bei Blockblobs sind die Block-IDs sind für Anfügeblobs nicht verfügbar.

In einem Anfügeblob kann jeder Block unterschiedlich groß sein, bis maximal 4 MB. Insgesamt können bis zu 50.000 Blöcke enthalten sein. Die maximale Größe eines Anfügeblobs ist deshalb etwas mehr als 195 GB (4 MB X 50.000 Blöcke).

Das folgende Beispiel erstellt ein neues Anfügeblob und fügt einige Daten hinzu, um eine einfache Protokollierung zu simulieren.

// Get a reference to a container.
let appendContainer = BlobContainerClient(storageConnString, "my-append-blobs")

// Create the container if it does not already exist.
appendContainer.CreateIfNotExists() |> ignore

// Get a reference to an append blob.
let appendBlob = appendContainer.GetAppendBlobClient("append-blob.log")

// Create the append blob. Note that if the blob already exists, the 
// CreateOrReplace() method will overwrite it. You can check whether the 
// blob exists to avoid overwriting it by using CloudAppendBlob.Exists().
appendBlob.CreateIfNotExists()

let numBlocks = 10

// Generate an array of random bytes.
let rnd = Random()
let bytesArray = Array.zeroCreate<byte>(numBlocks)
rnd.NextBytes(bytesArray)

// Simulate a logging operation by writing text data and byte data to the 
// end of the append blob.
for i in 0 .. numBlocks - 1 do
    let msg = sprintf $"Timestamp: {DateTime.UtcNow} \tLog Entry: {bytesArray.[i]}\n"
    let array = Encoding.ASCII.GetBytes(msg);
    use stream = new MemoryStream(array)
    appendBlob.AppendBlock(stream)

// Read the append blob to the console window.
let downloadedText = appendBlob.DownloadContent().ToString()
printfn $"{downloadedText}"

Weitere Informationen zu den Unterschieden zwischen den drei Arten von Blobs finden Sie unter Grundlegendes zu Blockblobs, Seitenblobs und Anfügeblobs .

Paralleler Zugriff

Um den parallelen Zugriff auf eine Blob von mehreren Clients oder mehreren Prozessinstanzen zu unterstützen, können Sie ETags oder Leases verwenden.

  • Etag – bietet eine Möglichkeit, um zu ermitteln, dass das Blob oder der Container durch einen anderen Prozess geändert wurde.

  • Lease – bietet eine Möglichkeit zum Abrufen eines exklusiven, erneuerbaren Lese- oder Schreibzugriffs auf ein Blob für einen Zeitraum.

Weitere Informationen finden Sie im Blog zum Verwalten von Parallelität in Microsoft Azure Storage.

Benennen von Containern

Jeder Blob im Azure-Speicher muss sich in einem Container befinden. Der Container ist Teil des Blob-Namens. Beispiel: mydata ist der Name des Containers in diesen Beispiel-Blob-URIs:

  • https://storagesample.blob.core.windows.net/mydata/blob1.txt
  • https://storagesample.blob.core.windows.net/mydata/photos/myphoto.jpg

Ein Containername muss ein gültiger DNS-Name sein und den folgenden Benennungsregeln entsprechen:

  1. Containernamen müssen mit einem Buchstaben oder einer Zahl beginnen und dürfen nur Buchstaben, Zahlen und Bindestriche (-) enthalten.
  2. Jedem Bindestrich (-) muss unmittelbar ein Buchstabe oder eine Zahl vorangehen und folgen von einem Buchstaben oder einer Zahl; zudem dürfen nicht mehrere Bindestriche direkt aufeinander folgen.
  3. Der Containername darf ausschließlich Kleinbuchstaben enthalten.
  4. Containernamen müssen zwischen 3 und 63 Zeichen lang sein.

Der Name eines Containers muss immer aus Kleinbuchstaben bestehen. Wenn der Containername einen Großbuchstaben enthält oder anderweitig gegen die Benennungsregeln für Container verstößt, wird möglicherweise der Fehlercode 400 (Ungültige Anforderung) zurückgegeben.

Verwalten der Sicherheit für Blobs

Standardmäßig sichert Azure Storage Ihre Daten, indem der Zugriff auf den Kontobesitzer beschränkt ist, der im Besitz der Kontozugriffsschlüssel ist. Wenn Sie Blobdaten in Ihrem Speicherkonto freigeben müssen, ist es wichtig, dass die Sicherheit Ihrer Kontozugriffsschlüssel dadurch nicht beeinträchtigt wird. Darüber hinaus können Sie Blobdaten verschlüsseln, um sicherzustellen, dass sie bei der Übertragung zu Azure Storage sicher sind.

Steuern des Zugriffs auf Blobdaten

Standardmäßig können nur Sie als Speicherkontobesitzer auf die Blobdaten in Ihrem Speicherkonto zugreifen. Die Authentifizierung von Anforderungen an Blob Storage erfordert standardmäßig den Kontozugriffsschlüssel. Es kann jedoch wünschenswert sein, anderen Benutzern Zugriff auf bestimmte Blobdaten zu gewähren.

Verschlüsseln von Blobdaten

Azure Storage unterstützt das Verschlüsseln von Blobdaten sowohl auf dem Client als auch auf dem Server.

Siehe auch