Tutorial: Usar o Conector de Serviço para criar um aplicativo Django com Postgres no Serviço de Aplicativo do Azure

Observação

Neste tutorial, você usará o Conector de Serviço para conectar um aplicativo Web a um serviço de banco de dados. Este tutorial é uma modificação do tutorial do Serviço de Aplicativo, portanto, você pode ver algumas semelhanças. Confira a seção Criar um conector sem senha para o banco de dados Postgres para ver onde o Conector de Serviço entra em cena e simplifica o processo de conexão descrito no tutorial do Serviço de Aplicativo.

Este tutorial mostra como implantar um aplicativo Web Python Django controlado por dados no Serviço de Aplicativo do Azure e conectá-lo a um Servidor Flexível de Banco de Dados do Azure para PostgreSQL.

Neste tutorial, você usa a CLI do Azure para concluir as seguintes tarefas:

  • Configurar o ambiente inicial com Python e a CLI do Azure
  • Criar um Servidor Flexível de Banco de Dados do Azure para PostgreSQL
  • Implantar um código no Serviço de Aplicativo do Azure e conectar-se ao Servidor Flexível do PostgreSQL
  • Atualizar seu código e reimplantar
  • Exibir logs de diagnóstico
  • Gerenciar o aplicativo Web no portal do Azure

Configurar o seu ambiente inicial

Inicie a partir do Azure Cloud Shell no portal do Azure e instale a extensão sem senha do conector de serviço para a CLI do Azure.

az extension add --name serviceconnector-passwordless --upgrade

Clonar ou baixar o aplicativo de exemplo

Clone o repositório de exemplo:

git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git

Navegue até a seguinte pasta:

cd serviceconnector-webapp-postgresql-django-passwordless

Neste tutorial, você implantará um aplicativo Web Django para o Serviço de Aplicativo do Azure. O aplicativo Web usa uma identidade gerenciada atribuída pelo sistema (conexões sem senha) com controle de acesso baseado em função do Azure para acessar recursos do Armazenamento do Microsoft Azure e do Banco de Dados do Azure para PostgreSQL – Servidor Flexível. O código usa a classe DefaultAzureCredential da biblioteca de clientes de Identidade do Azure para Python. A classe DefaultAzureCredential detecta automaticamente que uma identidade gerenciada existe para o Serviço de Aplicativo e a usa para acessar outros recursos do Azure.

  • As configurações de produção estão no arquivo azuresite/production.py. Encontre as configurações de desenvolvimento em azuresite/settings.py.
  • O aplicativo usa as configurações de produção quando a variável de ambiente WEBSITE_HOSTNAME é definida. O Serviço de Aplicativo do Azure define automaticamente essa variável como a URL do aplicativo Web, como msdocs-django.azurewebsites.net.

Essas configurações de produção são específicas para configurar o Django para execução em qualquer ambiente de produção e não são específicas do Serviço de Aplicativo. Para saber mais, confira a Lista de verificação de implantação do Django. Confira também Configurações de produção para o Django no Azure para obter detalhes sobre algumas das alterações.

Está com problemas? Fale conosco.

