Implantar um aplicativo Web Flask ou FastAPI em contêineres no Serviço de Aplicativo do Azure

Este tutorial mostra como implantar um aplicativo Web Python Flask ou FastAPI para o Serviço de aplicativo do Azure usando o recurso Aplicativo Web para Contêineres. O Aplicativo Web para Contêineres fornece uma fácil rampa para os desenvolvedores aproveitarem a plataforma totalmente gerenciada do Serviço de aplicativo do Azure, mas que também querem um único artefato implantável contendo um aplicativo e todas as suas dependências. Para obter mais informações sobre como usar contêineres no Azure, consulte Comparando opções de contêiner do Azure.

Nesse tutorial você usa a CLI do Docker e o Docker para criar opcionalmente uma imagem do Docker e testá-la localmente. Use a CLI do Azure para criar uma imagem do Docker em um Registro de Contêiner do Azure e implantá-la no Serviço de Aplicativo do Azure. O aplicativo da Web é configurado com sua atribuição de sistema identidade gerenciada (conexões sem senha) e acesso baseado em função do Azure para efetuar pull da imagem do Docker do Registro de Contêiner do Azure durante a implantação. Você também pode implantar com o Visual Studio Code com a Extensão de Ferramentas do Azure instalada.

Para obter um exemplo de construção e criação de uma imagem do Docker para ser executada no Azure Container Apps, consulte Implantar um aplicativo Web Flask ou FastPI nos Aplicativos de Contêiner do Azure.

Observação

Este tutorial mostra a criação de uma imagem do Docker que pode ser executada no Serviço de Aplicativo. Isso não é necessário para usar o Serviço de Aplicativo. Você pode implantar o código diretamente de um workspace local no Serviço de Aplicativo sem criar uma imagem do Docker. Para um exemplo, consulte Início Rápido: Implantar um aplicativo Web Python (Django ou Flask) para o Serviço de Aplicativo do Azure.

Pré-requisitos

Para concluir este tutorial, você precisará de:

Obter o código de exemplo

Em seu ambiente local, obtenha o código.

git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git
cd msdocs-python-flask-webapp-quickstart

Adicionar arquivos Dockerfile e .dockerignore

Adicione um Dockerfile para instruir o Docker sobre como criar a imagem. O Dockerfile especifica o uso do Gunicorn, um servidor da Web em nível de produção que encaminha solicitações da Web para as estruturas Flask e FastAPI. Os comandos ENTRYPOINT e CMD instruem o Gunicorn a lidar com solicitações para o objeto do aplicativo.

# syntax=docker/dockerfile:1

FROM python:3.11

WORKDIR /code

COPY requirements.txt .

RUN pip3 install -r requirements.txt

COPY . .

EXPOSE 50505

ENTRYPOINT ["gunicorn", "app:app"]

50505 é usado para a porta do contêiner (interna) neste exemplo, mas você pode usar qualquer porta livre.

Verifique o arquivo requirements.txt para certificar-se de que ele contém gunicorn.

Flask==2.2.2
gunicorn
Werkzeug==2.2.2

Adicione um arquivo .dockerignore para excluir arquivos desnecessários da imagem.

