Biblioteca de cliente de Blobs de Armazenamento do Azure WebJobs para .NET – versão 5.1.1
Esta extensão fornece funcionalidades para aceder aos Blobs de Armazenamento do Azure no Funções do Azure.
Introdução
Instalar o pacote
Instale a extensão Blobs de Armazenamento com NuGet:
dotnet add package Microsoft.Azure.WebJobs.Extensions.Storage.Blobs
Pré-requisitos
Precisa de uma subscrição do Azure e de uma Conta de Armazenamento para utilizar este pacote.
Para criar uma nova Conta de Armazenamento, pode utilizar o Portal do Azure, Azure PowerShell ou a CLI do Azure. Eis um exemplo com 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 aceda aos Blobs, precisará da cadeia de ligação que pode ser encontrada no Portal do Azure ou através do fragmento da CLI do Azure abaixo.
az storage account show-connection-string -g <your-resource-group-name> -n <your-resource-name>
A cadeia de ligação pode ser fornecida através da definição da aplicação AzureWebJobsStorage.
Conceitos-chave
Utilizar o acionador de Blobs
O acionador de armazenamento de Blobs inicia uma função quando é detetado um blob novo ou atualizado. Os conteúdos dos blobs são fornecidos como entrada para a função.
Siga o tutorial para saber mais sobre como acionar uma Função do Azure quando um blob é modificado.
Estratégias de escuta
O acionador de blobs oferece várias estratégias quando se trata de escutar a criação e modificação de blobs. A estratégia pode ser personalizada ao especificar a Source
propriedade do BlobTrigger
(veja exemplos abaixo).
Estratégia predefinida
Por predefinição, o acionador de blobs utiliza consultas que funcionam como híbridas entre inspecionar o registo de análise do Armazenamento do Azure e executar análises periódicas de contentores. Os blobs são analisados em grupos de 10 000 de cada vez com um token de continuação utilizado entre intervalos.
Por predefinição, o registo de análise do Armazenamento do Azure não está ativado. Veja Registo de análise do Armazenamento do Azure para saber como o ativar.
Esta estratégia não é recomendada para aplicações ou cenários de alta escala que exijam baixa latência.
Event Grid
Os eventos de armazenamento de blobs podem ser utilizados para escutar alterações. Esta estratégia requer uma configuração adicional.
Esta estratégia é recomendada para aplicações de alta escala.
Utilizar o enlace de Blobs
O enlace de entrada permite-lhe ler dados de armazenamento de blobs como entrada para uma Função do Azure. O enlace de saída permite-lhe modificar e eliminar dados de armazenamento de blobs numa Função do Azure.
Siga o tutorial de enlace de entrada e o tutorial de enlace de saída para saber como utilizar esta extensão para aceder aos Blobs.
Exemplos
Reagir à alteração do blob
Estratégia predefinida
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 do Event Grid
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());
}
}
Ler a partir 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());
}
}
Escrever em 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");
}
}
Enlace à cadeia
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);
}
}
Escrever cadeia para 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");
}
}
Vincular à 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));
}
}
Escrever 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");
}
}
Enlace para 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");
}
}
Vincular a tipos de SDK de Blobs 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);
}
}
Aceder ao contentor de Blobs
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);
}
}
}
Enumerar blobs no contentor
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);
}
}
}
Configurar a extensão
Veja a aplicação de funções de exemplo.
Resolução de problemas
Veja Monitorizar Funções do Azure para obter orientações de resolução de problemas.
Passos seguintes
Leia a introdução à Função do Azure ou a criação de um guia de Funções do Azure.
Contribuir
Veja o CONTRIBUTING.md de Armazenamento para obter detalhes sobre como criar, testar e contribuir para esta biblioteca.
Agradecemos todas as contribuições e sugestões para este projeto. A maioria das contribuições requerem que celebre um Contrato de Licença de Contribuição (CLA) no qual se declare que tem o direito de conceder e que, na verdade, concede-nos os direitos para utilizar a sua contribuição. Para obter detalhes, visite cla.microsoft.com.
Este projeto adotou o Microsoft Open Source Code of Conduct (Código de Conduta do Microsoft Open Source). Para obter mais informações, consulte as FAQ do Código de Conduta ou o contacto opencode@microsoft.com com quaisquer perguntas ou comentários adicionais.