Criar um banco de dados Postgres no Azure

  1. Configurar as variáveis de ambiente necessárias para o tutorial.

    LOCATION="eastus"
    RAND_ID=$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    ADMIN_USER="demoadmin"
    ADMIN_PW="{your database password}"
    

    Importante

    ADMIN_PW deve conter de 8 a 128 caracteres das três categorias a seguir, letras maiúsculas, letras minúsculas, números e caracteres não alfanuméricos. Ao criar nomes de um ou senhas, não use o $ caractere. Posteriormente, você vai criar variáveis de ambiente com esses valores no qual o caractere $ tem um significado específico no contêiner do Linux usado para executar aplicativos Python.

  2. Crie um grupo de recursos (você pode alterar o nome, se desejado). O nome do grupo de recursos é armazenado em cache e aplicado automaticamente aos comandos subsequentes.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    
  3. Criar o servidor do banco de dados. Se solicitado a habilitar o acesso ao endereço IP do cliente atual, digite y para sim. Esse processo leva alguns minutos:

    az postgres flexible-server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $DB_SERVER_NAME \
      --location $LOCATION \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --sku-name Standard_D2ds_v4
      --active-directory-auth Enabled
    

    Se o comando az não for reconhecido, verifique se você tem a CLI do Azure instalada, conforme descrito em Configurar seu ambiente inicial.

    O comando az postgres flexible-server create executa as seguintes ações, que levam alguns minutos:

    • Crie um grupo de recursos padrão, caso ainda não haja um nome armazenado em cache.
    • Crie um Servidor Flexível do PostgreSQL:
      • Com o nome do servidor especificado com o parâmetro --name. O nome precisa ser exclusivo em todo o Azure.
      • Com a SKU especificada com o parâmetro --sku-name.
    • Crie uma conta de administrador com um nome de usuário e uma senha especificados com os parâmetros --admin-user e --admin-password.
    • Crie um banco de dados cujo nome seja especificado com o parâmetro --database-name.
  4. Configure uma regra de firewall no servidor usando o comando az postgres flexible-server firewall-rule create. Essa regra permite que seu ambiente local acesse o servidor. (Se for solicitado que você habilite o acesso a partir do endereço IP do cliente na etapa anterior, ignore esta etapa.)

    IP_ADDRESS=<your IP>
    az postgres flexible-server firewall-rule create \
       --resource-group $RESOURCE_GROUP_NAME \
       --name $DB_SERVER_NAME \
       --rule-name AllowMyIP \
       --start-ip-address $IP_ADDRESS \
       --end-ip-address $IP_ADDRESS
    

    Use qualquer ferramenta ou site que mostre seu endereço IP para substituir <your IP> no comando. Por exemplo, você pode usar o site What's my IP Address?.

  5. Crie um banco de dados chamados restaurant usando o comando az postgres flexible-server execute.

    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --database-name postgres \
      --querytext 'create database restaurant;'
    

Implantar o código no Serviço de Aplicativo do Azure

Nesta seção, você criará o host do aplicativo do Serviço de Aplicativo, conectará esse aplicativo ao banco de dados Postgres e implantará o código nesse host.

Criar o aplicativo do Serviço de Aplicativo

  1. No terminal, verifique se você está na pasta do repositório serviceconnector-webapp-postgresql-django-passwordless que contém o código do aplicativo.

  2. Execute o seguinte comando az webapp up para criar o host do Serviço de Aplicativo para o aplicativo:

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --name $APP_SERVICE_NAME \
      --runtime PYTHON:3.9 \
      --sku B1
    

    A SKU define o tamanho (CPU, memória) e custo do plano do Serviço de Aplicativo. O plano de serviço B1 (Básico) gera um pequeno custo em sua assinatura do Azure. Para obter uma lista completa dos planos do Serviço de Aplicativo, exiba a página de Preço do Serviço de Aplicativo.

    Esse comando executa as seguintes ações, que podem levar alguns minutos, usando o grupo de recursos e o local armazenado em cache do comando az group create anterior (o grupo $RESOURCE_GROUP_NAME na região eastus neste exemplo).

    • Crie um plano do Serviço de Aplicativo no tipo de preço Básico (B1). Você pode omitir --sku o uso de valores padrão.
    • Crie o aplicativo do Serviço de Aplicativo.
    • Habilite o registro em log padrão para o aplicativo.
    • Carregar o repositório usando a implantação ZIP com a automação do build habilitada.
  3. Configure o Serviço de Aplicativo para usar start.sh no repositório com o comando az webapp config set.

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

Criar um conector sem senha para o banco de dados Postgres

Com o código implantado no Serviço de Aplicativo, a próxima etapa é conectar o aplicativo ao banco de dados Postgres no Azure. O código do aplicativo espera encontrar informações de banco de dados em uma variável de ambiente chamada AZURE_POSTGRESQL_CONNECTIONSTRING para o servidor flexível PostgresSQL e uma variável de ambiente chamada AZURE_STORAGEBLOB_RESOURCEENDPOINT para a conta de Armazenamento do Microsoft Azure.

Os comandos do Conector de Serviço configuram os recursos do Armazenamento do Microsoft Azure e do Banco de Dados do Azure para PostgreSQL para usar a identidade gerenciada e o controle de acesso baseado em função do Azure. Os comandos criam configurações de aplicativo no Serviço de Aplicativo que conectam seu aplicativo Web a esses recursos. A saída dos comandos lista as ações do conector de serviço executadas para habilitar a funcionalidade sem senha.

  1. Adicione uma conector de serviço PostgreSQL com o comando az webapp connection create postgres-flexible. A identidade gerenciada atribuída pelo sistema é usada para autenticar o aplicativo Web no recurso de destino, PostgreSQL, nesse caso.
    az webapp connection create postgres-flexible \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP_NAME \
      --server $DB_SERVER_NAME \
      --database restaurant \
      --client-type python \
      --system-identity
    

Observação

Caso veja a mensagem de erro “A assinatura não está registrada para usar o Microsoft.ServiceLinker”, execute az provider register -n Microsoft.ServiceLinker para registrar o provedor de recursos do Conector de Serviço e execute o comando de conexão novamente.

Em seu código Python, você acessa essas configurações como variáveis de ambiente com instruções como os.environ.get('AZURE_POSTGRESQL_HOST'). Para saber mais, confira Acessar variáveis do ambiente.

Está com problemas? Confira primeiro o Guia de solução de problemas. Caso contrário, fale conosco.

Criar uma conta de armazenamento e se conectar a ela

  1. Use o comando az webapp connection create storage-blob para criar uma conta de armazenamento e um conector de serviço que faça as seguintes configurações:
  • Habilita a identidade gerenciada atribuída pelo sistema no aplicativo Web

  • Adiciona o aplicativo Web com a função Colaborador de dados de blob de armazenamento à conta de armazenamento recém-criada.

  • Configure a rede da conta de armazenamento para aceitar o acesso do aplicativo Web.

    STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \
      --new true \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP_NAME \
      --client-type python \
      --system-identity \
      --query configurations[].value \
      --output tsv)
    STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))
    
  1. Atualize a conta de armazenamento para permitir o acesso público de blob para usuários do aplicativo de restaurante acessarem imagens.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  2. Crie um contêiner chamado photos na conta de armazenamento com o comando az storage container create. Permitir o acesso de leitura anônimo (público) a blobs no contêiner recém-criado.

    # Set the BLOB_ENDPOINT variable
    BLOB_ENDPOINT=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "primaryEndpoints.blob" | sed 's/"//g')
    echo $BLOB_ENDPOINT
    
    # Create the storage container using the BLOB_ENDPOINT variable
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

Testar o aplicativo Web do Python no Azure

O aplicativo Python de exemplo usa o pacote azure.identity e sua classe DefaultAzureCredential. Quando o aplicativo está em execução no Azure, DefaultAzureCredential detecta automaticamente se uma identidade gerenciada existe para o Serviço de Aplicativo e, caso exista, usa-a para acessar outros recursos do Azure (armazenamento e PostgreSQL nesse caso). Não é necessário fornecer chaves de armazenamento, certificados ou credenciais ao Serviço de Aplicativo para acessar esses recursos.

  1. Navegue até o aplicativo implantado no URL http://$APP_SERVICE_NAME.azurewebsites.net.

    Pode levar um minuto ou dois para que o aplicativo seja iniciado. Se você vir uma página do aplicativo padrão que não seja a página do aplicativo de exemplo padrão, aguarde um minuto e atualize o navegador.

  2. Teste a funcionalidade do aplicativo de exemplo adicionando um restaurante e algumas avaliações com fotos do restaurante. As informações do restaurante e avaliações são armazenadas no Banco de Dados do Azure para PostgreSQL e as fotos são armazenadas no Armazenamento do Microsoft Azure. Aqui está uma captura de tela de exemplo:

    Captura de tela do aplicativo de exemplo mostrando a funcionalidade de avaliação de restaurante usando o Serviço de Aplicativo do Azure, o Banco de Dados do Azure para PostgreSQL e o Armazenamento do Microsoft Azure.

Limpar os recursos

Se quiser manter o aplicativo ou prosseguir para mais tutoriais, vá para Próximas etapas. Caso contrário, para evitar incorrer em cobranças contínuas, exclua o grupo de recursos criado para este tutorial:

az group delete --name $RESOURCE_GROUP_NAME --no-wait

Ao excluir o grupo de recursos, você também desaloca e exclui todos os recursos contidos nele. Antes de usar o comando, verifique se os recursos contidos no grupo não serão mais necessários.

A exclusão de todos os recursos pode levar algum tempo. O argumento --no-wait permite que o comando seja retornado imediatamente.

Está com problemas? Fale conosco.

Próxima etapa