Вопрос или проблема
У меня есть программа на Python, которая отправляет конвейеры в Azure ML. Этот код обычно выполняется на безголовых Linux ВМ и выполняет аутентификацию в Azure с помощью потока DeviceCodeCredentials
. Я хочу кэшировать эти учетные данные, чтобы иметь возможность запускать этот скрипт много раз и снова выполнять аутентификацию только время от времени (например, раз в час).
Согласно документации, TokenCachePersistenceOptions
должен решить эту проблему, однако, похоже, что он не имеет эффекта, кроме записи бесполезного файла. Вот как выглядит мой код:
from azure.ai.ml import MLClient
from azure.identity import DeviceCodeCredential, TokenCachePersistenceOptions
from .constants import AML_SUBSCRIPTION_ID, AML_RESOURCE_GROUP, AML_WORKSPACE
cache_path = os.path.expanduser("~/.azure/msal_token_cache.json")
token_cache_options = TokenCachePersistenceOptions(name=cache_path, allow_unencrypted_storage=True)
credential = DeviceCodeCredential(token_cache_persistence_options=token_cache_options)
client = MLClient(
credential=credential,
subscription_id=AML_SUBSCRIPTION_ID,
resource_group_name=AML_RESOURCE_GROUP,
workspace_name=AML_WORKSPACE,
)
# делаем что-то бесполезное, требующее запросов
jobs = client.jobs.list()
_ = [j.name for j in jobs]
Я ожидал, что если я запущу этот скрипт, аутентифицируюсь, а затем запущу его второй раз, он не запросит аутентификацию снова. Однако он это делает.
Я пробовал разные области полномочий учетных данных, а также создавал и вручную сериализовал и десериализовал разнообразные “токены” и “записи авторизации”, передавая эти токены и записи авторизации в методы, которые могут или не могут на самом деле что-то с ними делать, но ничего не срабатывает. Я исследовал документацию для Python SDK. Я обратился в поддержку Azure, но они оказались бесполезными.
Есть ли у кого-нибудь предложения?
Ответ или решение
Чтобы реализовать кэширование учетных данных, используемых с DeviceCodeCredentials
для вашего Python-приложения, которое запускает пайплайны в Azure ML, необходимо убедиться, что токены сохраняются и корректно загружаются при повторных запусках скрипта. Возможно, вы столкнулись с недочетами в настройке и использовании TokenCachePersistenceOptions
. Я приведу пример, как это сделать правильно.
Вот улучшенный вариант вашего кода:
import os
import json
from azure.ai.ml import MLClient
from azure.identity import DeviceCodeCredential, TokenCachePersistenceOptions
from azure.identity import AuthenticationRecord
# Константы для подключения к Azure ML
AML_SUBSCRIPTION_ID = 'ваш_id_подписки'
AML_RESOURCE_GROUP = 'ваша_группа_ресурсов'
AML_WORKSPACE = 'ваш_рабочий_пространство'
# Путь к кэшу токенов
cache_path = os.path.expanduser("~/.azure/msal_token_cache.json")
# Опции кэширования токена
token_cache_options = TokenCachePersistenceOptions(name=cache_path, allow_unencrypted_storage=True)
# Создание экземпляра DeviceCodeCredential с кэшированием
credential = DeviceCodeCredential(token_cache_persistence_options=token_cache_options)
# Проверка наличия существующих учетных данных
try:
# Попытка получить сохраненные учетные данные
auth_record = credential.get_cached_token() # Получить кэшированный токен
if auth_record is None:
# Если кэшированный токен отсутствует, выполняется процесс аутентификации
print("Требуется аутентификация...")
credential.authenticate()
except Exception as e:
print(f"Ошибка при получении токена: {e}")
# Создание клиента MLClient
client = MLClient(
credential=credential,
subscription_id=AML_SUBSCRIPTION_ID,
resource_group_name=AML_RESOURCE_GROUP,
workspace_name=AML_WORKSPACE,
)
# Выполнение запроса к API для проверки работы клиента
try:
jobs = client.jobs.list()
job_names = [j.name for j in jobs]
print("Список заданий:", job_names)
except Exception as e:
print(f"Ошибка при получении списка заданий: {e}")
Объяснение происходящего:
-
Кэширование токенов:
TokenCachePersistenceOptions
позволяет сохранять токен в файл и извлекать его в следующий раз, когда вы запустите скрипт. Убедитесь, что путь к файлу кэша правильный и у вашей программы есть права на его запись. -
Обработка существующих учетных данных: В коде предусмотрен этап проверки, есть ли уже кэшированные учетные данные (токен). Если их нет, выполняется процесс аутентификации. Это позволяет избежать повторной аутентификации, если токен действителен и доступен для использования.
-
Обработка исключений: Оборачивая вызовы в блоки
try-except
, вы сможете увидеть, если что-то пойдет не так, что облегчит отладку.
Заключение:
С этим подходом ваш скрипт должен корректно кэшировать и использовать учетные данные в Azure ML без необходимости повторной аутентификации при каждом запуске. Если проблема все еще сохраняется, убедитесь, что у вас установлены последние версии библиотек Azure SDK для Python.