Начало работы с Хранилищем BLOB-объектов Azure с помощью языка F#

Хранилище BLOB-объектов Azure — это служба, в которой хранятся неструктурированные данные в облаке в виде объектов или BLOB-объектов. В хранилище BLOB-объектов могут храниться текстовые или двоичные данные любого типа, например документы, файлы мультимедиа или установщики приложений. Хранилище BLOB-объектов иногда также называют хранилищем объектов.

В этой статье показано, как выполнять распространенные задачи с помощью хранилища BLOB-объектов. Примеры написаны с помощью F# с помощью клиентской библиотеки служба хранилища Azure для .NET. Описанные задачи включают отправку, перечисление, скачивание и удаление больших двоичных объектов.

Общие сведения о хранилище BLOB-объектов см . в руководстве по .NET для хранилища BLOB-объектов.

Необходимые компоненты

Чтобы использовать это руководство, необходимо сначала создать учетную запись хранения Azure. Вам также нужен ключ доступа к хранилищу для этой учетной записи.

Создание скрипта F# и запуск интерактивного F#

Примеры из этой статьи можно использовать в приложении F# или скрипте F#. Чтобы создать скрипт F#, создайте файл с .fsx расширением, например blobs.fsxв среде разработки F#.

Выполнение скриптов

F# Interactive, dotnet fsiможно запустить в интерактивном режиме или запустить его из командной строки для запуска скрипта. Синтаксис командной строки:

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

Добавление пакетов в скрипт

Затем используйте #rnuget:package name для установки Azure.Storage.Blobs пакета и open пространств имен. Например,

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

Добавление объявлений пространств имен

Добавьте в начало файла blobs.fsx следующие инструкции open:

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

Получение строки подключения

Вам потребуется служба хранилища Azure строка подключения для этого руководства. Дополнительные сведения о строка подключения см. в разделе "Настройка строк служба хранилища Подключение ion".

В этом руководстве вы вводите строка подключения в скрипте, как показано ниже.

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

Создание некоторых локальных фиктивных данных

Прежде чем начать, создайте некоторые фиктивные локальные данные в каталоге нашего скрипта. Позже вы отправите эти данные.

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

Создание клиента службы BLOB-объектов

Тип BlobContainerClient позволяет создавать контейнеры и извлекать большие двоичные объекты, хранящиеся в хранилище BLOB-объектов. Вот один из способов создания клиента контейнера:

let container = BlobContainerClient(storageConnString, "myContainer")

Теперь вы можете написать код, который считывает и записывает данные в хранилище BLOB-объектов.

Создание контейнера

В этом примере показано, как создать контейнер:

container.CreateIfNotExists()

По умолчанию новый контейнер является закрытым. Это значит, что вам нужно указать ключ доступа к хранилищу, чтобы загрузить большие двоичные объекты из этого контейнера. Чтобы сделать файлы в этом контейнере доступными для всех пользователей, сделайте контейнер открытым, используя следующий код:

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

Любой пользователь в Интернете может видеть большие двоичные объекты в открытом контейнере, но изменить или удалить их можно только при наличии ключа доступа или подписанного URL-адреса.

Отправка BLOB-объекта в контейнер

Хранилище BLOB-объектов Azure поддерживает блочные и страничные BLOB-объекты. В большинстве случаев блочный большой двоичный объект является рекомендуемым типом.

Чтобы отправить файл в блочный BLOB-объект, получите клиент контейнера и используйте его для получения ссылки на блочный BLOB-объект. Получив ссылку на большой двоичный объект, вы можете передать в него любой поток данных, вызвав Upload метод. Эта операция перезаписывает содержимое большого двоичного объекта, создавая новый блочный большой двоичный объект, если он отсутствует.

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

Перечисление BLOB-объектов в контейнере

Для перечисления BLOB-объектов в контейнере сначала необходимо получить ссылку на контейнер. Затем можно использовать метод контейнера GetBlobs для получения больших двоичных объектов и (или) каталогов в нем. Чтобы получить доступ к богатому набору свойств и методов для возвращаемого BlobItemобъекта.

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

Например, рассмотрим следующий набор блочных BLOB-объектов в контейнере с именем photos:

photo1.jpg
2015/architecture/description.txt
2015/architecture/photo3.jpg
2015/architecture/photo4.jpg
2016/architecture/photo5.jpg
2016/architecture/photo6.jpg
2016/архитектура/description.txt
2016/photo7.jpg\

При вызове GetBlobsByHierarchy контейнера (как показано в приведенном выше примере), возвращается иерархическое описание.

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

скачивание больших двоичных объектов;

Чтобы скачать большие двоичные объекты, сначала получите ссылку на большой двоичный объект, а затем вызовите DownloadTo метод. В следующем примере метод используется DownloadTo для передачи содержимого большого двоичного объекта в объект потока, который затем можно сохранить в локальном файле.

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

