Implantar um aplicativo Python (Django ou Flask) com o PostgreSQL no Azure

Neste tutorial, você implantará um aplicativo Web Python baseado em dados (Django ou Flask) no Serviço de Aplicativo do Azure com o serviço de banco de dados relacional do Banco de Dados do Azure para PostgreSQL. O Serviço de Aplicativo do Azure tem suporte para Python em um ambiente de servidor Linux.

An architecture diagram showing an App Service with a PostgreSQL database in Azure.

Para concluir este tutorial, você precisará de:

Ir para o final

Com a Azure Developer CLI instalada, você pode implantar um aplicativo de exemplo totalmente configurado mostrado neste tutorial e vê-lo em execução no Azure. Basta executar os seguintes comandos em um diretório de trabalho vazio:

azd auth login
azd init --template msdocs-flask-postgresql-sample-app
azd up

Aplicativo de exemplo

Aplicativos Python de exemplo usando a estrutura Flask e Django são fornecidos para ajudá-lo a acompanhar este tutorial. Para implantá-los sem executá-los localmente, ignore esta parte.

Para executar o aplicativo localmente, verifique se o Python 3.7 ou superior e o PostgreSQL estão instalados localmente. Clone o branch starter-no-infra do repositório de exemplo e altere para a raiz do repositório.

git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app
cd msdocs-flask-postgresql-sample-app

Crie um arquivo .env conforme mostrado abaixo usando o arquivo . env.sample como guia. Defina o valor de DBNAME como o nome de um banco de dados existente em sua instância do PostgreSQL local. Defina os valores de DBHOST, DBUSER e DBPASS conforme apropriado para sua instância do PostgreSQL local.

DBNAME=<database name>
DBHOST=<database-hostname>
DBUSER=<db-user-name>
DBPASS=<db-password>

Crie um ambiente virtual para o aplicativo:

py -m venv .venv
.venv\scripts\activate

Instalar as dependências:

pip install -r requirements.txt

Execute o aplicativo de exemplo usando os seguintes comandos:

# Run database migration
flask db upgrade
# Run the app at http://127.0.0.1:5000
flask run

1. Criar Serviço de Aplicativo e PostgreSQL

git clone https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.git

Nesta etapa, você criará os recursos do Azure. As etapas usadas neste tutorial criam um conjunto de recursos seguros por padrão que incluem o Serviço de Aplicativo e o Banco de Dados do Azure para PostgreSQL. Para o processo de criação, você especificará:

  • O Nome do aplicativo Web. Esse nome é usado como parte do nome DNS para seu aplicativo Web na forma de https://<app-name>.azurewebsites.net.
  • A Região para executar o aplicativo fisicamente no mundo.
  • A pilha de runtime para o aplicativo. É aqui que você seleciona a versão do Python a ser usada para seu aplicativo.
  • O plano de hospedagem para o aplicativo. É o tipo de preço que inclui o conjunto de recursos e a capacidade de colocação em escala do seu aplicativo.
  • O Grupo de Recursos para o aplicativo. Um grupo de recursos permite agrupar (em um contêiner lógico) todos os recursos necessários do Azure para o aplicativo.

Entre no portal do Azure e siga estas etapas para criar seus recursos do Serviço de Aplicativo do Azure.

Etapa 1: no portal do Azure:

  1. Insira “banco de dados do aplicativo Web” na caixa de pesquisa na parte superior do portal do Azure.
  2. Selecione o item Web App + Banco de Dados no título Marketplace. Você também pode navegar diretamente para o assistente de criação.

A screenshot showing how to use the search box in the top tool bar to find the Web App + Database creation wizard (Flask).

Etapa 2: na página Criar aplicativo Web + Banco de dados, preencha o formulário conforme mostrado a seguir.

  1. Grupo de recursos → selecione Criar novo e use um nome de msdocs-python-postgres-tutorial.
  2. Região → qualquer região do Azure próxima a você.
  3. Nomemsdocs-Python-postgres-XYZ, em que XYZ são três caracteres aleatórios. Esse nome deve ser exclusivo no Azure.
  4. Pilha de runtimePython 3.10.
  5. O Banco de dadosPostgreSQL- Servidor Flexível é selecionado por padrão como o mecanismo de banco de dados. O nome do servidor e o nome do banco de dados também são definidos por padrão como valores apropriados.
  6. Plano de hospedagemBásico. Quando estiver pronto, você poderá escalar verticalmente até um tipo de preço de produção posteriormente.
  7. Selecione Examinar + criar.
  8. Depois de concluir a validação, selecione Criar.

A screenshot showing how to configure a new app and database in the Web App + Database wizard (Flask).

Etapa 3: a implantação leva alguns minutos para ser concluída. Depois que a implantação for concluída, selecione o botão Ir para o recurso. Você é levado diretamente para o aplicativo do Serviço de Aplicativo, mas os seguintes recursos são criados:

  • Grupo de recursos → o contêiner para todos os recursos criados.
  • Plano do Serviço de Aplicativo → define os recursos de computação para o Serviço de Aplicativo. É criado um plano do Linux na camada Básico.
  • Serviço de Aplicativo → Representa seu aplicativo e é executado no plano de Serviço de Aplicativo.
  • Rede virtual → Integrada ao aplicativo do Serviço de Aplicativo e isola o tráfego de rede de back-end.
  • Servidor flexível do Banco de Dados do Azure para PostgreSQL → Acessível somente da rede virtual. Um banco de dados e um usuário são criados para você no servidor.
  • Zona DNS privada → Habilita a resolução de DNS do servidor PostgreSQL na rede virtual.

A screenshot showing the deployment process completed (Flask).

2. Verificar as configurações de conexão

O assistente de criação gerou as variáveis de conectividade para você já como configurações de aplicativo. As configurações do aplicativo são uma maneira de manter os segredos de conexão fora do seu repositório de códigos. Quando você estiver pronto para mover seus segredos para um local mais seguro, aqui está um artigo sobre o armazenamento no Azure Key Vault.

Etapa 1: na página Serviço de Aplicativo, no menu à esquerda, selecione Configuração.

A screenshot showing how to open the configuration page in App Service (Flask).

Etapa 2: na guia Configurações do aplicativo na página Configuração, verifique se AZURE_POSTGRESQL_CONNECTIONSTRING está presente. Isso será injetado no ambiente de tempo de execução como uma variável de ambiente.

A screenshot showing how to see the autogenerated connection string (Flask).

Etapa 3: em um terminal ou prompt de comando, execute o script Python a seguir para gerar um segredo exclusivo: python -c 'import secrets; print(secrets.token_hex())'. Copie o valor de saída para usar na próxima etapa.

3. Implantar código de exemplo

Nesta etapa, você configurará a implantação do GitHub usando o GitHub Actions. É apenas uma das muitas maneiras de implantar no Serviço de Aplicativo, mas também uma ótima maneira de ter integração contínua em seu processo de implantação. Por padrão, cada git push em seu repositório GitHub iniciará a ação de compilação e implantação.

Etapa 1: em uma nova janela do navegador:

  1. Entre em sua conta do GitHub.
  2. Navegue até https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.
  3. Selecione Fork.
  4. Selecione Criar fork.

A screenshot showing how to create a fork of the sample GitHub repository (Flask).

Etapa 2: na página do GitHub, abra o Visual Studio Code no navegador pressionando a tecla ..

A screenshot showing how to open the Visual Studio Code browser experience in GitHub (Flask).

Etapa 3: no navegador do Visual Studio Code, abra azureproject/production.py no explorer. Consulte as variáveis de ambiente que estão sendo usadas no ambiente de produção, incluindo as configurações de aplicativo que você viu na página de configuração.

A screenshot showing Visual Studio Code in the browser and an opened file (Flask).

Etapa 4: de volta à página Serviço de Aplicativo, no menu à esquerda, selecione Centro de Implantação.

A screenshot showing how to open the deployment center in App Service (Flask).

Etapa 5: na página Centro de Implantação:

  1. Em Origem, selecione GitHub. Por padrão, o GitHub Actions é selecionado como o provedor de build.
  2. Entre em sua conta do GitHub e siga o prompt para autorizar o Azure.
  3. Em Organização, selecione sua conta.
  4. Em Repositório, selecione msdocs-flask-postgresql-sample-app.
  5. Em Branch, selecione main.
  6. Manter a opção padrão selecionada para Adicionar um fluxo de trabalho.
  7. Em Tipo de autenticação, selecione Identidade atribuída pelo usuário.
  8. No menu superior, selecione Salvar. O Serviço de Aplicativo confirma um arquivo de fluxo de trabalho no repositório GitHub escolhido, no diretório .github/workflows.

A screenshot showing how to configure CI/CD using GitHub Actions (Flask).

Etapa 6: na página Centro de Implantação:

  1. Selecione Logs. Uma execução de implantação já foi iniciada.
  2. No item de log para a execução da implantação, selecione Compilar/Implantar Logs.

A screenshot showing how to open deployment logs in the deployment center (Flask).

Etapa 7: você será levado para o repositório do GitHub e verá que a ação do GitHub está em execução. O arquivo do fluxo de trabalho define dois estágios separados, compilar e implantar. Aguarde a execução do GitHub para mostrar um status de Concluído. Ela leva cerca de 5 minutos.

A screenshot showing a GitHub run in progress (Flask).

Está enfrentando problemas? Verifique o Guia de Solução de Problemas.

4. Gerar esquema de banco de dados

Com o banco de dados PostgreSQL protegido pela rede virtual, a maneira mais fácil de executar as migrações de banco de dados Flask é em uma sessão de SSH com o contêiner do Serviço de Aplicativo.

Etapa 1: de volta na página do Serviço de Aplicativo, no menu à esquerda,

  1. Selecione SSH.
  2. Selecione Ir.

A screenshot showing how to open the SSH shell for your app from the Azure portal (Flask).

Etapa 2: no terminal SSH, execute flask db upgrade. Se ele for bem-sucedido, o Serviço de Aplicativo está se conectando com êxito ao banco de dados. Somente as alterações nos arquivos /home podem persistir além das reinicializações do aplicativo. As alterações feitas fora de /home não são persistentes.

A screenshot showing the commands to run in the SSH shell and their output (Flask).

5. Navegar até o aplicativo

Etapa 1: na página Serviço de Aplicativo:

  1. No menu esquerdo, selecione Visão geral.
  2. Selecione a URL do aplicativo. Você também pode navegar diretamente até https://<app-name>.azurewebsites.net.

A screenshot showing how to launch an App Service from the Azure portal (Flask).

Etapa 2: acrescente alguns restaurantes à lista. Parabéns, você está executando um aplicativo Web no Serviço de Aplicativo do Azure, com a conectividade segura do Banco de Dados do Azure para PostgreSQL.

A screenshot of the Flask web app with PostgreSQL running in Azure showing restaurants and restaurant reviews (Flask).

6. Logs de diagnóstico de fluxo

O Serviço de Aplicativo do Azure captura todas as mensagens geradas no console para ajudar você a diagnosticar problemas com seu aplicativo. O aplicativo de exemplo inclui instruções print() para demonstrar esse recurso, conforme mostrado abaixo.

@app.route('/', methods=['GET'])
def index():
    print('Request for index page received')
    restaurants = Restaurant.query.all()
    return render_template('index.html', restaurants=restaurants)

Etapa 1: na página Serviço de Aplicativo:

  1. No menu à esquerda, selecione Logs do Serviço de Aplicativo.
  2. Em Log do aplicativo, selecione Sistema de arquivos.
  3. No menu superior, selecione Salvar.

A screenshot showing how to enable native logs in App Service in the Azure portal.

Etapa 2: no menu esquerdo, selecione Fluxo de log. Você verá os logs do seu aplicativo, incluindo os logs de plataforma e os logs de dentro do contêiner.

A screenshot showing how to view the log stream in the Azure portal.

