#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 на сегодняшний день этот метод устарел. Есть ли какой-либо другой вариант?