Можно также использовать DownloadContent метод для скачивания содержимого большого двоичного объекта в виде текстовой строки.

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

удаление больших двоичных объектов.

Чтобы удалить большой двоичный объект, сначала получите ссылку на большой двоичный объект, а затем вызовите Delete метод.

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

// Delete the blob.
blobToDelete.Delete()

Асинхронное перечисление BLOB-объектов в страницах

Если вам нужно расположить большое количество BLOB-объектов или вы хотите управлять отображением количества объектов в результате запроса, вы можете задать расположение BLOB-объектов на странице. В этом примере показано, как возвращать результаты на страницах.

В этом примере показан иерархический список с помощью GetBlobsByHierarchy метода 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 ""

Теперь мы можем использовать эту подпрограмму иерархического перечисления, как показано ниже. Сначала отправьте некоторые фиктивные данные (используя локальный файл, созданный ранее в этом руководстве).

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

Теперь вызовите подпрограмму.

ListBlobsSegmentedInHierarchicalListing container

Запись в расширенный большой двоичный объект

Добавочный большой двоичный объект оптимизирован для операций добавления, например ведения журналов. Как и блочный BLOB-объект, добавочный большой двоичный объект состоит из блоков, но при добавлении нового блока в дополнительный большой двоичный объект всегда добавляется в конец большого двоичного объекта. Вы не можете обновить или удалить существующий блок в добавочном большом двоичном объекте. Идентификаторы блоков в добавочном большом двоичном объекте не отображаются, как в блочном BLOB-объекте.

Каждый блок в добавочном большом двоичном объекте может иметь разный размер (не более 4 МБ), кроме того, добавочный большой двоичный объект может содержать не более 50 000 блоков. Таким образом, максимальный размер добавочного большого двоичного объекта немного превышает 195 ГБ (4 МБ X 50 000 блоков).

В следующем примере создается новый большой двоичный объект и добавляется к нему некоторые данные, имитация простой операции ведения журнала.

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

Дополнительные сведения о различиях между тремя типами больших двоичных объектов см. в статье Основные сведения о блочных, страничных и добавочных BLOB-объектах.

Одновременный доступ

Чтобы реализовать одновременный доступ нескольких клиентов или экземпляров процесса к BLOB-объекту, можно использовать ETags или lease.

  • Etag — позволяет обнаружить, что BLOB-объект или контейнер были изменены другим процессом

  • Аренда — предоставляет способ получения монопольного, возобновляемых источников, записи или удаления доступа к большому двоичному объекту в течение определенного периода времени

Дополнительные сведения см. в разделе "Управление параллелизмом в служба хранилища Microsoft Azure".

Именование контейнеров

Каждый BLOB-объект в Azure должен располагаться в контейнере. Контейнер составляет часть имени BLOB-объекта. Например, mydata — имя контейнера в таких взятых в качестве образца URI BLOB-объектов:

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

Имя контейнера должно быть допустимым DNS-именем и соответствовать указанным ниже правилам именования.

  1. Имена контейнеров должны начинаться с буквы или цифры и могут содержать только буквы, цифры и тире (-).
  2. Каждое тире (-) должно стоять непосредственно перед буквой или цифрой и после нее. В именах контейнеров запрещено использовать несколько тире подряд.
  3. Все знаки в имени контейнера должны быть строчными.
  4. Имя контейнера должно содержать от 3 до 63 знаков.

Имя контейнера всегда должно быть строчным регистром. При использовании заглавных букв в имени контейнера или другом нарушении правил именования контейнера может появиться ошибка 400 (Ошибка запроса).

Управление системой безопасности больших двоичных объектов

По умолчанию служба хранилища Azure защищает данные, ограничивая доступ к учетной записи пользователя, который владеет ключами доступа к учетной записи. Если вы хотите предоставить доступ к данным больших двоичных объектов в своей учетной записи хранения, важно сделать это без ущерба для безопасности ключей доступа к учетной записи. Кроме того, вы можете зашифровать данные больших двоичных объектов, чтобы обеспечить их безопасную отправку по сети в службу хранилища Azure.

Управление доступом к данным больших двоичных объектов

По умолчанию данные больших двоичных объектов в учетной записи хранения доступны только владельцу учетной записи хранения. По умолчанию для проверки подлинности запросов к хранилищу BLOB-объектов требуется ключ доступа к учетной записи. Однако может потребоваться сделать некоторые данные BLOB-объектов доступными для других пользователей.

Шифрование данных больших двоичных объектов

служба хранилища Azure поддерживает шифрование данных BLOB-объектов как на клиенте, так и на сервере.

См. также