Saiba mais sobre como fazer logon em aplicativos Python na série configurando o Azure Monitor para seu aplicativo Python .

7. Limpar os recursos

Quando tiver terminado, você poderá excluir todos os recursos de sua assinatura do Azure ao excluir o grupo de recursos.

Etapa 1: na barra de pesquisa, na parte superior do portal do Azure:

  1. Insira o nome do grupo de recursos.
  2. Selecione o grupo de recursos.

A screenshot showing how to search for and navigate to a resource group in the Azure portal.

Etapa 2: na página Grupo de recursos, selecione Excluir grupo de recursos.

A screenshot showing the location of the Delete Resource Group button in the Azure portal.

Etapa 3:

  1. Insira o nome do grupo de recursos para confirmar a exclusão.
  2. Selecione Excluir.

A screenshot of the confirmation dialog for deleting a resource group in the Azure portal. :

1. Criar recursos do Azure e implantar um aplicativo de amostra

Nesta etapa, você criará os recursos do Azure e implantará um aplicativo de amostra no Serviço de Aplicativo no Linux. As etapas usadas neste tutorial criam um conjunto de recursos seguros por padrão que incluem o Serviço de Aplicativo e o Banco de Dados do Azure para PostgreSQL.

  1. Caso ainda não tenha feito isso, clone o branch de starter-no-infra do repositório de amostra em um terminal local.

    git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app
    cd msdocs-flask-postgresql-sample-app
    

    Esse branch clonado é o ponto de partida. Ele contém um aplicativo Flask de unidade de dados simples.

  2. Na raiz do repositório, execute azd init.

    azd init --template python-app-service-postgresql-infra
    
  3. Quando solicitado, dê as seguintes respostas:

    Pergunta Resposta
    O diretório atual não está vazio. Deseja inicializar um projeto aqui em “<seu diretório>”? S
    O que você gostaria de fazer com esses arquivos? Manter meus arquivos existentes inalterados
    Insira um novo nome do ambiente Digite um nome exclusivo. O modelo do AZD usa esse nome como parte do nome DNS do seu aplicativo Web no Azure (<app-name>.azurewebsites.net). São permitidos caracteres alfanuméricos e hífens.
  4. Execute o comando azd up para provisionar os recursos necessários do Azure e implantar o código do aplicativo. Caso ainda não esteja conectado ao Azure, o navegador será iniciado e solicitará que você entre. O comando azd up também solicitará que você selecione a assinatura e o local desejados para implantar.

    azd up
    

    O comando azd up pode levar alguns minutos para ser concluído. Ele também compila e implanta o código do aplicativo, mas você modificará seu código posteriormente para trabalhar com o Serviço de Aplicativo. Durante a execução, o comando fornece mensagens sobre o processo de provisionamento e implantação, incluindo um link para a implantação no Azure. Quando ele é concluído, o comando também exibe um link para o aplicativo de implantação.

    Esse modelo do azd contém arquivos (azure.yaml e o diretório infra) que geram uma arquitetura segura por padrão com os seguintes recursos do Azure:

    • Grupo de recursos → o contêiner para todos os recursos criados.
    • Plano do Serviço de Aplicativo → define os recursos de computação para o Serviço de Aplicativo. É especificado um plano do Linux na camada B1.
    • Serviço de Aplicativo → Representa seu aplicativo e é executado no plano de Serviço de Aplicativo.
    • Rede virtual → Integrada ao aplicativo do Serviço de Aplicativo e isola o tráfego de rede de back-end.
    • Servidor flexível do Banco de Dados do Azure para PostgreSQL → Acessível somente da rede virtual. Um banco de dados e um usuário são criados para você no servidor.
    • Zona DNS privada → Habilita a resolução de DNS do servidor PostgreSQL na rede virtual.
    • O workspace do Log Analytics → Atua como o contêiner de destino para seu aplicativo enviar seus logs, em que também poderá consultar os logs.

2. Usar a cadeia de conexão de banco de dados

