Utilizando o Azure Blob Storage no upload de arquivos

Renicius Pagotto Fostaini
12 min readApr 30, 2020

--

Atualizado em 14/09/2022

No post de hoje, iremos entender um pouco mais sobre o funcionamento de alguns tipos de upload de dados presentes nos sistemas e como o Azure Blob Storage pode ajudar e agilizar essa tarefa tão trivial.

Contextualização do problema

Na grande maioria das aplicações, o recurso de upload de dados (videos, imagens, planilhas, arquivos de texto etc) é extremamente comum e necessário, e com isso, precisamos analisar a melhor abordagem para essa implementação e o que utilizar como recurso.

Como solução, possuímos algumas abordagens como, salvar esses dados dentro de algum banco de dados ou ainda utilizar algum diretório dentro do próprio servidor da aplicação ou utilizar um servidor a parte para isso. Mas qual seria os benefícios e os problemas disso?

Salvar na base de dados?

Utilizando o banco de dados, o principal benefício é apenas adicionar uma nova coluna em uma tabela existente ou criar uma nova tabela para isso, o restante ja está implementado. Porém as principais desvantagens são o crescimento do tamanho do banco de dados impactando diretamente os custos e a queda de desempenho visto que operações de leitura e gravação são mais custosas em banco de dados.

Salvar no servidor da aplicação?

Nesta abordagem, salvamos apenas o caminho do arquivo no banco de dados, enquanto os próprios arquivos são salvos em uma pasta dentro do servidor onde a aplicação está executando, porém como que fica a performance disso?

Sempre que uma imagem é salva em disco dentro do servidor, temos uma operação de I/O sendo executada, portanto, dependendo da quantidade de imagens salvas ou da quantidade de requisições de leitura dessas imagens, a performance pode ser afetada visto que sua aplicação está rodando no mesmo servidor.

Com essa abordagem, temos um problema recorrente sem cenários de escalabilidade horizontal, que é quando novas instâncias da aplicação são criadas, porém a escalabilidade em si da aplicação não é um problema e nem será afetada pelo upload, o grande problema está no gerenciamento de arquivos entre as instâncias, logo se o servidor A foi responsável por fazer um upload de um determinado arquivo e na sequência uma requisição de leitura para esse arquivo seja processada pelo servidor B, o servidor não encontrará o arquivo, pois o mesmo está no servidor A e não no B.

No entando, esse é um problema de fácil resolução, pois podemos disponibilizar um novo servidor que será responsável por armazenar todos os arquivos e que seria acessível por qualquer aplicação, porém esse servidor extra demanda custo de manutenção, custo de backup semanal ou mensal, custo de atualização de OS e tem até o risco de acontecer algo inesperado e o servidor sucumbir.

Qual é a melhor estratégia?

Como explicado, nas abordagens anteriores temos vantagens e desvantagens e ambas são interessantes a adoção dependendo do contexto aplicado, porém o mais importante é que antes de tomar qualquer decisão, uma análise seja feita para identificar qual é a melhor abordagem para aquele determinado contexto.

No entanto, existe uma terceira estratégia a ser utilizada que é a utilização dos serviços de armazenamento em nuvem, no caso o Azure Storage que é um serviço de armazenamento de arquivos oferecido pelo Azure e que possui diversos benefícios quando utilizado.

Porque utilizar um Serviço de Armazenamento?

Como o próprio nome já diz, os serviços de armazenamento foram feitos para armazenar qualquer tipo de dado, alguns desses serviços disponibilizam backups automáticos, distribuição global, redundância, acesso distribuído, cache dos arquivos e são totalmente gerenciados pelos provedores de nuvem, não necessitando qualquer manutenção de infraestrutura.

Além disso, como o serviço é de terceiro, isso significa que mesmo que sua aplicação tenha algum tipo de interrupção e que seja necessário alguma reinicialização, nenhum arquivo será afetado com isso.

Os serviços de armazenamento também possuem autenticação, o que significa que podemos liberar acesso para um determinado usuário ou não, aumentando a segurança dos dados.

Azure Blob Storage

É uma solução de armazenamento oferecido pelo Azure e que possibilita o armazenamento de dados (imagens, documentos, videos etc).

O Azure Blob Storage é ideal para:

  • Fornecimento de dados diretamente no navegador;
  • Acesso distríbuido em arquivos;
  • Streaming de áudio e vídeo
  • Armazenamento de dados para backup, restauração ou arquivamento;
  • Armazenamento de logs de aplicação.

Os dados podem ser acessados via HTTP/HTTPS de qualquer lugar no mundo pois estão acessíveis por meio do Blob service REST API, do Azure PowerShell, da CLI do Azure ou através do uso de algum pacote oferecido pela Microsoft.

Para exemplificar melhor o functionamento do Azure Blob Storage, vamos analisar a imagem abaixo.

Na primeira coluna, temos uma conta de armazenamento com o nome “sally”, dentro dessa conta, temos dois containers com os nomes “imagens” e “filmes” conforme é exibido na segunda coluna. Por fim na terceira coluna é onde estão definidos os arquivos, temos dois arquivos estão dentro do container imagens e um arquivo está dentro do container filmes.

Benefícios do Azure Blob

Abaixo, temos alguns dos príncipais benefícios do uso do Azure Blob Storage

  • Escalabilidade: O Azure Storage é altamente escalável para atender as mais variadas demandas de dados;
  • Gerenciamento: Uma das grandes vantagens é o gerenciamento fornecido pelo próprio Azure, onde não precisamos nos preocupar com manutenção de hardware, atualizações de servidores, espaço de armazenamento é so criar o recurso e utilizar em sua aplicação;
  • Acessibilidade: Os dados armazenados podem ser acessados de qualquer lugar do mundo via HTTP ou HTTPS.

Configuração do Azure Blob

Primeiramente, vamos criar toda nossa infraestrutura no Azure e para isso, acesse portal.azure.com e realize o login.

Feito o login, é exibido um dashboard com algumas informações de recursos, conforme é exibido na imagem abaixo.

Selecione a opção Storage Account ou realize uma pesquisa na barra de pesquisas no topo da página e ao selecionar o recurso uma tela de listagem será apresentada, conforme mostrado na imagem abaixo.

Para adicionar um novo container de armazenamento de dados, clique em +Add no canto superior esquerdo da página ou em Create storage account na parte central da página.

Na próxima página, devemos obrigatóriamente informar a Subscription e o Resource Group, caso não possua um Resource Group criado, é possível criar um através do link Create New, logo abaixo do dropdown.

Um pouco mais abaixo na página, é necessário fornecer as seguintes informações conforme demonstrado na imagem.

Abaixo temos uma explicação mais detalhada das informações:

  • Storage account name: Nome a ser dado para a conta do nosso serviço de armazenamento
  • Location: É a localização onde nosso recurso será provisionado e que representa também onde nossos arquivos serão armazenados. Você pode escolher o lugar de sua preferência mas é aconselhável escolher o local mais perto da sua aplicação para evitar uma latência muito alta.
  • Performance: Aqui definimos o nível de performance do recurso. A opção Standard é o mais recomendado para a maioria dos casos de uso e oferece armazenamento em discos tradicionais enquanto a opção Premium oferece armazenamento de dados em SSD, elevando o nível de performance.
  • Redundancy: É o tipo de redundância que será utilizada pelo nosso serviço de armazenamento.

Redundância/Replicação

Para melhor entendimento, vamos explicar um pouco mais os tipos de redundância disponíveis atualmente.

  • Armazenamento localmente redundante (LRS): estratégia de redundância simples e baixo custo. Os dados são copiados de forma síncrona três vezes na região principal em um único local;
  • Armazenamento redundante de zona (ZRS): estratégia de redundância para cenários que exigem alta disponibilidade. Os dados são copiados de forma síncrona em três zonas de disponibilidade do Azure na região principal;
  • Armazenamento georredundante (GRS): estratégia de redundância entre regiões para proteger contra interrupções regionais. Os dados são copiados de forma síncrona três vezes na região principal em um único local, em seguida, são copiados de forma assíncrona para a região secundária. Dentro da região secundária os dados são copiados usando a estratégia LRS;
  • Armazenamento redundante por zona geográfica (GZRS): estratégia de redundância para cenários que exigem alta disponibilidade e durabilidade máxima. Os dados são copiados de forma síncrona em três zonas de disponibilidade do Azure na região principal, em seguida, são copiados de forma assíncrona para a região secundária. Dentro da região secundária os dados são copiados usando a estratégia LRS.

Na segunda aba com o nome Advanced/Avançado, precisamos apenas nos atentar com a opção Access Tier, pois isso afeta o desempenho e também o custo do recurso.

Access Tier

Possuímos 3 tipos de camada de acesso, porém apenas 2 tipos estão disponíveis a nível de conta.

  • Hot: otimizado para acesso frequente aos dados armazenados. Possui os custos de armazenamento mais alto porém um custo de acesso baixo.
  • Cool: otimizado para armazenar grandes quantidades de dados que serão acessados com pouca frequência e armazenados por pelo menos 30 dias. O custo de armazenamento é mais baixo enquanto o custo de acesso é mais alto.
  • Archive: disponível para seleção apenas em dados individuais. Podem apresentar várias horas de latência para a recuperação de dados e é ideal para dados que praticamente não serão acessados por pelo menos 180 dias. É a opção mais econômica em termos de armazenamento, porém o custo de acesso é maior do que as outras camadas.

Dando sequência em nossa configuração, após preencher as informações, podemos clicar em Review + create para prosseguir com a criação.

O Azure realizará a validação de toda informação fornecida antes de prosseguir, uma vez validado, podemos cliar no botão Create para finalmente criar nosso serviço.

Após o término do processamento, clique em Go to resource para acessar o recurso.

Com o serviço provisionado, vamos criar o container que será utilizado pela nossa aplicação, para isso, no menu lateral esquerdo acesse a opção Containers.

Nesta próxima página, clique em + Container

Um menu lateral direito será aberto para a criação do container. Informe o nome e o nível de acesso do container (caso possua dúvidas, existe uma tooltip bem ao lado do título do campo que descreve um pouco o que representa cada opção) e clique em Create.

Finalizamos a configuração e criação do nosso container, vamos agora clicar sobre o nome do container para visualizar suas informações.

Ao acessar o container, podemos perceber que não possuímos nenhum blob, ou seja, não temos nenhum dado armazenado ainda.

Ainda nessa tela, destaco uma opção Upload que é reponsável por realizar o upload de algum arquivo do nosso computador diretamente para o nosso container.

Ciclo de vida dos dados

Antes de entrar na parte do desenvolvimento, vamos falar brevemente de um recurso muito interessante que podemos utilizar no Azure Blob Storage que é o gerenciador de ciclo de vida de um dado.

Com esse recurso é possível definir uma regra com o intuito de mover um dado de uma camada Hot para uma camada Cool ou até mesmo deletar o mesmo. Essas regras podem ser aplicadas a nível global, ou seja, para todos os dados ou podem ser aplicados em tipos específicos de dados, em containers específicos, entre outras possibilidades.

Para criação de regras, basta acessar a opção Lifecycle management / Gerenciamento de ciclo de vida no menu lateral esquerdo e seguir o passo a passo da imagem.

O projeto

Para essa demonstração, iremos implementar um projeto simples do tipo API onde demonstraremos a integração da aplicação com o Azure Storage, para isso, utilizaremos o Visual Studio 2022 com o .NET 6 no desenvolvimento.

Abra o Visual Studio e crie um projeto do tipo API e feito isso vamos adicionar uma nova classe Product.cs que basicamente representa uma entidade e que contém uma propriedade responsável por armazenar a URL da imagem.

No appsettings.json, precisaremos adicionas algumas informações, conforme demonstrado abaixo.

Essas informações são as credenciais de acesso do Azure Storage. É possível acessar essas informações através do portal do Azure, para isso, acesse o recurso Azure Storage e selecione a opção Access Keys

Nessa tela, é possível obter o nome da conta de armazenamento e a chave de conexão ao serviço. Podemos usar tanto a Key1 como a Key2 para essa finalidade.

Para exemplificar melhor o nosso appsettings.json

  • ConnectionString: é a chave de conexão (Key1 ou key2) ao serviço
  • ContainerName: representa o nome do container de armazenamento

Para trabalhar com o Azure Blob Storage, vamos precisar instalar o seguinte pacote nuget em nosso projeto.

  • Install-Package Azure.Storage.Blobs -Version 12.13.1

Agora implementaremos nossa controller ProductController.cs com o seguinte código

Como mostrado, a implementação é bem simples e com poucas linhas de código é possível se conectar ao Azure Storage e realizar o upload de algum dado. Para melhor entendimento, vamos detalhar o funcionamento linha a linha.

No trecho acima, é obtido os dados de conexão com o Azure Storage e o nome do container que será utilizado no upload, esses dados estão definidos no arquivo appsettings.json.

Nesse trecho de código, na primeira linha é criado uma conexão com o Azure Blob Storage e na segunda linha, criamos uma instância de um blob que faz referência a um novo arquivo e passamos um nome para o mesmo via parâmetro. Podemos usar o mesmo nome original do arquivo que recebemos no IFormFile e realizar o upload ou podemos definir qualquer outro nome de preferência, usar algum gerador palavras etc.

Por fim, nesse último trecho, na primeira linha é realizado o upload do arquivo de forma assíncrona e na segunda linha, retornamos a url que faz referência ao arquivo no Azure Blob Storage.

Testes

Com a nossa implementação finalizada, vamos executar o projeto e realizar os devidos testes utilizando o Postman.

Na imagem abaixo é mostrada toda a configuração na requisição no Postman que vamos utilizar.

Após a requisição ao endpoint, vamos no portal do Azure novamente e acessaremos o nosso container para ver a imagem que acabamos de fazer o upload.

E é isso, bem simples, correto? Com poucas linhas de código conseguimos implementar um upload de maneira fácil e segura em nossa aplicação.

Conteúdo extra

No tutorial acima, a aplicação que desenvolvemos para a demonstração é extremamente simples e atende o foco de exemplificar o funcionamento de um upload para o Azure Storage, porém visando fornecer um melhor conhecimento, junto a essa implementação que fizemos, vou disponibilizar uma segunda implementação utilizando a arquitetura de camadas e que aproxima um pouco mais do nosso dia a dia.

E ai, gostou desse post? Tem dúvidas ou quer conversar um pouco mais sobre Azure Storage? Deixe um comentário com suas dúvidas e idéias ou entre em contato comigo através do LinkedIn.

GitHub: https://github.com/reniciuspagotto/azure-storage-connection

Referências

--

--