Конвейеры фабрики данных Azure: создание конвейеров с помощью Python: аутентификация (через az cli)

#python #azure #azure-data-factory-2

#python #azure #azure-data-factory

Вопрос:

Я пытаюсь создать конвейеры фабрики данных Azure с помощью Python, используя пример, предоставленный Microsoft здесь:

https://learn.microsoft.com/en-us/azure/data-factory/quickstart-create-data-factory-python

 def main():

    # Azure subscription ID
    subscription_id = '<Specify your Azure Subscription ID>'

    # This program creates this resource group. If it's an existing resource group, comment out the code that creates the resource group
    rg_name = 'ADFTutorialResourceGroup'

    # The data factory name. It must be globally unique.
    df_name = '<Specify a name for the data factory. It must be globally unique>'

    # Specify your Active Directory client ID, client secret, and tenant ID
    credentials = ServicePrincipalCredentials(client_id='<Active Directory application/client ID>', secret='<client secret>', tenant='<Active Directory tenant ID>')
    resource_client = ResourceManagementClient(credentials, subscription_id)
    adf_client = DataFactoryManagementClient(credentials, subscription_id)

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

Однако я не могу передать учетные данные, как показано выше, поскольку вход в Azure выполняется как отдельный шаг ранее в конвейере, оставляя меня с аутентифицированным сеансом в azure (никакие другие учетные данные не могут быть переданы в этот скрипт).

Прежде чем я запущу код python для создания конвейера, я выполняю «az login» через конвейер развертывания Jenkins, который возвращает мне аутентифицированный сеанс azurerm. Я должен иметь возможность повторно использовать этот сеанс в скрипте python для получения клиента фабрики данных без повторной аутентификации.

Однако я не уверен, как изменить часть кода, посвященную созданию клиента, поскольку, похоже, не существует примеров, использующих уже установленный сеанс azurerm:

     adf_client = DataFactoryManagementClient(credentials, subscription_id)

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

 #Create a data factory
    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)

  

Документация по аутентификации Microsoft предполагает, что я могу пройти аутентификацию с использованием ранее установленного сеанса следующим образом:

 from azure.common.client_factory import get_client_from_cli_profile
from azure.mgmt.compute import ComputeManagementClient

client = get_client_from_cli_profile(ComputeManagementClient)
  

( ссылка:https://learn.microsoft.com/en-us/python/azure/python-sdk-azure-authenticate?view=azure-python )

Это работает, однако создание экземпляра объекта фабрики данных Azure завершается ошибкой с:

 Traceback (most recent call last):
  File "post-scripts/check-data-factory.py", line 72, in <module>
    main()
  File "post-scripts/check-data-factory.py", line 65, in main
    df = adf_client.factories.create_or_update(rg_name, data_factory_name, df_resource)

AttributeError: 'ComputeManagementClient' object has no attribute 'factories'

  

Так что, возможно, между этим и получением объекта df требуются какие-то дополнительные шаги?

Любая подсказка приветствуется!

Ответ №1:

Просто замените класс на правильный тип:

 from azure.common.client_factory import get_client_from_cli_profile
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.datafactory import DataFactoryManagementClient

resource_client = get_client_from_cli_profile(ResourceManagementClient)
adf_client = get_client_from_cli_profile(DataFactoryManagementClient)
  

Ошибка, которую вы получили, связана с тем, что вы создали вычислительный клиент (для обработки виртуальной машины), а не клиент ADF. Но да, вы нашли правильный документ для своих нужд 🙂

(раскрытие информации: я работаю в MS в команде Python SDK)

Комментарии:

1. К вашему сведению, я обнаружил эту ошибку в этом примере кода: github.com/MicrosoftDocs/azure-docs/issues/26361 … Я прокомментировал эту проблему с просьбой об обходном пути или исправлении. Знаете ли вы, как я могу обойти эту конкретную проблему в промежуточный период?

2. Спасибо за ссылку, не знал об этом, сделал PR, чтобы это исправить github.com/MicrosoftDocs/azure-docs/pull/28999

3. @LaurentMazuel на сегодняшний день этот метод устарел. Есть ли какой-либо другой вариант?