Compartilhar via


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

Este artigo faz parte de um tutorial sobre como colocar em contêineres e implantar um aplicativo Web Python nos Aplicativos de Contêiner do Azure. Os Aplicativos de Contêiner do Azure permitem que você implemente aplicativos em contêineres sem gerenciar infraestruturas complexas.

Nesta parte do tutorial, você aprenderá a conteinerizar e implantar um aplicativo Web de amostra do 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 uma instância do Banco de Dados do Azure para PostgreSQL – Servidor Flexível , em que o aplicativo de exemplo armazena dados.

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

Captura de tela dos serviços no Tutorial – Implantar um aplicativo Python em Aplicativos de Contêiner do Azure. A seção realçada é o que é abordado neste artigo.

Obter o aplicativo de exemplo

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

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

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 seu computador local sem bifurcação ou uma conta do GitHub, no entanto, você não poderá configurar CI/CD discutido posteriormente no tutorial.

Etapa 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

Etapa 3. Alterar o 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 com base no código de exemplo.

É possível executar os comandos da CLI do Azure no Azure Cloud Shell ou em uma estação de trabalho com a CLI do Azure instalada.

Etapa 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 localização do Azure da saída do comando az account list-locations -o table.

Etapa 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

<nome do registro> 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

Etapa 3. Faça login 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 do Registro totalmente qualificado. Se for bem-sucedido, você verá a mensagem "Login bem-sucedido". Se você estiver acessando o registro de uma assinatura diferente daquela em que o registro foi criado, use a opção --suffix.

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

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

Observe 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 primeiro para efetuar pull do repositório para o ambiente do Cloud Shell primeiro e altere o diretório para a raiz do projeto para que o ponto (".") seja interpretado corretamente.

  • Se você deixar de fora a opção (igual a -t --image), 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.

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

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

Crie uma instância de Servidor Flexível do PostgreSQL

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

É possível executar os comandos da CLI do Azure no Azure Cloud Shell ou em uma estação de trabalho com a CLI do Azure instalada.

Etapa 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 até 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 que você usou neste tutorial. Se você usou um nome diferente, altere este valor.

  • <postgres-server-name> → O nome do servidor do banco de dados PostgreSQL. Esse nome precisa ser exclusivo em todo o Azure. O endpoint do servidor é "https://<postgres-server-name>.postgres.database.azure.com". É permitido usar os caracteres de "A"-"Z", "0"-"9" e "-".

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

  • <admin-username> → Nome de usuário da conta de administrador. It can't be "azure_superuser", "admin", "administrator", "root", "guest" ou "public". Use "demoadmin" para este tutorial.

  • <admin-password> A senha do usuário administrador. Ela precisa conter de 8 a 128 caracteres de três das seguintes categorias: Letras maiúsculas, letras minúsculas, números e caracteres não alfanuméricos.

    Importante

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

  • <sku-name> → o nome do tipo de preço e a configuração de computação como, por exemplo "Standard_D2s_v3". Para obter mais informações, confira Preços do Banco de Dados do Azure para PostgreSQL. Para listar os 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 de qualquer serviço do Azure, como Aplicativos de Contêiner.

Observação

Se você planeja trabalhar com 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 .

Crie um banco de dados no servidor

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

Você pode usar o terminal interativo do 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.

Etapa 1. Conectar-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 do administrador.

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

Etapa 2. Crie o banco de dados.

No postgres=> prompt, digite:

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 a 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 dê suporte ao PostgreSQL.

Implantar o aplicativo Web em Aplicativos de Contêiner

Os aplicativos de contêiner são implantados em ambientes de Aplicativosde 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.

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

az login

Etapa 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

Etapa 3. Crie um ambiente de aplicativos de contêiner 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 localização do Azure da saída do comando az account list-locations -o table.

Etapa 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.

Etapa 5. Crie um aplicativo contêiner no ambiente com o comando az containerapp env 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 string composta por valores separados por espaço no formato key="value" com os seguintes valores.

  • AZURE_POSTGRESQL_HOST=<postgres-server-name>.postgres.database.azure.com
  • AZURE_POSTGRESQL_DATABASE=restaurants_reviews
  • AZURE_POSTGRESQL_USERNAME=demoadmin
  • AZURE_POSTGRESQL_PASSWORD=<db-password>
  • RUNNING_IN_PRODUCTION=1
  • AZURE_SECRET_KEY=<YOUR-SECRET-KEY>

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

Aqui está 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.

Etapa 7. Somente para Django, migre e crie um esquema de banco de dados. (No aplicativo de exemplo Flask, isso é feito automaticamente e você pode ignorar 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.

Você não precisa migrar para revisões do contêiner.

Etapa 8. Testar o site.

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

Aqui está um exemplo do site de amostra depois de adicionar um restaurante e duas avaliações.

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

Solucionar problemas de implantação

  • Você esqueceu o URL do aplicativo para acessar o site.

    • 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ó Aplicativos de contêiner, e, em seguida, expanda o ambiente gerenciado, clique com o botão direito do mouse em python-container-app e selecione Procurar. Ele abrirá o navegador com a URL do aplicativo.
    • Com a CLI do Azure, use 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 você vir a mensagem "Erro: falha ao baixar o contexto. Verifique se a URL está incorreta." na janela Saída do VS Code e atualize o registro na extensão do Docker. Para atualizar, selecione a extensão do Docker, vá para a seção Registros, encontre 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 '<name.azurecr.io>'".

    • Esse erro ocorre quando as credenciais de administrador no ACR estão desabilitadas. Para verificar o status do administrador no portal, acesse o Registro de Contêiner do Azure, selecione o recurso Chaves de acesso e verifique se o usuário Administrador 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 êxito.
    • Verifique se o nome do registro foi especificado corretamente no comando de build com a CLI do Azure ou nos prompts de tarefa do VS Code.
    • Certifique-se de que suas credenciais não estejam expiradas. Por exemplo, no VS Code, localize o registro de destino na extensão do Docker e atualize. No Azure CLE, execute az login.
  • O site retorna "Solicitação incorreta (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 de ambiente do contêiner RUNNING_IN_PRODUCTION, 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 "interno", a entrada não será definida corretamente.
    • Verifique a entrada do contêiner. Por exemplo, no portal do Azure, acesse o recurso Entrada do contêiner e certifique-se de que Entrada HTTP está habilitada e Aceitar tráfego de qualquer lugar esteja selecionada.
  • O site não é iniciado, você vê "tempo limite de transmissão" ou nada é retornado.

    • Verifique os logs.
      • No portal do Azure, acesse 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 "Falha", selecione a revisão e exiba 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 'print' do Python será mensagens stdout .
      • Com o Azure CLI, use o comando az containerapp logs show.
    • Se estiver usando o framework 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 migrateo .

Próxima etapa