Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Neste tutorial, você implantará o código Python Flask para criar e implantar um aplicativo Web que está sendo executado no Serviço de Aplicativo do Azure. O aplicativo web usa sua identidade gerenciada atribuída pelo sistema (conexões sem senha) com controle de acesso baseado em funções do Azure para acessar os recursos Armazenamento do Azure e Banco de Dados do Azure para PostgreSQL – Servidor Flexível. O código usa a classe DefaultAzureCredential da biblioteca de clientes Azure Identity para Python. A classe DefaultAzureCredential detecta automaticamente que existe uma identidade gerenciada para o Serviço de Aplicativos e a utiliza para acessar outros recursos do Azure.
Você pode configurar conexões sem senha com os serviços do Azure usando o Conector de Serviço ou configurá-las manualmente. Este tutorial mostra como usar o Conector de Serviço. Para obter mais informações sobre conexões sem senha, consulte Conexões sem senha para serviços do Azure. Para obter informações sobre o Service Connector, consulte a documentação do Service Connector.
Este tutorial demonstra como criar e implantar um aplicativo Web Python usando a CLI do Azure. Execute os comandos neste tutorial em qualquer ambiente bash com a CLI do Azure instalada, como seu ambiente local ou o Azure Cloud Shell.
Para obter exemplos de como usar uma identidade gerenciada atribuída pelo usuário, consulte Criar e implantar um aplicativo Web do Django no Azure com uma identidade gerenciada atribuída pelo usuário.
Obter o aplicativo de exemplo
Um aplicativo Python de exemplo usando a estrutura Flask está disponível para ajudar você a acompanhar este tutorial. Baixe ou clone o aplicativo de exemplo em sua estação de trabalho local.
Clone o exemplo em uma sessão do Azure Cloud Shell.
git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.gitNavegue até a pasta do aplicativo.
cd msdocs-flask-web-app-managed-identity
Examinar o código de autenticação
O aplicativo Web de exemplo precisa ser autenticado em dois armazenamentos de dados diferentes:
- Servidor de armazenamento de blobs do Azure onde ele armazena e recupera fotos enviadas por revisores.
- Um Banco de Dados do Azure para PostgreSQL – Servidor Flexível onde ele armazena restaurantes e avaliações.
Ele usa DefaultAzureCredential para autenticar em ambos os armazenamentos de dados. Com o DefaultAzureCredential, o aplicativo pode ser configurado para ser executado sob a identidade de diferentes entidades de serviço, dependendo do ambiente em que está sendo executado, sem fazer alterações no código. Por exemplo, em um ambiente de desenvolvimento local, o aplicativo pode ser executado sob a identidade do desenvolvedor conectado à CLI do Azure, enquanto no Azure, como neste tutorial, ele pode ser executado sob uma identidade gerenciada atribuída pelo sistema.
Em ambos os casos, a entidade de segurança sob a qual o aplicativo é executado deve ter uma função em cada recurso do Azure que o aplicativo usa que permita executar as ações no recurso que o aplicativo exige. Neste tutorial, você vai usar conectores de serviço para habilitar automaticamente a identidade gerenciada atribuída pelo sistema em seu aplicativo no Azure e atribuir a essa identidade funções apropriadas em sua conta de armazenamento do Azure e no servidor do Banco de Dados do Azure para PostgreSQL.
Depois que a identidade gerenciada atribuída pelo sistema for habilitada e receber as funções apropriadas nos armazenamentos de dados, você poderá usar DefaultAzureCredential para autenticar com os recursos necessários do Azure.
O código a seguir é usado para criar um cliente de armazenamento de blobs para carregar fotos no app.py. Uma instância de DefaultAzureCredential é fornecida ao cliente, que ele usa para adquirir tokens de acesso para executar operações no armazenamento do Azure.
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
azure_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url=account_url,
credential=azure_credential)
Uma instância de DefaultAzureCredential também é usada para obter um token de acesso para o Banco de Dados do Azure para PostgreSQL no ./azureproject/get_conn.py. Nesse caso, o token é adquirido diretamente chamando get_token na instância de credencial e transmitindo o valor apropriado de scope. O token é então utilizado no lugar da senha no URI de conexão PostgreSQL, que é retornado ao chamador.
azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conn = str(current_app.config.get('DATABASE_URI')).replace('PASSWORDORTOKEN', token.token)
Para saber mais sobre como autenticar seus aplicativos Python com serviços do Azure, consulte Autenticar aplicativos Python em serviços do Azure usando o SDK do Azure para Python. Para saber mais sobre DefaultAzureCredential, incluindo como personalizar a cadeia de credenciais que ele avalia para seu ambiente, consulte Visão geral do DefaultAzureCredential.
Criar um servidor do PostgreSQL do Azure
Configure 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="ChAnG33#ThsPssWD$RAND_ID"Importante
O
ADMIN_PWprecisa 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. Ao criar nomes de usuário ou senhas, não use o caractere$. Posteriormente, 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.Crie um grupo de recursos com o comando az group create.
az group create --location $LOCATION --name $RESOURCE_GROUP_NAMECrie um servidor PostgreSQL com o comando az postgres flexible-server create. (Este comando e os subsequentes usam o caractere de continuação de linha para o Shell Bash ('\'). Altere o caractere de continuação de linha do seu shell, se necessário.)
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_v4O sku-name é o nome da camada de preços e da configuração de computação. Para mais informações, consulte Preços do Banco de Dados do Azure para PostgreSQL. Para listar os SKUs disponíveis, use
az postgres flexible-server list-skus --location $LOCATION.Crie um banco de dados chamado
restaurantusando 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 um Serviço de Aplicativo do Azure e implantar o código
Crie um serviço de aplicativo usando o comando az webapp up.
az webapp up \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --runtime PYTHON:3.9 \ --sku B1O sku define o tamanho (CPU, memória) e o 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.
Configure o Serviço de Aplicativo para usar o 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 conectores sem senha para recursos do 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 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 o recurso sem senha.
Adicione um 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 neste 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-identityAdicione um conector de serviço de armazenamento com o comando az webapp connection create storage-blob.
Esse comando também adiciona uma conta de armazenamento e adiciona o aplicativo Web com a função Colaborador de Dados do Blob de Armazenamento à conta de armazenamento.
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))
Criar um contêiner na conta de armazenamento
O aplicativo Python de exemplo armazena fotos enviadas por revisores como blobs em um contêiner em sua conta de armazenamento.
Quando um usuário envia uma foto com a revisão, o aplicativo de exemplo grava a imagem no contêiner usando a identidade gerenciada atribuída pelo sistema para autenticação e autorização. Você configurou essa função na última seção.
Quando um usuário exibe as avaliações de um restaurante, o aplicativo retorna um link para a foto no armazenamento de blobs para cada avaliação que tenha uma associada a ela. Para que o navegador exiba a foto, ele deve conseguir acessá-la em sua conta de armazenamento. Os dados de blob devem estar disponíveis para leitura pública por meio de acesso anônimo (não autenticado).
Para aumentar a segurança, as contas de armazenamento são criadas com o acesso anônimo aos dados de blob desabilitados por padrão. Nesta seção, você vai habilitar o acesso de leitura anônimo em sua conta de armazenamento e, em seguida, criar um contêiner chamado photos que fornece acesso público (anônimo) aos blobs.
Atualize a conta de armazenamento para permitir acesso de leitura anônimo a blobs com o comando az storage account update.
az storage account update \ --name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --allow-blob-public-access trueHabilitar o acesso anônimo na conta de armazenamento não afeta o acesso para blobs individuais. Você deve habilitar explicitamente o acesso público a blobs no nível do contêiner.
Crie um contêiner chamado photos na conta de armazenamento com o comando az storage container create. Permita acesso de leitura anônima (público) aos blobs no contêiner recém-criado.
az storage container create \ --account-name $STORAGE_ACCOUNT_NAME \ --name photos \ --public-access blob \ --account-key $(az storage account keys list --account-name $STORAGE_ACCOUNT_NAME \ --query [0].value --output tsv)Observação
Para simplificar, este comando usa a chave da conta de armazenamento para autorizar o acesso à conta de armazenamento. Para a maioria dos cenários, a abordagem recomendada da Microsoft é usar a ID do Microsoft Entra e as funções de RBAC (controle de acesso baseado em função) do Azure. Para um conjunto rápido de instruções, consulte Início Rápido: criar, baixar e listar blobs com a CLI do Azure. Várias funções do Azure permitem que você crie contêineres em uma conta de armazenamento, incluindo Proprietário, Colaborador, Proprietário de Dados de Blob de Armazenamento e Colaborador de Dados de Blob de Armazenamento.
Para saber mais sobre o acesso de leitura anônimo a dados de blobs, consulte Configurar acesso de leitura anônimo para contêineres e blobs.
Testar o aplicativo Web Python no Azure
O aplicativo Python de exemplo usa o pacote azure.identity e sua classe correspondente. Quando o aplicativo está em execução no Azure, DefaultAzureCredential detecta automaticamente se existe uma identidade gerenciada para o App Service e, em caso afirmativo, a utiliza para acessar outros recursos do Azure (armazenamento e PostgreSQL neste caso). Não há necessidade de fornecer chaves de armazenamento, certificados ou credenciais para o Serviço de Aplicativo para acessar esses recursos.
Navegue até o aplicativo implantado no URL
http://$APP_SERVICE_NAME.azurewebsites.net.Pode levar um ou dois minutos para o aplicativo iniciar. Se você vir uma página de aplicativo padrão que não seja a página de aplicativo de exemplo padrão, aguarde um minuto e atualize o navegador.
Teste a funcionalidade do aplicativo de exemplo adicionando um restaurante e algumas avaliações com fotos do restaurante.
As informações de restaurante e avaliação são armazenadas no Banco de Dados do Azure para PostgreSQL e as fotos são armazenadas no Armazenamento do Azure. Aqui está um exemplo de captura de tela:
Limpar
Neste tutorial, todos os recursos do Azure foram criados no mesmo grupo de recursos. Remover o grupo de recursos do Azure com o comando az group delete remove todos os recursos desse grupo de recursos e é a maneira mais rápida de eliminar todos os recursos do Azure usados pelo seu aplicativo.
az group delete --name $RESOURCE_GROUP_NAME
Opcionalmente, você pode adicionar o argumento --no-wait para permitir que o comando retorne antes que a operação seja concluída.
Próximas etapas
Implantar um aplicativo web em Python (Django ou Flask) com PostgreSQL no Azure App Service.
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 PostgreSQL do Azure e o Armazenamento do Azure.