Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Os aplicativos hospedados fora do Azure (por exemplo, no local ou em um data center de terceiros) devem usar um principal de serviço de aplicação para autenticar-se no Azure ao acessar os recursos do Azure. Os objetos principais do serviço de aplicativo são criados usando o processo de registro do aplicativo no Azure. A criação de uma nova entidade de serviço de aplicação gera um identificador de cliente e um segredo de cliente para a sua aplicação. Você armazena a ID do cliente, o segredo do cliente e a ID do locatário em variáveis de ambiente a serem usadas pelo SDK do Azure para Python para autenticar seu aplicativo no Azure em tempo de execução.
Um registro de aplicativo diferente deve ser criado para cada ambiente em que o aplicativo está hospedado. Criar um registro de aplicativo diferente permite que permissões de recursos específicos do ambiente sejam configuradas para cada entidade de serviço e garante que um aplicativo implantado em um ambiente não converse com os recursos do Azure que fazem parte de outro ambiente.
Registrar o aplicativo no Azure
Um aplicativo pode ser registrado no Azure usando o portal do Azure ou a CLI do Azure.
APP_NAME=<app-name>
az ad sp create-for-rbac --name $APP_NAME
A saída do comando é semelhante à seguinte. Anote esses valores ou mantenha essa janela aberta, pois você precisará desses valores nas próximas etapas e não poderá visualizar o valor da senha (segredo do cliente) novamente.
{
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
Em seguida, você precisa obter o appID valor e armazená-lo em uma variável. Esse valor é usado para definir variáveis de ambiente em seu ambiente de desenvolvimento local para que o SDK do Azure para Python possa se autenticar no Azure usando a entidade de serviço.
APP_ID=$(az ad sp create-for-rbac \
--name $APP_NAME --query appId --output tsv)
Atribuir funções à entidade de serviço do aplicativo
Em seguida, você precisa determinar quais funções (permissões) seu aplicativo precisa em quais recursos e atribuir essas funções ao seu aplicativo. As funções podem ser atribuídas a um recurso, grupo de recursos ou escopo de assinatura. Este exemplo mostra como atribuir funções para a entidade de serviço no escopo do grupo de recursos, já que a maioria dos aplicativos agrupa todos os seus recursos do Azure em um único grupo de recursos.
Um principal de serviço é atribuído um papel no Azure usando o comando az role assignment create.
RESOURCE_GROUP_NAME=<resource-group-name>
SUBSCRIPTION_ID=$(az account show --query id --output tsv)
ROLE_NAME=<role-name>
az role assignment create \
--assignee "$APP_ID" \
--scope "./subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME" \
--role "$ROLE_NAME"
![!NOTA] Para impedir que o Git Bash trate /subscriptions/... como um caminho de arquivo, adicione ./ à string do parâmetro
scopee use aspas duplas ao redor de toda a string.
Para obter os nomes de função aos quais se pode atribuir uma entidade de serviço, utilize o comando az role definition list.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Por exemplo, para permitir que a entidade de serviço com o appId de leitura, gravação e exclusão tenha acesso a contêineres e dados de blob de Armazenamento do Azure em todas as contas de armazenamento no 00001111-aaaa-2222-bbbb-3333cccc4444 na assinatura com ID , você atribuiria a entidade de aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e serviço do aplicativo à função de Colaborador de Dados de Blob de Armazenamento usando o comando a seguir.
az role assignment create --assignee 00001111-aaaa-2222-bbbb-3333cccc4444 \
--scope "./subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example" \
--role "Storage Blob Data Contributor"
Para obter informações sobre como atribuir permissões no nível de recurso ou assinatura usando a CLI do Azure, consulte o artigo Atribuir funções do Azure usando a CLI do Azure.
Configurar variáveis de ambiente para aplicativo
Você deve definir as variáveis de ambiente AZURE_CLIENT_ID, AZURE_TENANT_ID e AZURE_CLIENT_SECRET para o processo que executa a sua aplicação Python, para tornar as credenciais do principal de serviço da aplicação disponíveis para a sua aplicação em tempo de execução. O DefaultAzureCredential objeto procura as informações do principal de serviço nessas variáveis de ambiente.
Ao usar o Gunicorn para executar aplicativos Web Python em um ambiente de servidor UNIX, as variáveis de ambiente para um aplicativo podem ser especificadas usando a EnvironmentFile diretiva no gunicorn.server. Veja o seguinte exemplo.
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=www-user
Group=www-data
WorkingDirectory=/path/to/python-app
EnvironmentFile=/path/to/python-app/py-env/app-environment-variables
ExecStart=/path/to/python-app/py-env/gunicorn --config config.py wsgi:app
[Install]
WantedBy=multi-user.target
O arquivo especificado na EnvironmentFile diretiva deve conter uma lista de variáveis de ambiente com seus valores da seguinte maneira.
AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>
Implementar DefaultAzureCredential no aplicativo
Para autenticar objetos de cliente do SDK do Azure no Azure, a sua aplicação deve usar a classe DefaultAzureCredential do pacote azure.identity.
Comece adicionando o pacote azure.identity ao seu aplicativo.
pip install azure-identity
Em seguida, para qualquer código Python que crie um objeto de cliente do SDK do Azure em seu aplicativo, você deve:
- Importe a
DefaultAzureCredentialclasse doazure.identitymódulo. - Crie um
DefaultAzureCredentialobjeto. - Passe o
DefaultAzureCredentialobjeto para o construtor de objeto de cliente do SDK do Azure.
Um exemplo dessa abordagem é mostrado no segmento de código a seguir.
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
# Acquire a credential object
token_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url="https://<my_account_name>.blob.core.windows.net",
credential=token_credential)
Neste exemplo, quando o código instancia o objeto DefaultAzureCredential, DefaultAzureCredential lê as variáveis de ambiente AZURE_TENANT_ID, AZURE_CLIENT_ID, e AZURE_CLIENT_SECRET para obter as informações do principal de serviço da aplicação para se conectar ao Azure.