O modelo do AZD que você usa já gerou as variáveis de conectividade como configurações de aplicativo e as envia para o terminal para sua conveniência. As configurações do aplicativo são uma maneira de manter os segredos de conexão fora do seu repositório de códigos.

  1. Na saída do azd, localize as configurações do aplicativo e localize as configurações AZURE_POSTGRESQL_CONNECTIONSTRING e AZURE_REDIS_CONNECTIONSTRING. Para manter os segredos seguros, somente os nomes de configuração são exibidos. Eles ficam assim na saída do AZD:

     App Service app has the following settings:
    
             - AZURE_POSTGRESQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
             - FLASK_DEBUG
             - SCM_DO_BUILD_DURING_DEPLOYMENT
             - SECRET_KEY
     
  2. AZURE_POSTGRESQL_CONNECTIONSTRING contém a cadeia de conexão com o banco de dados do Postgres no Azure e AZURE_REDIS_CONNECTIONSTRING contém a cadeia de conexão no cache Redis no Azure. Você precisa usá-los no código para se conectar a ele. Abra azureproject/production.py, remova marca de comentário das seguintes linhas e salve o arquivo:

    conn_str = os.environ['AZURE_POSTGRESQL_CONNECTIONSTRING']
    conn_str_params = {pair.split('=')[0]: pair.split('=')[1] for pair in conn_str.split(' ')}
    DATABASE_URI = 'postgresql+psycopg2://{dbuser}:{dbpass}@{dbhost}/{dbname}'.format(
        dbuser=conn_str_params['user'],
        dbpass=conn_str_params['password'],
        dbhost=conn_str_params['host'],
        dbname=conn_str_params['dbname']
    )
    

    O código do aplicativo agora está configurado para se conectar ao banco de dados do PostgreSQL no Azure. Se desejar, abra app.py e veja como a variável de ambiente DATABASE_URI é usada.

  3. No terminal, execute azd deploy.

    azd deploy
    

4. Gerar esquema de banco de dados

Com o banco de dados PostgreSQL protegido pela rede virtual, a maneira mais fácil de executar as migrações de banco de dados Flask é em uma sessão de SSH com o contêiner do Serviço de Aplicativo.

  1. Na saída do AZD, localize o URL da sessão SSH e navegue até ele no navegador. Fica assim na saída:

     Open SSH session to App Service container at: https://<app-name>.scm.azurewebsites.net/webssh/host
     
  2. No terminal SSH, execute flask db upgrade. Se ele for bem-sucedido, o Serviço de Aplicativo está se conectando com êxito ao banco de dados.

    A screenshot showing the commands to run in the SSH shell and their output (Flask).

    Observação

    Somente as alterações nos arquivos /home podem persistir além das reinicializações do aplicativo. As alterações feitas fora de /home não são persistentes.

5. Navegar até o aplicativo

  1. Na saída do AZD, localize o URL do seu aplicativo e navegue até ele no navegador. O URL fica assim na saída do AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>.azurewebsites.net/
     
  2. Acrescente alguns restaurantes à lista.

    Parabéns, você está executando um aplicativo Web no Serviço de Aplicativo do Azure, com a conectividade segura do Banco de Dados do Azure para PostgreSQL.

6. Logs de diagnóstico de fluxo

O Serviço de Aplicativo do Azure pode capturar logs de console para ajudá-lo a diagnosticar problemas com o aplicativo. Por conveniência, o modelo do AZD já habilitou o registro em log ao sistema de arquivos local, bem como enviá-los para um workspace do Log Analytics.

O aplicativo de amostra inclui instruções print() para demonstrar esse recurso, conforme mostrado no trecho a seguir.

@app.route('/', methods=['GET'])
def index():
    print('Request for index page received')
    restaurants = Restaurant.query.all()
    return render_template('index.html', restaurants=restaurants)

Na saída do AZD, localize o link para transmitir logs do Serviço de Aplicativo e navegue até ele no navegador. O link fica assim na saída do AZD:

Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream

Saiba mais sobre como fazer logon em aplicativos Python na série configurando o Azure Monitor para seu aplicativo Python .

