Compartilhar via


Introdução ao Armazenamento de Blobs do Azure usando F#

O Armazenamento de Blobs do Azure é um serviço que armazena dados não estruturados na nuvem como objetos/blobs. O Armazenamento de Blobs pode conter qualquer tipo de texto ou de dados binários, como um documento, um arquivo de mídia ou um instalador de aplicativo. O Armazenamento de Blobs também é chamado de armazenamento de objeto.

Este artigo mostra como realizar tarefas comuns usando o armazenamento de Blobs. Os exemplos são escritos utilizando F# com o pacote Azure.Storage.Blobs. As tarefas abrangidas incluem como carregar, listar, baixar e excluir blobs.

Para obter uma visão geral conceitual do armazenamento de blobs, consulte o guia .NET para armazenamento de blobs. Para facilitar, esses tutoriais usam cadeias de conexão para autenticar com o Azure. Para aplicativos de produção, você deve usar a ID do Microsoft Entra com identidades gerenciadas ou a biblioteca Azure.Identity para segurança aprimorada.

Importante

Este artigo usa o pacote moderno Azure.Storage.Blobs . Se você estiver atualizando de código mais antigo que usou os pacotes preteridos WindowsAzure.Storage ou Microsoft.Azure.Storage.Blob, será necessário atualizar suas referências a pacotes e declarações de espaço de nomes. Para obter diretrizes de migração, consulte Migrar para Azure.Storage.Blobs.

Observação

Os desenvolvedores F# podem considerar a biblioteca FSharp.Azure.Blob , que fornece uma API F# mais idiomática para trabalhar com o Armazenamento de Blobs do Azure. Esta biblioteca comunitária oferece funções F# idiomáticas e padrões que tornam as operações de blob mais naturais em F#.

Pré-requisitos

Para usar este guia, primeiro, você precisará criar uma conta de armazenamento do Azure. Você também precisa de sua chave de acesso de armazenamento para esta conta.

Criar um script F# e iniciar o F# Interativo

Os exemplos deste artigo podem ser usados em um aplicativo F# ou em um script F#. Para criar um script F#, crie um arquivo com a extensão .fsx, por exemplo, blobs.fsx, no ambiente de desenvolvimento F#.

Como executar scripts

O F# Interativo, dotnet fsi, pode ser iniciado de maneira interativa ou na linha de comando para executar um script. A sintaxe da linha de comando é

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

Adicionar pacotes em um script

Use #rnuget:package name para instalar o pacote Azure.Storage.Blobs e open os namespaces necessários.

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

Adicionar declarações do namespace

Adicione as seguintes instruções open à parte superior do arquivo 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

Obter a cadeia de conexão

Você precisa de uma cadeia de conexão do Armazenamento do Microsoft Azure para este tutorial. Para saber mais sobre cadeias de conexão, confira Configurar cadeias de conexão de armazenamento.

Para o tutorial, você insere sua cadeia de conexão em seu script, assim:

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

Crie alguns dados fictícios locais

Antes de começar, crie alguns dados locais fictícios no diretório do nosso script. Posteriormente, você carrega esses dados.

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

Criar o cliente de serviço de blob

O tipo BlobContainerClient permite criar contêineres e recuperar blobs armazenados no Blob Storage. Esta é uma maneira de criar o cliente de contêiner:

let container = BlobContainerClient(storageConnString, "mycontainer")

Agora você está pronto para escrever um código que lê e grava dados no Armazenamento de Blobs.

Criar um contêiner

Este exemplo mostra como criar um contêiner caso ele ainda não exista:

container.CreateIfNotExists()

Por padrão, o novo contêiner é privado, o que significa que você deve especificar sua chave de acesso de armazenamento para baixar blobs desse contêiner. Para disponibilizar os arquivos do contêiner para todos, você pode definir o contêiner como público usando o seguinte código:

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

Qualquer pessoa na Internet pode ver os blobs em um contêiner público, mas você só poderá modificá-los ou excluí-los se tiver a chave de acesso ou a assinatura de acesso compartilhado adequada.

Carregar um blob em um contêiner

O Armazenamento de Blobs do Azure oferece suporte a blobs do tipo bloco e a blobs do tipo página. Na maioria dos casos, um blob de bloco é o tipo recomendado para uso.

Para fazer upload de um arquivo em um blob de bloco, obtenha um cliente do contêiner e use-o para obter uma referência de blob de bloco. Quando tiver uma referência de blob, poderá transferir qualquer fluxo de dados para ele, chamando o método Upload . Esta operação sobrescreve o conteúdo do blob, criando um novo blob de bloco se não existir.

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

Listar os blobs em um contêiner

Para listar blobs em um contêiner, primeiro obtenha uma referência ao contêiner. Você pode usar o método GetBlobsByHierarchy do contêiner para recuperar os blobs e/ou diretórios dentro dele. Esse método retorna BlobItem objetos que fornecem acesso a propriedades e metadados de blob.

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

Por exemplo, considere o seguinte conjunto de blobs de blocos em um contêiner chamado 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\

Quando você chama GetBlobsByHierarchy em um contêiner (como no exemplo acima), uma listagem hierárquica é retornada.

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

Baixar blobs

Para baixar blobs, primeiro obtenha uma referência do blob e, em seguida, chame o método DownloadTo. O exemplo a seguir usa o método DownloadTo para transferir o conteúdo do blob para um objeto de fluxo que você pode persistir em um arquivo local.

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

Você também pode usar o método DownloadContent para baixar o conteúdo de um blob como uma cadeia de texto.

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

Excluir blobs

Para excluir um blob, primeiro obtenha uma referência de blob e, em seguida, chame o método Delete nela.

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

// Delete the blob.
blobToDelete.Delete()

Listar blobs em páginas de maneira assíncrona

Se você está listando uma grande quantidade de blobs ou se deseja controlar o número de resultados retornados em uma operação de listagem, pode listar os blobs em páginas de resultados. Este exemplo mostra como retornar resultados em páginas.

Este exemplo mostra uma listagem hierárquica usando o GetBlobsByHierarchy método do BlobContainerClient.

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

Agora podemos usar essa rotina de listagem hierárquica da seguinte maneira. Primeiro, carregue alguns dados fictícios (usando o arquivo local criado anteriormente neste tutorial).

for i in 1 .. 100 do
    let blob = container.GetBlobClient($"myblob{i}.txt")
    blob.Upload(localFile)

Agora, chame a rotina.


Gravar em um blob de anexação

Um blob de anexação é otimizado para operações de acréscimo, como registro de log. Como um blob de bloco, um blob de acréscimo é composto de blocos, mas quando você adiciona um novo bloco a um blob de acréscimo, ele sempre é anexado ao final do blob. Não é possível atualizar ou excluir um bloco existente em um blob de acréscimo. As IDs de bloco de um blob de acréscimo não ficam expostas como em um blob de blocos.

Cada bloco em um blob de acréscimo pode ter um tamanho diferente, até no máximo 4 MB, e um blob de acréscimo pode incluir no máximo 50.000 blocos. O tamanho máximo de um blob de acréscimo, portanto, é de pouco mais de 195 GB (4 MB x 50.000 blocos).

O exemplo a seguir cria um novo blob de acréscimo e anexa alguns dados a ele, simulando uma operação de log simples.

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 
// CreateIfNotExists() method will overwrite it. You can check whether the 
// blob exists to avoid overwriting it by using appendBlob.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().Value.Content.ToString()
printfn $"{downloadedText}"

Para saber mais sobre as diferenças entre os três tipos de blobs, confira Noções gerais sobre blobs de blocos, blobs de páginas e blobs de acréscimo .

Acesso simultâneo

Para suportar o acesso simultâneo a um blob por meio de vários clientes ou várias instâncias do processo, você pode usar ETags ou leasings.

  • Etag – fornece uma maneira de detectar se o blob ou o contêiner foi modificado por outro processo

  • Concessão - fornece uma maneira de obter acesso exclusivo, renovável, de gravação ou exclusão a um blob por um período de tempo

Para obter mais informações, consulte Gerenciando a concorrência no Armazenamento do Microsoft Azure.

Nomenclatura de contêineres

Todos os blobs no armazenamento do Azure devem residir em um contêiner. O contêiner faz parte do nome do blob. Por exemplo, mydata é o nome do contêiner nesses URIs do blob de exemplo:

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

Um nome de contêiner deve ser um nome DNS válido e estar em conformidade com as seguintes regras de nomenclatura:

  1. Os nomes de contêiner devem começar com uma letra ou número e podem conter apenas letras, números e o caractere traço (-).
  2. Cada caractere traço (-) deve ser imediatamente precedido e seguido por uma letra ou número. Não são permitidos traços consecutivos em nomes de contêiner.
  3. Todas as letras do nome de um contêiner devem ser minúsculas.
  4. Os nomes de contêiner devem ter de 3 a 63 caracteres.

O nome de um contêiner deve sempre estar em letras minúsculas. Se você incluir uma letra maiúscula em um nome de contêiner ou de alguma forma violar as regras de nomenclatura do contêiner, você receberá um erro 400 (solicitação incorreta).

Gerenciamento de Segurança para Blobs

Por padrão, o Armazenamento do Azure mantém seus dados seguros limitando o acesso ao proprietário da conta, que possui as chaves de acesso à conta. Quando você precisa compartilhar dados de blob em sua conta de armazenamento, é importante fazer isso sem comprometer a segurança de suas chaves de acesso à conta. Além disso, você pode criptografar os dados de blob para garantir que eles fiquem seguros durante a transmissão e no Armazenamento do Azure.

Controle do acesso a dados blob

Por padrão, os dados de blob em sua conta de armazenamento só podem ser acessados pelo proprietário da conta de armazenamento. A autenticação de solicitações no Armazenamento de Blobs requer a chave de acesso da conta, por padrão. No entanto, talvez você queira disponibilizar determinados dados de blob para outros usuários.

Criptografia de blobs de dados

O Armazenamento do Microsoft Azure dá suporte à criptografia de dados de blob no cliente e no servidor.

Confira também