Executar um aplicativo no Serviço de Aplicativo do Azure diretamente de um pacote ZIP

No Serviço de Aplicativo do Azure, você pode executar aplicativos diretamente de um arquivo de pacote zip de implantação. Este artigo mostra como habilitar essa funcionalidade em seu aplicativo.

Todos os outros métodos de implantação no Serviço de Aplicativo têm algo em comum: os arquivos são implantados em D:\home\site\wwwroot no aplicativo (ou /home/site/wwwroot para aplicativos Linux). Como o mesmo diretório é usado pelo aplicativo no runtime, é possível que a implantação falhe devido a conflitos de bloqueio de arquivo e que o aplicativo se comporte de maneira inesperada porque alguns dos arquivos ainda não foram atualizados.

Por outro lado, quando você executa diretamente de um pacote, os arquivos no pacote não são copiados para o diretório wwwroot. Em vez disso, o próprio pacote ZIP é montado diretamente como o diretório wwwroot somente leitura. Há vários benefícios na execução direta de um pacote:

  • Elimina conflitos de bloqueio de arquivo entre implantação e runtime.
  • Garante que somente aplicativos de implantação completa estejam em execução a qualquer momento.
  • Pode ser implantado em um aplicativo de produção (com reinicialização).
  • Melhora o desempenho das implantações do Azure Resource Manager.
  • Pode reduzir os tempos de inicialização a frio, particularmente para as funções de JavaScript com árvores de pacote npm grandes.

Observação

No momento, apenas arquivos de pacote ZIP têm suporte.

Criar um projeto de pacote ZIP

Importante

Ao criar o pacote ZIP para implantação, não inclua o diretório raiz, mas apenas os arquivos e diretórios nele contidos. Se você fizer download de um repositório do GitHub como um arquivo ZIP, não poderá implantar esse arquivo no estado em que se encontra no serviço de aplicativo. O GitHub adiciona diretórios aninhados adicionais no nível superior, que não funcionam com o serviço de aplicativo.

Em uma janela do terminal local, navegue até o diretório raiz do projeto do aplicativo.

Esse diretório deve conter o arquivo de entrada no seu aplicativo Web, como index.html, index.php e app.js. Além disso, é possível conter arquivos de gerenciamento de pacotes como project.json, composer.json, package.json, bower.json e requirements.txt.

A menos que deseje que o Serviço de Aplicativo execute a automação de implantação para você, execute todas as tarefas de compilação (por exemplo, npm, bower, gulp, composer e pip) e certifique-se de que tenha todos os arquivos necessários para executar o aplicativo. Esta etapa será necessária se desejar executar o pacote diretamente.

Criar um arquivo zip de tudo em seu projeto. Para projetos dotnet, isso é tudo no diretório de saída do comando dotnet publish (excluindo o próprio diretório de saída). Por exemplo, o seguinte comando em seu terminal para criar um pacote ZIP do conteúdo do diretório atual:

# Bash
zip -r <file-name>.zip .

# PowerShell
Compress-Archive -Path * -DestinationPath <file-name>.zip

Habilitar a execução por meio de pacote

A configuração do aplicativo WEBSITE_RUN_FROM_PACKAGE habilita a execução por meio de pacote. Para vê-la, execute o seguinte comando com a CLI do Azure.

az webapp config appsettings set --resource-group <group-name> --name <app-name> --settings WEBSITE_RUN_FROM_PACKAGE="1"

WEBSITE_RUN_FROM_PACKAGE="1" permite executar um aplicativo por meio de um pacote local para seu aplicativo. Você também pode executar por meio de um pacote remoto.

Executar o pacote

A maneira mais fácil de executar um pacote no Serviço de Aplicativo é com o comando az webapp deployment source config-zip da CLI do Azure. Por exemplo:

az webapp deployment source config-zip --resource-group <group-name> --name <app-name> --src <filename>.zip

Como a configuração WEBSITE_RUN_FROM_PACKAGE do aplicativo está definida, o comando não extrai o conteúdo do pacote para o diretório D:\home\site\wwwroot do aplicativo. Em vez disso, ele carrega o arquivo ZIP como está em D:\home\data\SitePackages e cria o arquivo packagename.txt no mesmo diretório, que contém o nome do pacote ZIP a ser carregado no runtime. Se você carregar o pacote ZIP de outra maneira (como FTP), precisará criar manualmente o diretório D:\home\data\SitePackages e o arquivo packagename.txt.