.git*
**/*.pyc
.venv/

Configurar gunicorn

O Gunicorn pode ser configurado com um arquivo gunicorn.conf.py. Quando o arquivo gunicorn.conf.py está localizado no mesmo diretório em que o gunicorn é executado, não é necessário especificar seu local no arquivo Dockerfile. Para obter mais informações sobre como especificar o arquivo de configuração, consulte Configurações do Gunicorn.

Neste tutorial, o arquivo de configuração sugerido configura o gunicorn para aumentar seu número de trabalhadores com base no número de núcleos de CPU disponíveis. Para obter mais informações sobre configurações de arquivo gunicorn.conf.py, consulte Configuração do Gunicorn.

# Gunicorn configuration file
import multiprocessing

max_requests = 1000
max_requests_jitter = 50

log_file = "-"

bind = "0.0.0.0:50505"

workers = (multiprocessing.cpu_count() * 2) + 1
threads = workers

timeout = 120

Criar e executar a imagem localmente

Crie a imagem localmente.

docker build --tag flask-demo .

Observação

Se o comando docker build retornar um erro, verifique se o docker deamon está em execução. No Windows, certifique-se de que o Docker Desktop esteja em execução.

Execute a imagem localmente em um contêiner do Docker.

docker run --detach --publish 5000:50505 flask-demo

Abra a URL http://localhost:5000 no seu navegador para ver o aplicativo Web em execução localmente.

A opção --detach executa o contêiner em segundo plano. A opção --publish mapeia a porta do contêiner para uma porta no host. A porta do host (externa) é a primeira no par e a porta do contêiner (interna) é a segunda. Para obter mais informações, confira Referência sobre docker run.

Criar um grupo de recursos e o Registro de Contêineres do Azure

  1. Execute o comando az login para entrar no Azure.

    az login
    
  2. Execute o comando az upgrade para garantir que sua versão da CLI do Azure esteja atualizada.

    az upgrade
    
  3. Crie um grupo com o comando az group create.

    az group create --name web-app-simple-rg --location eastus
    

    Um grupo de recursos do Azure é um contêiner lógico no qual os recursos do Azure são implantados e gerenciados. Ao criar um grupo de recursos, você especifica um local, como eastus.

  4. Crie um Registro de Contêiner do Azure com o comando az acr create.

    az acr create --resource-group web-app-simple-rg \
    --name webappacr123 --sku Basic
    

    Observação

    O nome do registro precisa ser exclusivo no Azure. Se você receber um erro, tente um nome diferente. Os nomes do Registro podem consistir em 5 a 50 caracteres alfanuméricos. Hifens e sublinhados não são permitidos. Para saber mais, consulte Regras de nome do Registro de Contêiner do Azure. Se você usar um nome diferente, certifique-se de usar seu nome em vez de webappacr123 nos comandos que fazem referência ao Registro e aos artefatos do Registro nas seções a seguir.

    Um Registro de Contêiner do Azure é um registro privado do Docker que armazena imagens para uso em Instâncias de Contêiner do Azure, Serviço de Aplicativo do Azure, Serviço de Kubernetes do Azure e outros serviços. Ao criar um registro, você especifica um nome, SKU e grupo de recursos.

Criar a imagem no Registro de Contêiner do Azure

Crie a imagem do Docker no Azure com o comando az acr build. O comando usa o Dockerfile no diretório atual e envia a imagem para o registro.

az acr build \
  --resource-group web-app-simple-rg \
  --registry webappacr123 \
  --image webappsimple:latest .

A opção --registry especifica o nome do Registro e a opção --image especifica o nome da imagem. O nome da imagem está no formato registry.azurecr.io/repository:tag.

Implantar um aplicativo Web no Azure

  1. Crie um plano do Serviço de Aplicativo com o comando az appservice plan.

    az appservice plan create \
    --name webplan \
    --resource-group web-app-simple-rg \
    --sku B1 \
    --is-linux
    
  2. Defina uma variável de ambiente como a sua ID da assinatura. Ele é usado no parâmetro --scope no próximo comando.

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    

    O comando para criar a variável de ambiente é mostrado para o shell Bash. Altere a sintaxe conforme apropriado para outros ambientes.

  3. Crie um aplicativo Web, com o comando az webapp create.

    az webapp create \
    --resource-group web-app-simple-rg \
    --plan webplan --name webappsimple123 \
    --assign-identity [system] \
    --role AcrPull \
    --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/web-app-simple-rg \
    --acr-use-identity --acr-identity [system] \
    --container-image-name webappacr123.azurecr.io/webappsimple:latest 
    

    Observações:

    • O nome do aplicativo Web deve ser exclusivo no Azure. Se você receber um erro, tente um nome diferente. O nome pode consistir em caracteres alfanuméricos e hífens, mas não pode começar ou terminar com um hífen. Para saber mais, consulte Regras de nomes da Microsoft.Web.

    • Se você estiver usando um nome diferente do webappacr123 para seu Registro de Contêiner do Azure, certifique-se de atualizar o parâmetro --container-image-name adequadamente.

    • Os parâmetros --assign-identity, --role e --scope habilitam a identidade gerenciada atribuída pelo sistema no aplicativo Web e atribuem a ela a AcrPull função no grupo de recursos. Isso dá à identidade gerenciada permissão para efetuar pull de imagens de qualquer Registro de Contêiner do Azure no grupo de recursos.

    • Os parâmetros --acr-use-identity e --acr-identity configuram o aplicativo Web para usar sua identidade gerenciada atribuída pelo sistema para extrair imagens do Registro de Contêiner do Azure.

    • Pode levar alguns minutos para que o aplicativo Web seja criado. Você pode verificar os logs de implantação com o comando az webapp log tail. Por exemplo, az webapp log tail --resource-group web-app-simple-rg --name webappsimple123. Se você vir entradas com "warmup", o contêiner está sendo implantado.

    • A URL do aplicativo Web é <web-app-name>.azurewebsites.net, por exemplo, https://webappsimple123.azurewebsites.net.

Faça atualizações e reimplante

Depois de fazer alterações de código, você pode reimplantar no Serviço de Aplicativo com os comandos az acr build e az webapp update.

Limpar

Todos os recursos do Azure criados neste tutorial estão no mesmo grupo de recursos. Remover o grupo de recursos também remove todos os recursos do grupo de recursos e é a maneira mais rápida de remover todos os recursos do Azure usados para seu aplicativo.

Para remover recursos, use o comando az group delete.

az group delete --name web-app-simple-rg

Você também pode remover o grupo no portal do Azure ou no Visual Studio Code e na Extensão de Ferramentas do Azure.

Próximas etapas

Para saber mais, consulte os recursos a seguir: