Criar e implantar um aplicativo Web Python com Aplicativos de Contêiner do Azure e PostgreSQL

Este artigo faz parte de um tutorial sobre como contentorizar e implementar uma aplicação Web Python nas Aplicações de Contentor do Azure. O Container Apps permite que você implante aplicativos em contêineres sem gerenciar uma infraestrutura complexa.

Nesta parte do tutorial, você aprenderá a criar contêineres e implantar um aplicativo Web de exemplo Python (Django ou Flask). Especificamente, você cria a imagem de contêiner na nuvem e a implanta nos Aplicativos de Contêiner do Azure. Você define variáveis de ambiente que permitem que o aplicativo de contêiner se conecte a um Banco de Dados do Azure para PostgreSQL - instância de Servidor Flexível, onde o aplicativo de exemplo armazena dados.

Este diagrama de serviço destaca os componentes abordados neste artigo: criação e implantação de uma imagem de contêiner.

Uma captura de tela dos serviços no Tutorial - Implantar um aplicativo Python em aplicativos de contêiner do Azure.

Obter a aplicação de exemplo

Fork e clone o código de exemplo para seu ambiente de desenvolvedor.

Passo 1. Vá para o repositório GitHub do aplicativo de exemplo (Django ou Flask) e selecione Fork.

Siga as etapas para bifurcar o diretório para sua conta do GitHub. Você também pode baixar o repositório de código diretamente para sua máquina local sem bifurcar ou uma conta do GitHub, no entanto, você não poderá configurar o CI/CD discutido mais adiante no tutorial.

Passo 2. Use o comando git clone para clonar o repositório bifurcado na pasta python-container :

# Django
git clone https://github.com/$USERNAME/msdocs-python-django-azure-container-apps.git python-container

# Flask
# git clone https://github.com/$USERNAME/msdocs-python-flask-azure-container-apps.git python-container

Passo 3. Alterar diretório.

cd python-container

Criar uma imagem de contêiner a partir do código do aplicativo Web

Depois de seguir essas etapas, você terá um Registro de Contêiner do Azure que contém uma imagem de contêiner do Docker criada a partir do código de exemplo.

Os comandos da CLI do Azure podem ser executados no Azure Cloud Shell ou em uma estação de trabalho com a CLI do Azure instalada.

Passo 1. Crie um grupo de recursos com o comando az group create.

az group create \
--name pythoncontainer-rg \
--location <location>

<location> é um dos valores de Nome de local do Azure da saída do comando az account list-locations -o table.

Passo 2. Crie um registro de contêiner com o comando az acr create .

az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled

<registry-name> deve ser exclusivo no Azure e conter de 5 a 50 caracteres alfanuméricos.

Você pode visualizar as credenciais criadas para administrador com:

az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg

Passo 3. Entre no registro usando o comando az acr login .

az acr login --name <registry-name>

O comando adiciona "azurecr.io" ao nome para criar o nome de registro totalmente qualificado. Se for bem-sucedido, você verá a mensagem "Login bem-sucedido". Se estiver a aceder ao registo a partir de uma subscrição diferente daquela em que o registo foi criado, utilize o --suffix parâmetro.

Passo 4. Crie a imagem com o comando az acr build .

az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .

Tenha em atenção que:

  • O ponto (".") no final do comando indica o local do código-fonte a ser compilado. Se você não estiver executando esse comando no diretório raiz do aplicativo de exemplo, especifique o caminho para o código.

  • Se você estiver executando o comando no Azure Cloud Shell, use git clone para primeiro puxar o repositório para o ambiente do Cloud Shell primeiro e alterar o diretório para a raiz do projeto para que o ponto (".") seja interpretado corretamente.

  • Se você deixar de fora a -t opção (igual --imagea ), o comando enfileira uma compilação de contexto local sem enviá-la para o registro. Construir sem empurrar pode ser útil para verificar se a imagem é construída.

Passo 5. Confirme se a imagem do contêiner foi criada com o comando az acr repository list .

az acr repository list --name <registry-name>

Criar uma instância do PostgreSQL Flexible Server

O aplicativo de exemplo (Django ou Flask) armazena dados de revisão de restaurantes em um banco de dados PostgreSQL. Nestas etapas, você cria o servidor que conterá o banco de dados.

Os comandos da CLI do Azure podem ser executados no Azure Cloud Shell ou em uma estação de trabalho com a CLI do Azure instalada.

Passo 1. Use o comando az postgres flexible-server create para criar o servidor PostgreSQL no Azure. Não é incomum que esse comando seja executado por alguns minutos para ser concluído.

az postgres flexible-server create \
   --resource-group pythoncontainer-rg \
   --name <postgres-server-name>  \
   --location <location> \
   --admin-user <admin-username> \
   --admin-password <admin-password> \
   --sku-name Standard_D2s_v3 \
   --public-access 0.0.0.0 
  • "pythoncontainer-rg" → O nome do grupo de recursos usado neste tutorial. Se você usou um nome diferente, altere esse valor.

  • <postgres-server-name> → O nome do servidor de banco de dados PostgreSQL. Esse nome deve ser exclusivo em todo o Azure. O ponto de extremidade do servidor é "https://< postgres-server-name.postgres.database.azure.com>". Os caracteres permitidos são "A"-"Z", "0"-"9" e "-".

  • <local> → Use o mesmo local usado para o aplicativo Web. <location> é um dos valores de Nome de local do Azure da saída do comando az account list-locations -o table.

  • <admin-username> → Nome de utilizador da conta de administrador. Não pode ser "azure_superuser", "admin", "administrator", "root", "guest" ou "public". Use "demoadmin" para este tutorial.

  • <admin-password> Senha do usuário administrador. Ele deve conter de 8 a 128 caracteres de três das seguintes categorias: letras maiúsculas em inglês, letras minúsculas em inglês, números e caracteres não alfanuméricos.

    Importante

    Ao criar nomes de usuário ou senhas , não use o caractere "$". Mais tarde, você cria variáveis de ambiente com esses valores, onde o caractere "$" tem um significado especial dentro do contêiner Linux usado para executar aplicativos Python.

  • <sku-name> → O nome da camada de preço e a configuração de computação, por exemplo, "Standard_D2s_v3". Para obter mais informações, consulte Preços do Banco de Dados do Azure para PostgreSQL. Para listar SKUs disponíveis, use az postgres flexible-server list-skus --location <location>.

  • <public-access> → Use "0.0.0.0", que permite o acesso público ao servidor a partir de qualquer serviço do Azure, como Aplicativos de Contêiner.

Nota

Se você planeja trabalhar o servidor PostgreSQL de sua estação de trabalho local com ferramentas diferentes da CLI do Azure, precisará adicionar uma regra de firewall com o comando az postgres flexible-server firewall-rule create .

Criar um banco de dados no servidor

Neste ponto, você tem um servidor PostgreSQL. Nesta seção, você cria um banco de dados no servidor.

Você pode usar o terminal interativo PostgreSQL psql em seu ambiente local ou no Azure Cloud Shell, que também pode ser acessado no portal do Azure. Ao trabalhar com psql, geralmente é mais fácil usar o Cloud Shell porque todas as dependências estão incluídas para você no shell.

Passo 1. Conecte-se ao banco de dados com psql.

psql --host=<postgres-server-name>.postgres.database.azure.com \
     --port=5432 \
     --username=demoadmin@<postgres-server-name> \
     --dbname=postgres

Onde <postgres-server-name> é o nome do servidor PostgreSQL. O comando solicitará a senha de administrador.

Se você tiver problemas para se conectar, reinicie o banco de dados e tente novamente. Se você estiver se conectando a partir de seu ambiente local, seu endereço IP deverá ser adicionado à lista de regras de firewall para o serviço de banco de dados.