O comando também reinicia o aplicativo. Como WEBSITE_RUN_FROM_PACKAGE está definido, o Serviço de Aplicativo monta o pacote carregado como o diretório wwwroot somente leitura e executa o aplicativo diretamente no diretório montado.

Executar por meio de uma URL externa

Você também pode executar um pacote por meio de uma URL externa, como o Armazenamento de Blobs do Azure. Você pode usar o Gerenciador de Armazenamento do Azure para carregar arquivos de pacote para sua conta de armazenamento de Blobs. Você deve usar um contêiner de armazenamento privado com uma SAS (Assinatura de Acesso Compartilhado) ou usar uma identidade gerenciada para permitir que o runtime do Serviço de Aplicativo acesse o pacote com segurança.

Depois de carregar o arquivo no armazenamento de blobs e conseguir a URL de SAS, defina a configuração WEBSITE_RUN_FROM_PACKAGE do aplicativo como a URL. Veja como fazer isso com a CLI do Azure:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_RUN_FROM_PACKAGE="https://myblobstorage.blob.core.windows.net/content/SampleCoreMVCApp.zip?st=2018-02-13T09%3A48%3A00Z&se=2044-06-14T09%3A48%3A00Z&sp=rl&sv=2017-04-17&sr=b&sig=bNrVrEFzRHQB17GFJ7boEanetyJ9DGwBSV8OM3Mdh%2FM%3D"

Se você publicar um pacote atualizado com o mesmo nome no armazenamento de blobs, será necessário reiniciar o aplicativo para que o pacote atualizado seja carregado no Serviço de Aplicativo.

Acessar um pacote no Armazenamento de Blobs do Azure usando uma identidade gerenciada

Os Armazenamento de Blobs do Azure pode ser configurado para autorizar solicitações com o Microsoft Entra ID. Isso significa que, em vez de gerar uma chave SAS com uma expiração, você pode usar a identidade gerenciada do aplicativo. Por padrão, será usada a identidade do aplicativo atribuída pelo sistema. Se você quiser especificar uma identidade atribuída pelo usuário, defina a configuração de aplicativo WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID como a ID do recurso dessa identidade. A configuração também pode aceitar "SystemAssigned" como um valor, embora isso seja o mesmo que omitir completamente a configuração.

Para permitir que o pacote seja buscado usando a identidade:

  1. Verifique se o blob está configurado para acesso privado.

  2. Conceda à identidade à função Leitor de Dados do Blob do Armazenamento com escopo no blob do pacote. Confira Atribuir uma função do Azure para acesso aos dados do blob para obter detalhes sobre como criar a atribuição de função.

  3. Defina a configuração de aplicativo WEBSITE_RUN_FROM_PACKAGE como a URL do blob do pacote. O formato seria provavelmente "https://{nome-da-conta-de-armazenamento}.blob.core.windows.net/{nome-do-contêiner}/{caminho-do-pacote}" ou semelhante.

Implantar arquivos de WebJob ao executar do pacote

Há duas maneiras de implantar arquivos de WebJob ao habilitar a execução de um aplicativo do pacote:

  • Implantar no mesmo pacote ZIP que seu aplicativo: inclua-os como você normalmente faria no <project-root>\app_data\jobs\... (que mapeia para o caminho de implantação \site\wwwroot\app_data\jobs\... conforme especificado no Guia de início rápido do WebJobs).
  • Implantar separadamente do pacote ZIP do aplicativo: como o caminho de implantação \site\wwwroot\app_data\jobs\... usual agora é somente leitura, você não pode implantar arquivos de WebJob nele. Em vez disso, implante arquivos de WebJob em \site\jobs\..., que não é somente leitura. WebJobs implantados em \site\wwwroot\app_data\jobs\... e \site\jobs\... são executados.

Observação

Quando \site\wwwroot se torna somente leitura, operações como a criação de disable.job falharão.

Solução de problemas

  • A execução direta por meio de um pacote torna wwwroot somente leitura. Ocorrerá um erro se o aplicativo tentar gravar arquivos nesse diretório.
  • Não há suporte para formatos TAR e GZIP.
  • O arquivo ZIP pode ter no máximo 1 GB
  • Este recurso não é compatível com o cache local.
  • Para melhorar o desempenho da inicialização a frio, use a opção de zip local (WEBSITE_RUN_FROM_PACKAGE = 1).

Mais recursos