无法使用DefaultAzureCredential创建DataFactoryManagementClient()?

时间:2020-10-20 15:05:57

标签: python authentication azure-data-factory

到目前为止,我将DefaultAzureCredential用于所有Python开发人员(KeyVault客户端,BlobStorage客户端等)。这是我第一次在Python中使用azure.mgmt.datafactory。尝试使用DefaultAzureCredential时,出现错误:AttributeError: 'DefaultAzureCredential' object has no attribute 'signed_session'

要复制: 重现行为的步骤:

credential = DefaultAzureCredential()
resource_client = ResourceManagementClient(credential, subscription_id)
adf_client = DataFactoryManagementClient(credential, subscription_id)
rg_name = 'RG_ADF_SANDBOX1'
df_name = 'df20201019test'
df_resource = Factory(location='westus')
df = adf_client.factories.create_or_update(rg_name, df_name, df_resource) #<----ERROR HERE

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这是因为azure-mgmt-datafactory尚未更新为使用azure.core。您可以参考https://docs.microsoft.com/en-us/azure/developer/python/azure-sdk-authenticate?tabs=cmd#defaultazurecredential-object-has-no-attribute-signed-session

本文档提供了两种选择:

  1. 使用随后描述的其他身份验证方法之一 本文的各个部分,对于使用以下代码的代码可以很好地工作 仅SDK管理库,并且不会部署到 云,在这种情况下,您只能依靠本地服务主体。

  2. 使用CredentialWrapper类代替DefaultAzureCredential (cred_wrapper.py),由Azure SDK的成员提供 工程团队。一旦所需的管理库可用, 切换回DefaultAzureCredential。这种方法的优点 您可以在SDK客户端和 管理库,它既可以在本地也可以在云中工作。

您还可以使用以下代码创建数据工厂:

from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.datafactory import DataFactoryManagementClient
from azure.mgmt.datafactory.models import *
import time

#Create a data factory
subscription_id = '<Specify your Azure Subscription ID>'
credentials = ServicePrincipalCredentials(client_id='<Active Directory application/client ID>', secret='<client secret>', tenant='<Active Directory tenant ID>')
adf_client = DataFactoryManagementClient(credentials, subscription_id)

rg_params = {'location':'eastus'}
df_params = {'location':'eastus'}  

df_resource = Factory(location='eastus')
df = adf_client.factories.create_or_update(rg_name, df_name, df_resource)
print_item(df)
while df.provisioning_state != 'Succeeded':
    df = adf_client.factories.get(rg_name, df_name)
    time.sleep(1)