Partilhar via


Tutorial: Ligue uma aplicação web Django ao Azure PostgreSQL usando o Service Connector

Neste tutorial, aprende a implementar uma aplicação web Python orientada por dados para o Serviço de Aplicações do Azure e usar o Service Service para a ligar a outros serviços Azure. A aplicação web de exemplo armazena informações de restaurantes e avaliações numa base de dados Base de Dados do Azure para PostgreSQL e armazena fotografias num contentor Armazenamento do Azure.

Utiliza o CLI do Azure para completar as seguintes tarefas:

Nota

Este tutorial é semelhante ao tutorial do App Service Deploy uma aplicação web Python Django com PostgreSQL no Azure, mas utiliza uma identidade gerida sem palavra-passe atribuída pelo sistema com controlo de acesso baseado em função do Azure para aceder a outros recursos do Azure. A secção Criar uma ligação de serviço sem palavra-passe deste artigo mostra como o Service Connector simplifica o processo de ligação.

A aplicação web utiliza a classe DefaultAzureCredential da biblioteca cliente Python Azure Identity para detetar automaticamente quando existe uma identidade gerida e utilizá-la para aceder aos outros recursos.

Pré-requisitos

  • Uma subscrição Azure com permissões de escrita e atribuição de funções para os recursos do tutorial, numa região Azure que suporta Service Connector e tenha suporte suficiente para App Service e quota.

  • Azure Cloud Shell para executar os passos do tutorial, ou se preferires correr localmente:

    1. Instale CLI do Azure 2.30.0 ou superior. Para verificar a sua versão, execute az --version. Para atualizar, execute az upgrade.
    2. Inicie sessão no Azure usando az login e seguindo as indicações.

Configurar o ambiente

  1. Certifique-se de que a sua subscrição está registada para usar os fornecedores de recursos Microsoft.ServiceLinker e Microsoft.DBforPostgreSQL. Se não, execute az provider register -n Microsoft.[name of service] para registar os fornecedores.

  2. Instale as seguintes extensões CLI do Azure:

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

Clonar a aplicação de exemplo

  1. Clona o repositório da app de exemplo.

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

    Em alternativa, podes descarregar a aplicação a partir de https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless e descompactá-la numa pasta chamada serviceconnector-webapp-postgresql-django-passwordless.

  2. Muda diretórios para a pasta repositório usando cd serviceconnector-webapp-postgresql-django-passwordless e executa todos os comandos restantes dessa pasta.

Na aplicação de exemplo, as definições de produção da aplicação web estão no ficheiro azuresite/production.py . As definições de desenvolvimento são em Azuresite/settings.py. As definições de produção configuram o Django para correr em qualquer ambiente de produção e não são específicas do App Service.

A aplicação utiliza definições de produção quando a WEBSITE_HOSTNAME variável de ambiente está definida. Para cadeias de ligação do Azure Postgres, o Azure App Service define automaticamente esta variável para o URL da aplicação web, como https://msdocs-django.azurewebsites.net.

Para mais informações, consulte a lista de verificação de implementação do Django. Veja também Definições de produção para Django em Azure.

Definir variáveis iniciais do ambiente

O código seguinte define as variáveis de ambiente necessárias para este tutorial.

  • LOCATION deve ser uma região do Azure onde a sua subscrição tenha quota suficiente para criar os recursos e não restringe o Azure Database para PostgreSQL para a sua subscrição.
  • Devem ADMIN_PW conter entre 8 a 128 caracteres em pelo menos três das quatro categorias: letras maiúsculas, minúsculas, numerais e caracteres não alfanuméricos, excluindo $.
  1. Configure as seguintes variáveis de ambiente, substituindo os espaços reservados <region> e <database password> por valores válidos.

    LOCATION="<region>"
    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="<database password>"
    
  2. Crie um grupo de recursos para conter todos os recursos do projeto. O nome do grupo de recursos é armazenado em cache e aplicado automaticamente aos comandos subsequentes.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

Implementar o código da aplicação no App Service

Crie o host da app no App Service e implemente o código de exemplo da app nesse host. O az webapp up comando executa as seguintes ações:

  • Cria um plano de Serviço de Aplicações no escalão de preços Básico (B1).
  • Cria a aplicação App Service.
  • Ativa o registo de logs predefinido da aplicação.
  • Carrega o repositório usando implantação em ZIP com automação de compilações ativada.
  • Constrói a aplicação.

No código, sku define a CPU, a memória e o custo do plano de App Service. O plano de serviço Básico (B1) implica um pequeno custo na sua subscrição do Azure. Podes omitir o --sku parâmetro para usar o SKU predefinido, normalmente P1v3 (Premium v3). Para uma lista completa de planos de App Service, consulte preços do App Service.

  1. A partir da pasta do repositório serviceconnector-webapp-postgresql-django-passwordless , execute o seguinte az webapp up comando:

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

    Nota

    A implantação demora alguns minutos, e o comando pode travar ou expirar, especialmente num SKU Básico. Quando a aplicação for construída com sucesso e a saída mostrar Starting the site, podes sair do comando selecionando Ctrl+C.

  2. Configure a aplicação para usar o ficheiro start.sh do repositório executando o comando az webapp config set.

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

Crie a base de dados Postgres no Azure

Crie a base de dados Base de Dados do Azure para PostgreSQL para armazenar informação de aplicações. O comando az postgres flexible-server create cria um servidor flexível do Azure Database para PostgreSQL no grupo de recursos especificado que possui:

  • Nome do servidor especificado no --name parâmetro. O nome tem de ser único em toda a Azure.
  • SKU especificado no --sku-name parâmetro.
  • Conta de administrador, nome de utilizador e palavra-passe especificados nos parâmetros --admin-user e --admin-password.
  1. Crie o servidor de base de dados do Azure para PostgreSQL. Se for solicitado para ativar o acesso ao endereço IP atual do cliente, introduza y como sim.

    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 \
      --microsoft-entra-auth Enabled
    
  2. Se não for solicitado a permitir o acesso ao endereço IP do seu cliente atual, configure uma regra de firewall no seu servidor com o comando az postgres flexible-server firewall-rule create. Esta regra permite que seu ambiente local acesse o servidor.

    IP_ADDRESS=<your IP address>
    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
    

    Sugestão

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

  3. Crie uma base de dados nomeada restaurant no servidor 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;'
    

Criar uma ligação de serviço sem palavra-passe

Use az webapp connection create postgres-flexible para adicionar um conector de serviço que liga a aplicação web Azure à base de dados Postgres usando autenticação de identidade gerida sem palavra-passe. O comando seguinte configura o Base de Dados do Azure para PostgreSQL para usar identidade gerida e controlo de acesso baseado em funções no Azure. A saída do comando lista as ações que o Service Connector realiza.

O comando cria uma variável de ambiente chamada AZURE_POSTGRESQL_CONNECTIONSTRING que fornece a informação de ligação à base de dados para a aplicação. O código da aplicação acede a variáveis do ambiente da aplicação com instruções como os.environ.get('AZURE_POSTGRESQL_HOST'). Para obter mais informações, consulte Variáveis de ambiente do Access.

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

Crie e ligue-se a uma conta de armazenamento

Use az webapp connection create storage-blob para criar uma conta de armazenamento do Azure e um conector de serviço. O comando realiza as seguintes ações:

  • Ativa a identidade gerida atribuída ao sistema na aplicação web.
  • Adiciona a aplicação web com a função Storage Blob Data Contributor à nova conta de armazenamento.
  • Configura a rede de contas de armazenamento para aceitar acesso a partir da aplicação web.
  • Cria uma variável de ambiente chamada AZURE_STORAGEBLOB_RESOURCEENDPOINT para a conta Armazenamento do Azure.
  1. Execute o seguinte comando para criar a conta de armazenamento e a ligação:

    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))
    
  2. Atualize a conta de armazenamento para permitir o acesso público do blob aos utilizadores da aplicação para aceder às fotos.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  3. Use az storage container create para criar um container chamado photos na conta de armazenamento e permitir o acesso público anónimo de leitura a blobs no novo container.

    # 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
    

Teste a aplicação web em Python no Azure

Abra e teste a aplicação web Azure Restaurant Review. A aplicação utiliza o pacote azure.identity e a sua DefaultAzureCredential classe. Quando a aplicação está a correr em Azure, o DefaultAzureCredential deteta automaticamente quando existe uma identidade gerida para o Serviço de Aplicação e usa-a para aceder aos recursos Armazenamento do Azure e Base de Dados do Azure para PostgreSQL. A aplicação não precisa de fornecer chaves de armazenamento, certificados ou credenciais para aceder a estes recursos.

  • Para uma instalação CLI do Azure local, podes usar az webapp browse para abrir a aplicação no teu navegador predefinido:

    az webapp browse --name $APP_SERVICE_NAME.azurewebsites.net --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell não consegue abrir um navegador local, por isso não suporta o comando az webapp browse. A partir de Cloud Shell, a forma mais fácil de abrir a aplicação web é selecionar o link Domínio Padrão no canto superior direito na página do portal Azure da app.

Pode levar um ou dois minutos para o aplicativo iniciar. Se vires uma página de aplicação padrão que não seja a aplicação de exemplo, aguarda um minuto e atualiza o navegador.

Testa a funcionalidade da aplicação de exemplo adicionando um restaurante e algumas avaliações com fotos. A aplicação deve assemelhar-se à seguinte captura de ecrã:

Captura de ecrã da aplicação de exemplo mostrando funcionalidades de avaliações de restaurantes usando App Service, Base de Dados do Azure para PostgreSQL e Armazenamento do Azure.

Limpar recursos

Para evitar cobranças contínuas, pode eliminar os recursos que criou para este tutorial eliminando o grupo de recursos que os contém. Certifica-te de que já não precisas da aplicação nem dos recursos antes de executares o comando.

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

Excluir todos os recursos pode levar algum tempo. O --no-wait argumento permite que o comando volte imediatamente.

Troubleshooting

Se tiveres dificuldades a correr este tutorial, consulta os seguintes recursos: