Facilite a migração de aplicações legadas com App Service e Storage Mount

Aplicações Web legadas frequentemente precisam gravar arquivos em pastas locais (ou de rede), o que pode dificultar sua migração para a nuvem. Mas um recurso pouco conhecido do Azure App Service pode ajudar bastante neste tipo de cenário.

O problema

Imagine por um instante uma aplicação Web legada, feita em uma tecnologia como ASP (!!!), ASP.NET, Java ou PHP. Esta aplicação precisa gravar arquivos em uma pasta local, ou em uma pasta de rede. Por exemplo, um sistema de gestão de documentos, que grava arquivos PDF em uma pasta compartilhada na rede.

Agora imagine que você precisa migrar esta aplicação para a nuvem e, para isso, opta pelo Azure App Service. Naturalmente essa pasta não estará mais disponível quando a aplicação estiver na nuvem. Então como resolver este problema?

Para fins de exemplo, considere o arquivo web.config abaixo:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- ... -->
  <appSettings>
    <!-- ... -->
    <add key="PastaPdf" value="N:\Arquivos\PDF" />
  </appSettings>
  <!-- ... -->
</configuration>

Veja que ele contém uma chave de configuração chamada PastaPdf, que aponta para uma pasta de rede. A aplicação usa esta chave para saber onde gravar os arquivos PDF.

No nosso código, provavelmente teremos algo assim:

1
2
3
4
5
6
7
8
9
10
11
[HttpPost]
public ActionResult Upload(HttpPostedFileBase pdf)
{
    if (pdf != null && pdf.ContentLength > 0)
    {
        var pastaPdf = ConfigurationManager.AppSettings["PastaPdf"];
        var caminhoPdf = Path.Combine(pastaPdf, pdf.FileName);
        pdf.SaveAs(caminhoPdf);
    }
    // ...
}

Para podermos migrar essa aplicação para o Azure, precisaríamos mudar esse caminho N:\Arquivos\PDF para um caminho válido na nuvem. E é aí que começa a complicação.

Houston, we have a problem
Houston, we have a problem (clique para ampliar)

Pastas de arquivos no Azure App Service

Gravar arquivos num App Service, por si só, não é um grande problema. Veja, nossa aplicação tem permissão de gravar no disco local da instância onde ela está rodando. Com isso, bastaria mudar o valor da nossa chave PastaPdf para um caminho válido no disco local da instância - por exemplo, C:\home\site\wwwroot\PDF - que nossa aplicação estaria pronta para rodar na nuvem. Entretanto:

  • O disco local do App Service é volátil. Isso significa que ele pode ser apagado a qualquer momento, sem aviso prévio;
  • O disco local do App Service não é compartilhado entre as instâncias. Com isso, se você estiver rodando sua aplicação com múltiplas instâncias (“scale out”), cada instância terá sua própria pasta de arquivos. Arquivos gravados numa instância não estarão disponíveis para as demais instâncias. Há uma exceção, porém: a pasta %HOME% (normalmente C:\home) é compartilhada entre as instâncias, mas não é recomendado usá-la para armazenar arquivos persistentes (veja este artigo para mais detalhes);
  • O disco local do App Service não é persistente. Isso significa que, se você fizer um deploy da sua aplicação, ou se você fizer um “scale up” (mudar o tamanho da instância), o conteúdo do disco local será apagado;
  • Há um limite de espaço para discos locais do App Service, que varia em função do tamanho da instância.

Ou seja, usar o disco local do App Service definitivamente não é uma boa opção para armazenar arquivos. Mas então como resolver o problema?

App Service Storage Mount

O App Service Storage Mount é um recurso que permite que você monte um compartilhamento de arquivos do Azure Storage como uma pasta no disco local do App Service. Com isso, você pode usar o Azure Storage para armazenar seus arquivos, e continuar usando o mesmo código que você usava antes!

"Continuar usando o mesmo código..."
"Continuar usando o mesmo código..." (clique para ampliar)

Para isso, você precisa de:

  • Uma conta de armazenamento do Azure;
  • Um compartilhamento de arquivos (“File Share”) dentro dessa conta;
  • Uma chave de acesso (“Access Key”) para a conta de armazenamento.

Veja a conta abaixo:

Conta de armazenamento do Azure com um compartilhamento de arquivos chamado "pdf"
Conta de armazenamento do Azure com um compartilhamento de arquivos chamado "pdf" (clique para ampliar)

Nela, criamos um compartilhamento de arquivos chamado “pdf” que iremos “montar” na nossa aplicação.

Agora, no App Service, acessa a seção Configuration / Path Mappings:

Seção Path Mappings da página de configuração do App Service
Seção Path Mappings da página de configuração do App Service (clique para ampliar)

Nela, usaremos a opção “Mount Storage” para conectar nossa storage account ao App Service:

Para conectar a storage account à sua aplicação, clique em New Azure Storage Mount (1), dê um nome ao ponto de montagem (2), e selecione a conta (3), o _file share_ (4) e o nome da pasta onde o compartilhamento será montado (5)
Para conectar a storage account à sua aplicação, clique em New Azure Storage Mount (1), dê um nome ao ponto de montagem (2), e selecione a conta (3), o _file share_ (4) e o nome da pasta onde o compartilhamento será montado (5) (clique para ampliar)

Depois de clicar em OK, repare que o ponto de montagem aparece na lista de mapeamentos. Preste especial atenção à coluna Mount Path:

O ponto de montagem /mounts/pdf aparece na lista de mapeamentos
O ponto de montagem /mounts/pdf aparece na lista de mapeamentos (clique para ampliar)

Num App Service Windows, esse caminho será montado na raíz do disco C:. Ou seja, para acessar a storage account, basta usar o caminho C:\mounts\pdf. Já numa aplicação Linux, o caminho será montado na raíz do sistema de arquivos: /mounts/pdf.

Assim, para gravarmos (e lermos) arquivos diretamente na storage account, basta mudarmos nosso web.config para usar o caminho C:\mounts\pdf ao invés do caminho N:\Arquivos\PDF:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- ... -->
  <appSettings>
    <!-- ... -->
    <add key="PastaPdf" value="C:\mounts\pdf" />
  </appSettings>
  <!-- ... -->
</configuration>

E pronto! Agora nossa aplicação está pronta para rodar na nuvem, e gravar arquivos diretamente numa storage account! Com isso, os arquivos são mantidos num armazenamento persistente externo à aplicação, sendo compartilhado entre todas as instâncias - e sem o risco de ser apagado em caso de deploy ou “scale up”.

Conclusão

Neste artigo, vimos como usar o App Service Storage Mount para conectar uma storage account ao App Service, e permitir que sua aplicação grave arquivos diretamente na nuvem. Com isso, você pode migrar sua aplicação para a nuvem sem precisar alterar seu código!

O que achou desta dica? Você já precisou fazer algo parecido? Deixe seu comentário, e até a próxima!

Um abraço,
Igor



16/05/2023 | Por Igor Abade V. Leite | Em Técnico | Tempo de leitura: 4 mins.

Postagens relacionadas