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.
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--image
a ), 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, useaz 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.
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_PRODUCTION
de 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 .
- 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 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
.
- Verifique os registos.