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êiner e implantar um aplicativo Web Python em Aplicativos de Contêiner do Azure. Os aplicativos de contêiner permitem que você implante aplicativos em contêineres sem gerenciar uma infraestrutura complexa.

Nesta parte do tutorial, você aprenderá a conteinerizar 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 uma instância do Banco de Dados do Azure para PostgreSQL - 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.

A screenshot of the services in the Tutorial - Deploy a Python App on Azure Container Apps. Section highlighted is what is covered in this article.

Obter o aplicativo de exemplo

Faça bifurcação 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 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 forking ou uma conta do GitHub, no entanto, você não poderá configurar o 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 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.

É 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 local 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

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

Você pode exibir as credenciais criadas para administrador com:

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

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

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 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 opção (igual --imagea -t ), o comando enfileirará 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 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.

É 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 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> → usa 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 usuário da conta de administrador. Não pode ser "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ário ou senhas , não use o caractere "$". Mais tarde, você cria variáveis de ambiente com esses valores em que o caractere "$" tem um significado especial dentro do contêiner Linux usado para executar aplicativos Python.

  • <sku-name> → O nome da camada de preços e a configuração de computação, por exemplo, "Standard_D2s_v3". Para obter mais informações, confira 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 acesso público ao servidor de qualquer serviço do Azure, como Aplicativos de Contêiner.

Observação

Se você planeja trabalhar o servidor PostgreSQL a partir de sua estação de trabalho local com ferramentas diferentes da CLI do Azure, será necessário 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 psql do terminal interativo do PostgreSQL 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 são incluídas para você no shell.

Etapa 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 do serviço de banco de dados.

Etapa 2. Crie o banco de dados.

postgres=> No 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 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.

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

az login

Etapa 2. Instale ou atualize a extensão para o comando Azure Container Apps with 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 local 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 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 por valores separados por espaço no formato key="value" com os seguintes valores.

  • AZURE_POSTGRESQL_HOST=<postgres-nome-do>_servidor.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())'.

Este é 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 Frasco, 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.

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

Etapa 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. 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 exemplo depois de adicionar um restaurante e duas avaliações.

Screenshot showing an example of the sample website built in this tutorial.

Solucionar problemas de implantação

  • Você esqueceu a 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.
    • Em VS Code, vá para a extensão do Azure e selecione a seção Aplicativos de Contêiner. Expanda a assinatura, expanda o ambiente de contêiner e, quando encontrar o aplicativo de contêiner, clique com o botão direito do mouse em python-container-app e selecione Procurar.
    • 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 VS Code Output e, em seguida, atualize o registro na extensão do Docker. Para atualizar, selecione a extensão do 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 'name.azurecr.io>'<".

    • Este erro ocorre quando as credenciais de administrador no ACR estão desativadas. Para verificar o status do 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 no comando de compilação com a CLI do Azure ou nos prompts de tarefa do VS Code.
    • Verifique se 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.
  • O site retorna "Bad Request (400)".

    • Verifique as variáveis de ambiente 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 de 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 "interno", a entrada não está definida corretamente.
    • Verifique a entrada do contêiner. Por exemplo, no portal do Azure, vá para o recurso Entrada do contêiner e verifique se Entrada HTTP está habilitada e se a opção Aceitar tráfego de qualquer lugar está selecionada.
  • O site não inicia, você vê "tempo limite de fluxo" ou nada é retornado.

    • Verifique os logs.
      • 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 mensagens stderr e stdout do Python na coluna "Stream_s". A saída de 'impressão' do Python será stdout messages.
      • Com a CLI do Azure, 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