Biblioteca de clientes de Blobs de Armazenamento de Trabalhos Web do Azure para .NET – versão 5.2.1
Essa extensão fornece funcionalidade para acessar Blobs de Armazenamento do Azure em Azure Functions dentro do processo.
Introdução
Instalar o pacote
Instale a extensão de Blobs de Armazenamento com o NuGet:
dotnet add package Microsoft.Azure.WebJobs.Extensions.Storage.Blobs
Pré-requisitos
Você precisa de uma assinatura do Azure e uma Conta de Armazenamento para usar esse pacote.
Para criar uma conta de armazenamento, você pode usar o Portal do Azure, Azure PowerShell ou a CLI do Azure. Aqui, está um exemplo usando a CLI do Azure:
az storage account create --name <your-resource-name> --resource-group <your-resource-group-name> --location westus --sku Standard_LRS
Autenticar o cliente
Para que a extensão acesse Blobs, você precisará da cadeia de conexão que pode ser encontrada no Portal do Azure ou usando o snippet da CLI do Azure abaixo.
az storage account show-connection-string -g <your-resource-group-name> -n <your-resource-name>
A cadeia de conexão pode ser fornecida por meio da configuração do aplicativo AzureWebJobsStorage.
Principais conceitos
Usando o gatilho de blob
O gatilho de armazenamento de Blob inicia uma função quando é detectado um blob novo ou atualizado. O conteúdo do blob é fornecido como entrada para a função.
Siga o tutorial para saber mais sobre como disparar uma função do Azure quando um blob é modificado.
Estratégias de escuta
O gatilho de blob oferece algumas estratégias quando se trata de ouvir a criação e a modificação de blob. A estratégia pode ser personalizada especificando Source
a propriedade do BlobTrigger
(veja os exemplos abaixo).
Estratégia padrão
Por padrão, o gatilho de blob usa sondagem que funciona como um híbrido entre inspecionar o log de análise do Armazenamento do Azure e executar verificações periódicas de contêiner. Os blobs são examinados em grupos de 10 mil por vez, com um token de continuação usado entre intervalos.
O log de análise do Armazenamento do Azure não está habilitado por padrão. Confira Log de análise do Armazenamento do Azure para saber como habilitá-lo.
Essa estratégia não é recomendada para aplicativos de alta escala ou cenários que exigem baixa latência.
Grade de eventos
Os eventos de armazenamento de blobs podem ser usados para escutar alterações. Essa estratégia requer configuração adicional.
Essa estratégia é recomendada para aplicativos de alta escala.
Usando a associação de Blob
A associação de entrada permite que você leia dados do armazenamento de blobs como entrada para uma Função do Azure. A associação de saída permite que você modifique e exclua dados de armazenamento de blobs em uma Função do Azure.
Siga o tutorial de associação de entrada e o tutorial de associação de saída para saber mais sobre como usar essa extensão para acessar Blobs.
Exemplos
Reagindo à alteração de blob
Estratégia padrão
public static class BlobFunction_ReactToBlobChange
{
[FunctionName("BlobFunction")]
public static void Run(
[BlobTrigger("sample-container/sample-blob")] Stream blobStream,
ILogger logger)
{
using var blobStreamReader = new StreamReader(blobStream);
logger.LogInformation("Blob sample-container/sample-blob has been updated with content: {content}", blobStreamReader.ReadToEnd());
}
}
Estratégia da Grade de Eventos
public static class BlobFunction_ReactToBlobChange_EventGrid
{
[FunctionName("BlobFunction")]
public static void Run(
[BlobTrigger("sample-container/sample-blob", Source = BlobTriggerSource.EventGrid)] Stream blobStream,
ILogger logger)
{
using var blobStreamReader = new StreamReader(blobStream);
logger.LogInformation("Blob sample-container/sample-blob has been updated with content: {content}", blobStreamReader.ReadToEnd());
}
}
Leitura do fluxo
public static class BlobFunction_ReadStream
{
[FunctionName("BlobFunction")]
public static void Run(
[BlobTrigger("sample-container/sample-blob-1")] Stream blobStream1,
[Blob("sample-container/sample-blob-2", FileAccess.Read)] Stream blobStream2,
ILogger logger)
{
using var blobStreamReader1 = new StreamReader(blobStream1);
logger.LogInformation("Blob sample-container/sample-blob-1 has been updated with content: {content}", blobStreamReader1.ReadToEnd());
using var blobStreamReader2 = new StreamReader(blobStream2);
logger.LogInformation("Blob sample-container/sample-blob-2 has content: {content}", blobStreamReader2.ReadToEnd());
}
}
Gravando no fluxo
public static class BlobFunction_WriteStream
{
[FunctionName("BlobFunction")]
public static async Task Run(
[BlobTrigger("sample-container/sample-blob-1")] Stream blobStream1,
[Blob("sample-container/sample-blob-2", FileAccess.Write)] Stream blobStream2,
ILogger logger)
{
await blobStream1.CopyToAsync(blobStream2);
logger.LogInformation("Blob sample-container/sample-blob-1 has been copied to sample-container/sample-blob-2");
}
}
Associação à cadeia de caracteres
public static class BlobFunction_String
{
[FunctionName("BlobFunction")]
public static void Run(
[BlobTrigger("sample-container/sample-blob-1")] string blobContent1,
[Blob("sample-container/sample-blob-2")] string blobContent2,
ILogger logger)
{
logger.LogInformation("Blob sample-container/sample-blob-1 has been updated with content: {content}", blobContent1);
logger.LogInformation("Blob sample-container/sample-blob-2 has content: {content}", blobContent2);
}
}
Gravando cadeia de caracteres no blob
public static class BlobFunction_String_Write
{
[FunctionName("BlobFunction")]
public static void Run(
[BlobTrigger("sample-container/sample-blob-1")] string blobContent1,
[Blob("sample-container/sample-blob-2")] out string blobContent2,
ILogger logger)
{
logger.LogInformation("Blob sample-container/sample-blob-1 has been updated with content: {content}", blobContent1);
blobContent2 = blobContent1;
logger.LogInformation("Blob sample-container/sample-blob-1 has been copied to sample-container/sample-blob-2");
}
}
Associação à matriz de bytes
public static class BlobFunction_ByteArray
{
[FunctionName("BlobFunction")]
public static void Run(
[BlobTrigger("sample-container/sample-blob-1")] byte[] blobContent1,
[Blob("sample-container/sample-blob-2")] byte[] blobContent2,
ILogger logger)
{
logger.LogInformation("Blob sample-container/sample-blob-1 has been updated with content: {content}", Encoding.UTF8.GetString(blobContent1));
logger.LogInformation("Blob sample-container/sample-blob-2 has content: {content}", Encoding.UTF8.GetString(blobContent2));
}
}
Gravando matriz de bytes no blob
public static class BlobFunction_ByteArray_Write
{
[FunctionName("BlobFunction")]
public static void Run(
[BlobTrigger("sample-container/sample-blob-1")] byte[] blobContent1,
[Blob("sample-container/sample-blob-2")] out byte[] blobContent2,
ILogger logger)
{
logger.LogInformation("Blob sample-container/sample-blob-1 has been updated with content: {content}", Encoding.UTF8.GetString(blobContent1));
blobContent2 = blobContent1;
logger.LogInformation("Blob sample-container/sample-blob-1 has been copied to sample-container/sample-blob-2");
}
}
Associação a TextReader e TextWriter
public static class BlobFunction_TextReader_TextWriter
{
[FunctionName("BlobFunction")]
public static async Task Run(
[BlobTrigger("sample-container/sample-blob-1")] TextReader blobContentReader1,
[Blob("sample-container/sample-blob-2")] TextWriter blobContentWriter2,
ILogger logger)
{
while (blobContentReader1.Peek() >= 0)
{
await blobContentWriter2.WriteLineAsync(await blobContentReader1.ReadLineAsync());
}
logger.LogInformation("Blob sample-container/sample-blob-1 has been copied to sample-container/sample-blob-2");
}
}
Associação a tipos de SDK do Blob de Armazenamento do Azure
public static class BlobFunction_BlobClient
{
[FunctionName("BlobFunction")]
public static async Task Run(
[BlobTrigger("sample-container/sample-blob-1")] BlobClient blobClient1,
[Blob("sample-container/sample-blob-2")] BlobClient blobClient2,
ILogger logger)
{
BlobProperties blobProperties1 = await blobClient1.GetPropertiesAsync();
logger.LogInformation("Blob sample-container/sample-blob-1 has been updated on: {datetime}", blobProperties1.LastModified);
BlobProperties blobProperties2 = await blobClient2.GetPropertiesAsync();
logger.LogInformation("Blob sample-container/sample-blob-2 has been updated on: {datetime}", blobProperties2.LastModified);
}
}
Acessando o contêiner de Blob
public static class BlobFunction_AccessContainer
{
[FunctionName("BlobFunction")]
public static async Task Run(
[BlobTrigger("sample-container/sample-blob")] Stream blobStream,
[Blob("sample-container")] BlobContainerClient blobContainerClient,
ILogger logger)
{
logger.LogInformation("Blobs within container:");
await foreach (BlobItem blobItem in blobContainerClient.GetBlobsAsync())
{
logger.LogInformation(blobItem.Name);
}
}
}
Enumerando blobs no contêiner
public static class BlobFunction_EnumerateBlobs_Stream
{
[FunctionName("BlobFunction")]
public static async Task Run(
[BlobTrigger("sample-container/sample-blob")] Stream blobStream,
[Blob("sample-container")] IEnumerable<Stream> blobs,
ILogger logger)
{
logger.LogInformation("Blobs contents within container:");
foreach (Stream content in blobs)
{
using var blobStreamReader = new StreamReader(content);
logger.LogInformation(await blobStreamReader.ReadToEndAsync());
}
}
}
public static class BlobFunction_EnumerateBlobs_BlobClient
{
[FunctionName("BlobFunction")]
public static void Run(
[BlobTrigger("sample-container/sample-blob")] Stream blobStream,
[Blob("sample-container")] IEnumerable<BlobClient> blobs,
ILogger logger)
{
logger.LogInformation("Blobs within container:");
foreach (BlobClient blob in blobs)
{
logger.LogInformation(blob.Name);
}
}
}
Configuração da extensão
Consulte o aplicativo de funções de exemplo.
Solução de problemas
Consulte Monitorar Azure Functions para obter diretrizes de solução de problemas.
Próximas etapas
Leia a introdução ao Azure Function ou crie um guia de função do Azure.
Participante
Consulte a CONTRIBUTING.md de Armazenamento para obter detalhes sobre como criar, testar e contribuir para essa biblioteca.
Este projeto aceita contribuições e sugestões. A maioria das contribuições exige que você concorde com um CLA (Contrato de Licença do Colaborador) declarando que você tem o direito de nos conceder, e de fato concede, os direitos de usar sua contribuição. Para obter detalhes, visite cla.microsoft.com.
Este projeto adotou o Código de Conduta de Software Livre da Microsoft. Para obter mais informações, confira as Perguntas frequentes sobre o Código de Conduta ou contate opencode@microsoft.com para enviar outras perguntas ou comentários.