Passo 2. Crie o banco de dados.

No prompt, digite postgres=> :

CREATE DATABASE restaurants_reviews;

O ponto-e-vírgula (";") no final do comando é necessário. Para verificar se o banco de dados foi criado com êxito, use o comando \c restaurants_reviews. Digite \? para mostrar ajuda ou \q para sair.

Você também pode se conectar ao servidor flexível do Azure PostgreSQL e criar um banco de dados usando o Azure Data Studio ou qualquer outro IDE que ofereça suporte ao PostgreSQL.

Implantar o aplicativo Web em aplicativos de contêiner

Os aplicativos de contêiner são implantados em ambientes de aplicativos de contêiner, que atuam como um limite seguro. Nas etapas a seguir, você cria o ambiente, um contêiner dentro do ambiente e configura o contêiner para que o site fique visível externamente.

Passo 1. Entre no Azure e autentique-se, se necessário.

az login

Passo 2. Instale ou atualize a extensão para Aplicativos de Contêiner do Azure com o comando az extension add .

az extension add --name containerapp --upgrade

Passo 3. Crie um ambiente Container Apps com o comando az containerapp env create .

az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>

<location> é um dos valores de Nome de local do Azure da saída do comando az account list-locations -o table.

Passo 4. Obtenha as credenciais de entrada para o Registro de Contêiner do Azure.

az acr credential show -n <registry-name>

Use o nome de usuário e uma das senhas retornadas da saída do comando.

Passo 5. Crie um aplicativo de contêiner no ambiente com o comando az containerapp create .

az containerapp create \
--name python-container-app \
--resource-group pythoncontainer-rg \
--image <registry-name>.azurecr.io/pythoncontainer:latest \
--environment python-container-env \
--ingress external \
--target-port 8000 \
--registry-server <registry-name>.azurecr.io \
--registry-username <registry-username> \
--registry-password <registry-password> \
--env-vars <env-variable-string>
--query properties.configuration.ingress.fqdn

<env-variable-string> é uma cadeia de caracteres composta de valores separados por espaço no formato key="value" com os seguintes valores.

  • AZURE_POSTGRESQL_HOST=<nome-do-servidor-postgres.postgres.database.azure.com>
  • AZURE_POSTGRESQL_DATABASE=restaurants_reviews
  • AZURE_POSTGRESQL_USERNAME=demoadmin
  • AZURE_POSTGRESQL_PASSWORD=<db-senha>
  • RUNNING_IN_PRODUCTION=1
  • AZURE_SECRET_KEY=<SUA-CHAVE-SECRETA>

Gere AZURE_SECRET_KEY valor usando a saída de python -c 'import secrets; print(secrets.token_hex())'.

Eis um exemplo: --env-vars AZURE_POSTGRESQL_HOST="my-postgres-server.postgres.database.azure.com" AZURE_POSTGRESQL_DATABASE="restaurants_reviews" AZURE_POSTGRESQL_USERNAME="demoadmin" AZURE_POSTGRESQL_PASSWORD="somepassword" RUNNING_IN_PRODUCTION="1" AZURE_SECRET_KEY=asdfasdfasdf.

Passo 7. Somente para Django, migre e crie esquema de banco de dados. (No aplicativo de exemplo Flask, isso é feito automaticamente e você pode pular esta etapa.)

Conecte-se com o comando az containerapp exec :

az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg

Em seguida, no prompt de comando do shell, digite python manage.py migrate.

Não é necessário migrar para revisões do contêiner.

Passo 8. Teste o site.

O az containerapp create comando inserido anteriormente gera uma URL de aplicativo que você pode usar para navegar até o aplicativo. O URL termina em "azurecontainerapps.io". Navegue até o URL em um navegador. Como alternativa, você pode usar o comando az containerapp browse .

Veja um exemplo do site de exemplo depois de adicionar um restaurante e duas avaliações.

Captura de tela mostrando um exemplo do site de exemplo criado neste tutorial.

Resolver erros de implementação

  • Esqueceu-se do URL da Aplicação para aceder ao website.

    • No portal do Azure, vá para a página Visão geral do Aplicativo de Contêiner e procure a URL do Aplicativo.
    • No VS Code, vá para o modo de exibição do Azure (Ctrl+Shift+A) e expanda a assinatura na qual você está trabalhando. Expanda o nó Container Apps e, em seguida, expanda o ambiente gerenciado e clique com o botão direito do mouse em python-container-app e selecione Procurar. Ele abrirá o navegador com a URL do aplicativo.
    • Na CLI do Azure, utilize o comando az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn.
  • No VS Code, a tarefa Criar Imagem no Azure retorna um erro.

    • Se vir a mensagem "Erro: falha ao transferir contexto. Verifique se o URL está incorreto." na janela VS Code Output e, em seguida, atualize o registro na extensão Docker. Para atualizar, selecione a extensão Docker, vá para a seção Registros, localize o registro e selecione-o.
    • Se você executar a tarefa Criar Imagem no Azure novamente, verifique se o registro de uma execução anterior existe e, em caso afirmativo, use-o.
  • No portal do Azure durante a criação de um Aplicativo de Contêiner, você verá um erro de acesso que contém "Não é possível acessar o ACR '<nome.azurecr.io>'".

    • Este erro ocorre quando as credenciais de administrador no ACR estão desativadas. Para verificar o status de administrador no portal, vá para o Registro de Contêiner do Azure, selecione o recurso Chaves de acesso e verifique se o usuário Admin está habilitado.
  • Sua imagem de contêiner não aparece no Registro de Contêiner do Azure.

    • Verifique a saída do comando da CLI do Azure ou da saída do VS Code e procure mensagens para confirmar o sucesso.
    • Verifique se o nome do Registro foi especificado corretamente em seu comando build com a CLI do Azure ou nos prompts de tarefa do VS Code.
    • Certifique-se de que as suas credenciais não expiraram. Por exemplo, no VS Code, localize o registro de destino na extensão do Docker e atualize. Na CLI do Azure, execute az login.
  • Website retorna "Bad Request (400)".

    • Verifique as variáveis de ambiente do PostgreSQL passadas para o contêiner. O erro 400 geralmente indica que o código Python não pode se conectar à instância do PostgreSQL.
    • O código de exemplo usado neste tutorial verifica a existência da variável RUNNING_IN_PRODUCTIONde ambiente do contêiner, que pode ser definida como qualquer valor como "1".
  • O site retorna "Não encontrado (404)".

    • Verifique a URL do aplicativo na página Visão geral do contêiner. Se a URL do aplicativo contiver a palavra "internal", a entrada não está definida corretamente.
    • Verifique a entrada do contentor. Por exemplo, no portal do Azure, vá para o recurso Ingress do contêiner e verifique se HTTP Ingress está habilitado e Aceitando tráfego de qualquer lugar está selecionado.
  • O site não inicia, você vê "tempo limite de streaming" ou nada é retornado.

    • Verifique os registos.
      • No portal do Azure, vá para o recurso de gerenciamento de Revisão do Aplicativo de Contêiner e verifique o Status de Provisionamento do contêiner.
        • Se "Provisionamento", aguarde até que o provisionamento seja concluído.
        • Se "Falhou", selecione a revisão e visualize os logs do console. Escolha a ordem das colunas para mostrar "Tempo gerado", "Stream_s" e "Log_s". Classifique os logs por mais recentes primeiro e procure por mensagens Python stderr e stdout na coluna "Stream_s". A saída de 'impressão' do Python será mensagens stdout .
      • Com a CLI do Azure, use o comando az containerapp logs show .
    • Se estiver usando a estrutura Django, verifique se as tabelas restaurants_reviews existem no banco de dados. Caso contrário, use um console para acessar o contêiner e executar python manage.py migrate.

Próximo passo