7. Limpar os recursos

Para excluir todos os recursos do Azure no ambiente de implantação atual, execute azd down.

azd down

Solução de problemas

Listados abaixo estão os problemas que poderá encontrar ao tentar trabalhar com esse tutorial e as etapas para resolvê-los.

Não consigo me conectar à sessão SSH

Se você não pode se conectar à sessão SSH, isso indica que não foi possível iniciar o aplicativo. Confira os logs de diagnóstico para obter detalhes. Por exemplo, se você vir um erro como KeyError: 'AZURE_POSTGRESQL_CONNECTIONSTRING', poderá significar que a variável de ambiente está ausente (você pode ter removido a configuração do aplicativo).

Obtenho um erro ao executar migrações de banco de dados

Se você encontrar algum erro relacionado à conexão com o banco de dados, verifique se as configurações do aplicativo (AZURE_POSTGRESQL_CONNECTIONSTRING) foram alteradas. Sem essa cadeia de conexão, o comando migrar não pode se comunicar com o banco de dados.

Perguntas frequentes

Quanto custa essa configuração?

O preço dos recursos criados são os seguintes:

Como se conectar ao servidor PostgreSQL que está protegido por trás da rede virtual com outras ferramentas?

  • Para acesso básico de uma ferramenta de linha comando, você pode executar psql no terminal SSH do aplicativo.
  • Para se conectar a partir de uma ferramenta de área de trabalho, seu computador precisa estar dentro da rede virtual. Por exemplo, pode ser uma VM do Azure conectada a uma das sub-redes ou um computador em uma rede local que tenha uma conexão VPN site a site com a rede virtual do Azure.
  • Você também pode integrar o Azure Cloud Shell à rede virtual.

Como o desenvolvimento de aplicativos local funciona com o GitHub Actions?

Usando como exemplo o arquivo de fluxo de trabalho gerado automaticamente do Serviço de Aplicativo, cada git push inicia uma nova compilação e execução de implantação. A partir de um clone local do repositório do GitHub, você faz as atualizações desejadas e efetua push para o GitHub. Por exemplo:

git add .
git commit -m "<some-message>"
git push origin main

De que modo o exemplo do Django está configurado para ser executado no Serviço de Aplicativo do Azure?

Observação

Se você estiver acompanhando este tutorial com seu aplicativo, examine a descrição do arquivo requirements.txt no arquivo README.md de cada projeto (Flask, Django) para ver quais pacotes você precisará.

O aplicativo de exemplo do Django define as configurações no arquivo azureproject/production.py para que ele possa ser executado no Serviço de Aplicativo do Azure. Essas alterações são comuns à implantação do Django na produção e não são específicas para o Serviço de Aplicativo.

  • O Django valida o cabeçalho HTTP_HOST em solicitações de entrada. O código de exemplo usa a variável de ambiente WEBSITE_HOSTNAME no Serviço de Aplicativo para adicionar o nome de domínio do aplicativo à configuração ALLOWED_HOSTS do Django.

    # Configure the domain name using the environment variable
    # that Azure automatically creates for us.
    ALLOWED_HOSTS = [os.environ['WEBSITE_HOSTNAME']] if 'WEBSITE_HOSTNAME' in os.environ else []
    
  • O Django não dá suporte à disponibilização de arquivos estáticos em produção. Para este tutorial, você usa o WhiteNoise para habilitar o fornecimento dos arquivos. O pacote WhiteNoise já foi instalado com requirements.txt e o middleware dele é adicionado à lista.

    
    # WhiteNoise configuration
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        # Add whitenoise middleware after the security middleware
        'whitenoise.middleware.WhiteNoiseMiddleware',
    

    Em seguida, as configurações de arquivo estático são configuradas de acordo com a documentação do Django.

    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    

Para obter mais informações, confira as Configurações de produção para aplicativos Django.

Próximas etapas

Avance para o próximo tutorial para saber como proteger seu aplicativo com um domínio e um certificado personalizados.

Saiba como o Serviço de Aplicativo executa um aplicativo Python: