Rozpoczynanie pracy z usługą Azure Blob Storage przy użyciu języka F#

Azure Blob Storage to usługa, która przechowuje dane bez struktury w chmurze jako obiekty/obiekty blob. Magazyn obiektów blob umożliwia przechowywanie dowolnego typu danych tekstowych lub binarnych, takich jak dokumenty, pliki multimedialne lub instalatory aplikacji. Magazyn obiektów blob jest również nazywany magazynem obiektów.

W tym artykule pokazano, jak wykonywać typowe zadania przy użyciu usługi Blob Storage. Przykłady są napisane przy użyciu języka F# przy użyciu biblioteki klienta usługi Azure Storage dla platformy .NET. Omówione zadania obejmują sposób przekazywania, wyświetlania listy, pobierania i usuwania obiektów blob.

Aby zapoznać się z koncepcyjnym omówieniem magazynu obiektów blob, zobacz przewodnik platformy .NET dotyczący magazynu obiektów blob.

Wymagania wstępne

Aby użyć tego przewodnika, musisz najpierw utworzyć konto usługi Azure Storage. Potrzebujesz również klucza dostępu do magazynu dla tego konta.

Tworzenie skryptu języka F# i uruchamianie interaktywnego języka F#

Przykłady w tym artykule mogą być używane w aplikacji języka F# lub skryptu języka F#. Aby utworzyć skrypt języka F#, utwórz plik z .fsx rozszerzeniem, na przykład blobs.fsx, w środowisku deweloperów języka F#.

Jak wykonywać skrypty

Program F# Interactive, dotnet fsi, można uruchomić interaktywnie lub można go uruchomić z poziomu wiersza polecenia, aby uruchomić skrypt. Składnia wiersza polecenia to

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

Dodawanie pakietów w skry skrycie

Następnie użyj polecenia #rnuget:package name , aby zainstalować Azure.Storage.Blobs pakiet i open przestrzenie nazw. Na przykład

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

Dodawanie deklaracji przestrzeni nazw

Dodaj następujące instrukcje open na początku pliku blobs.fsx:

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

Uzyskiwanie parametrów połączenia

Na potrzeby tego samouczka potrzebujesz parametry połączenia usługi Azure Storage. Aby uzyskać więcej informacji na temat parametry połączenia, zobacz Konfigurowanie ciągów Połączenie ion magazynu.

W tym samouczku wprowadzisz parametry połączenia w skry skrycie, w następujący sposób:

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

Tworzenie niektórych lokalnych danych fikcyjnych

Przed rozpoczęciem utwórz fikcyjne dane lokalne w katalogu naszego skryptu. Później przekażesz te dane.

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

Tworzenie klienta usługi obiektów blob

Typ BlobContainerClient umożliwia tworzenie kontenerów i pobieranie obiektów blob przechowywanych w usłudze Blob Storage. Oto jeden ze sposobów tworzenia klienta kontenera:

let container = BlobContainerClient(storageConnString, "myContainer")

Teraz możesz przystąpić do pisania kodu, który będzie odczytywać dane z Magazynu obiektów blob i zapisywać je w nim.

Tworzenie kontenera

W tym przykładzie pokazano, jak utworzyć kontener, jeśli jeszcze nie istnieje:

container.CreateIfNotExists()

Domyślnie nowy kontener jest prywatny, co oznacza, że musisz podać klucz dostępu do magazynu, aby pobierać obiekty blob z tego kontenera. Jeśli chcesz, aby pliki w kontenerze były dostępne dla wszystkich, możesz ustawić kontener jako publiczny przy użyciu następującego kodu:

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

Wszyscy użytkownicy Internetu mogą wyświetlać obiekty blob w kontenerze publicznym, ale można je modyfikować lub usuwać tylko przy użyciu odpowiedniego klucza dostępu do konta lub sygnatury dostępu współdzielonego.

Przekazywanie obiektu blob do kontenera

Azure Blob Storage obsługuje blokowe i stronicowe obiekty blob. W większości przypadków zalecanym typem jest blokowy obiekt blob.

Aby przekazać plik do blokowego obiektu blob, pobierz klienta kontenera i użyj go do uzyskania odwołania do blokowych obiektów blob. Po utworzeniu odwołania do obiektu blob możesz przekazać do niego dowolny strumień danych, wywołując metodę Upload . Ta operacja zastępuje zawartość obiektu blob, tworząc nowy blokowy obiekt blob, jeśli żaden z nich nie istnieje.

// 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)

Wyświetlanie listy obiektów blob w kontenerze

Aby wyświetlić listę obiektów blob w kontenerze, należy najpierw uzyskać odwołanie do kontenera. Następnie możesz użyć metody kontenera GetBlobs , aby pobrać w nim obiekty blob i/lub katalogi. Aby uzyskać dostęp do bogatego zestawu właściwości i metod dla zwracanego BlobItemobiektu .

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

Rozważmy na przykład następujący zestaw blokowych obiektów blob w kontenerze o nazwie photos:

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

Po wywołaniu GetBlobsByHierarchy kontenera (jak w powyższym przykładzie) zwracana jest hierarchiczna lista.

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

Pobieranie obiektów blob

Aby pobrać obiekty blob, najpierw pobierz odwołanie do obiektu blob, a następnie wywołaj metodę DownloadTo . W poniższym przykładzie użyto DownloadTo metody transferu zawartości obiektu blob do obiektu strumienia, który następnie można utrwał do pliku lokalnego.

// 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)

Możesz również użyć DownloadContent metody , aby pobrać zawartość obiektu blob jako ciąg tekstowy.

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

Usuwać obiekty blob

Aby usunąć obiekt blob, najpierw uzyskaj odwołanie do obiektu blob, a następnie wywołaj metodę Delete .

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

// Delete the blob.
blobToDelete.Delete()

Asynchroniczne wyświetlanie obiektów blob na stronach

Jeśli chcesz wyświetlić dużą liczbę obiektów blob lub kontrolować liczbę wyników zwracanych przez jedną operację wyświetlania listy, możesz wyświetlić obiekty blob na stronach wyników. W tym przykładzie pokazano, jak zwracać wyniki na stronach.

W tym przykładzie pokazano hierarchiczną listę przy użyciu GetBlobsByHierarchy metody .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 ""

Teraz możemy użyć tej hierarchicznej procedury wyświetlania listy w następujący sposób. Najpierw przekaż fikcyjne dane (przy użyciu pliku lokalnego utworzonego wcześniej w tym samouczku).

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

Teraz nazwij procedurę.

ListBlobsSegmentedInHierarchicalListing container

Zapisywanie do uzupełnialnego obiektu blob

Uzupełnialny obiekt blob jest zoptymalizowany pod kątem operacji dołączania, takich jak rejestrowanie. Podobnie jak blokowy obiekt blob, uzupełnialne obiekty blob składają się z bloków, ale po dodaniu nowego bloku do uzupełnialnych obiektów blob jest on zawsze dołączany na końcu obiektu blob. Nie można zaktualizować lub usunąć istniejącego bloku w uzupełnialnym obiekcie blob. Identyfikatory bloków w uzupełnialnym obiekcie blob nie są widoczne, jak w przypadku blokowego obiektu blob.

Każdy blok w uzupełnialnym obiekcie blob może różnić się rozmiarem, który może wynosić maksymalnie 4 MB, a uzupełnialny obiekt blob może zawierać do 50 000 bloków. Z tego względu maksymalny rozmiar uzupełnialnego obiektu blob nieznacznie przekracza 195 GB (4 MB X 50 000 bloków).

Poniższy przykład tworzy nowy uzupełnilny obiekt blob i dołącza do niego pewne dane, symulując prostą operację rejestrowania.

// 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}"

Aby uzyskać więcej informacji o różnicach między tymi trzema typami obiektów blob, zobacz Understanding Block Blobs, Page Blobs, and Append Blobs (Omówienie blokowych i stronicowych obiektów blob oraz uzupełnialnych obiektów blob).

Równoczesny dostęp

Aby obsługiwać współbieżny dostęp do obiektu blob z wielu klientów lub wielu wystąpień procesu, możesz użyć elementów ETag lubdzierżaw.

  • Etag — umożliwia wykrycie, że obiekt blob lub kontener został zmodyfikowany przez inny proces

  • Dzierżawa — umożliwia uzyskanie wyłącznego, odnawialnej, odnawialnej, zapisu lub usuwania dostępu do obiektu blob przez pewien czas

Aby uzyskać więcej informacji, zobacz Zarządzanie współbieżnością w usłudze Microsoft Azure Storage.

Nazewnictwo kontenerów

Każdy obiekt blob w usłudze Azure Storage musi znajdować się w kontenerze. Kontener jest częścią nazwy obiektu blob. Na przykład mydata to nazwa kontenera w następujących przykładowych identyfikatorach URI obiektów blob:

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

Nazwa kontenera musi być prawidłową nazwą DNS zgodną z następującymi zasadami nazewnictwa:

  1. Nazwa kontenera musi zaczynać się literą lub cyfrą i może zawierać tylko litery, cyfry i znak kreski (-).
  2. Bezpośrednio przed każdym znakiem kreski (-) i bezpośrednio po nim musi występować litera lub cyfra. W nazwach kontenerów następujące po sobie kreski są niedozwolone.
  3. Wszystkie litery w nazwie kontenera muszą być małymi literami.
  4. Nazwy kontenerów muszą zawierać od 3 do 63 znaków.

Nazwa kontenera musi być zawsze małymi literami. Jeśli w nazwie kontenera wystąpi wielka litera lub reguły nazewnictwa dotyczące kontenerów zostaną naruszone w inny sposób, może zostać wyświetlony błąd 400 (Nieprawidłowe żądanie).

Zarządzanie zabezpieczeniami obiektów blob

Domyślnie usługa Azure Storage chroni dane, umożliwiając dostęp wyłącznie właścicielowi konta, który ma klucze dostępu do konta. W przypadku potrzeby udostępnienia danych obiektów blob na koncie magazynu ważne jest, aby zrobić to bez uszczerbku dla bezpieczeństwa kluczy dostępu do konta. Dodatkowo można zaszyfrować dane obiektu blob, aby zapewnić ich bezpieczeństwo podczas przesyłania przez sieć oraz w usłudze Azure Storage.

Kontrolowanie dostępu do danych obiektów blob

Domyślnie dane obiektów blob na koncie magazynu są dostępne tylko dla właściciela konta magazynu. Domyślnie do uwierzytelniania żądań dotyczących Magazynu obiektów blob jest wymagany klucz dostępu do konta. Możesz jednak udostępnić innym użytkownikom pewne dane obiektów blob.

Szyfrowanie danych obiektów blob

Usługa Azure Storage obsługuje szyfrowanie danych obiektów blob zarówno na kliencie, jak i na serwerze.

Zobacz też