Прозрачный REST API-прокси для внешнего доступа к Amazon SageMaker MLflow
Команды по машинному обучению используют MLflow для эффективного управления жизненным циклом ML. Amazon SageMaker MLflow предоставляет расширенные возможности для отслеживания экспериментов ML и управления моделями. Однако у многих предприятий есть существующие инфраструктурные требования, которым нужны интеграции по HTTPS, а не прямое использование SDK.
Многим организациям нужно интегрировать Amazon SageMaker MLflow со своими устоявшимися системами, сохраняя при этом принятые подходы к безопасности и инфраструктуре. Эта задача особенно актуальна для команд, которые не могут использовать SDK напрямую из-за корпоративных политик безопасности, сетевых ограничений или ограничений унаследованных систем.
В этой статье мы показываем, как построить защищённый прокси-сервис MLflow на базе Flask, который обеспечивает HTTPS-доступ к Amazon SageMaker MLflow без необходимости использовать MLflow SDK. Это решение предназначено для организаций, проходящих облачную трансформацию и стремящихся сохранить существующие рабочие процессы ML при переходе на облачные сервисы.
- Внедрение прокси-сервиса MLflow для HTTPS-запросов к MLflow.
- Настройка аутентификации AWS Identity and Access Management (IAM) для защищённого доступа.
- Управление предварительным подписанием URL и преобразованием запросов.
После внедрения этого решения вы сможете:
- Безопасно обращаться к SageMaker MLflow через стандартные HTTPS-эндпоинты.
- Соблюдать требования безопасности вашей организации.
- Интегрировать MLflow с существующими корпоративными системами.
- Снизить сложность реализации и затраты на сопровождение.
Обзор решения
Лёгкая архитектура прокси MLflow на базе Flask обеспечивает защищённую интеграцию между корпоративными системами и Amazon SageMaker MLflow через три ключевых компонента.
Компонент 1: Application Load Balancer (ALB)
AWS Application Load Balancer выступает в роли верхнего маршрутизатора и обеспечивает следующее:
- Распределение трафика для интерфейса MLflow UI и REST API-запросов.
- Первичную обработку и маршрутизацию запросов.
- Поддержку пользовательских доменных имён и SSL-терминации.
Примечание: в этой реализации используется ALB, но при необходимости можно использовать и другие решения маршрутизации, например Nginx.
Компонент 2: прокси-сервис Flask MLflow
В основе архитектуры лежит Python-приложение на Flask, которое выполняет следующие функции:
- Перехватывает и обрабатывает входящие HTTPS-запросы.
- Управляет аутентификацией AWS и подписью запросов.
- Преобразует URL для безопасного доступа к конечным точкам MLflow.
- Возвращает ответы клиентам по соответствующим маршрутам.
Компонент 3: Amazon SageMaker MLflow
Управляемый AWS сервис SageMaker MLflow предоставляет следующее:
- Поддержку двух режимов развёртывания MLflow:
- MLflow Tracking Server — управляемый сервер отслеживания MLflow.
- MLflowApp — бессерверное приложение MLflow.
- Хранилище метаданных бэкенда для информации об отслеживании.
- Хранилище файлов моделей и данных.
Эта архитектура обеспечивает защищённую связь, сохраняя совместимость с существующими корпоративными системами. Прокси-сервис выступает мостом, преобразуя стандартные HTTPS-запросы в аутентифицированные вызовы AWS API, которые могут взаимодействовать с SageMaker MLflow.
Архитектура и поток запросов
На следующей схеме показано, как прокси-сервис Flask обеспечивает защищённую связь между внешними клиентами и Amazon SageMaker MLflow.

На схеме архитектуры показаны три основных компонента:
- ALB, который обрабатывает входящий трафик.
- Прокси-сервис Flask, который управляет аутентификацией и преобразованием запросов.
- Amazon SageMaker MLflow, который обрабатывает операции ML.
Поток запросов
Рассмотрим, как запросы проходят через эту архитектуру, обеспечивая защищённый доступ к MLflow.
Когда клиент инициирует HTTPS-запрос, он сначала попадает на ALB, который выступает точкой входа для всего входящего трафика. Затем ALB направляет эти запросы в прокси-сервис MLflow.
После получения запроса прокси-сервис MLflow выполняет несколько критически важных функций:
- Обрабатывает аутентификацию через интеграцию AWS IAM.
- Преобразует URL и предварительно подписывает их для безопасного доступа.
- При необходимости обрабатывает конечные точки MLflow REST API.
Прокси-сервис MLflow преобразует входящий запрос в аутентифицированный запрос AWS перед вызовом API к конечным точкам SageMaker MLflow REST. После обработки запроса SageMaker MLflow возвращает ответ, который прокси-сервис MLflow обрабатывает и направляет обратно исходному клиенту.
Такой поток сохраняет безопасность и одновременно обеспечивает интеграцию между корпоративными системами и SageMaker MLflow.
Предварительные требования
Чтобы выполнить это пошаговое руководство, убедитесь, что у вас есть следующее:
- Учётная запись AWS.
- Рабочая станция со следующими установленными инструментами:
- AWS Command Line Interface (AWS CLI), настроенный с правами на создание:
- Amazon Virtual Private Cloud (Amazon VPC) и связанных сетевых компонентов.
- Экземпляров Amazon Elastic Compute Cloud (Amazon EC2).
- Ресурсов Amazon SageMaker AI.
- Ведёрок Amazon Simple Storage Service (Amazon S3).
- Ролей и политик AWS Identity and Access Management (IAM).
- Стеков AWS CloudFormation.
- AWS Application Load Balancer.
- Node.js версии 18.0.0 или новее.
- NPM.
- AWS Cloud Development Kit (AWS CDK) CLI версии 2.100.0 или новее.
- Python 3.x с pip или pip3.
- AWS Command Line Interface (AWS CLI), настроенный с правами на создание:
- Необходимые знания:
- Базовое понимание сервисов AWS и разрешений IAM.
- Знакомство с приложениями Python и Flask.
- Понимание концепций и операций MLflow.
- Финансовые соображения:
- Это решение создаёт ресурсы AWS, которые могут привести к расходам.
- Ключевые ресурсы, влияющие на стоимость:
- Экземпляры Amazon EC2.
- Application Load Balancer.
- Ресурсы Amazon SageMaker AI.
- Хранилище Amazon S3.
Информацию о ценах на сервисы AWS см. в AWS Pricing Calculator.
Развёртывание решения
В этом разделе показано, как развернуть решение в вашей учётной записи AWS и проверить его работу. Процесс развёртывания занимает примерно 40 минут.
Шаг 1: разверните инфраструктуру с помощью AWS CDK
- Скачайте код решения и установите зависимости:
# Клонируйте репозиторий git clone https://github.com/aws-samples/sample-sagemaker-mlflow-rest-apis.git # Перейдите в каталог проекта и установите зависимости cd sample-sagemaker-mlflow-rest-apis npm ci - Подготовьте окружение для AWS CDK. Пропустите этот шаг, если ваша учётная запись AWS и регион уже подготовлены для AWS CDK. Подготовьте учётную запись AWS и регион для CDK:
npx cdk bootstrap aws://<ACCOUNT_ID>/<REGION> - Разверните необходимые ресурсы в своей учётной записи AWS. Решение состоит из четырёх стеков CDK:
- Сетевой стек — создаёт VPC и сетевые компоненты.
- Стек домена SageMaker AI — настраивает домен SageMaker.
- Стек SageMaker MLflow — разворачивает сервер отслеживания MLflow или бессерверное приложение MLflow.
- Стек приложения Flask — разворачивает прокси-сервис MLflow.
Разверните все стеки одной из следующих команд.
Для развёртывания на базе tracking server:
Формулы и расчетnpx cdk deploy --all --require-approval=never -c mlflowType=trackingДля развёртывания на базе serverless app:
Формулы и расчетnpx cdk deploy --all --require-approval=never -c mlflowType=serverless
Шаг 2: установите и настройте прокси-сервис Flask MLflow
- Подключитесь к экземпляру EC2:
- Запишите идентификатор экземпляра Amazon EC2 из вывода CDK или из раздела вывода стека AWS CloudFormation sagemaker-infra-flaskapp-{mlflowType}.
- Используйте AWS Systems Manager Session Manager для подключения. Следуйте руководству по подключению через Session Manager.
- Установите Python 3.13 и зависимости. Установите пакеты Python:
# Переключитесь на пользователя root sudo su - cd /root # Установите Python и зависимости chmod +x install_python13.sh ./install_python13.shПримечание: этот скрипт предназначен для систем на базе Ubuntu. Для других дистрибутивов Linux установите Python 3.12+, PIP3 и Virtualenv с помощью пакетного менеджера вашей системы.
- Установите и запустите прокси-сервис MLflow:
chmod +x setup_mlflow_proxy_app.sh ./setup_mlflow_proxy_app.sh - Проверьте статус прокси-сервиса Flask MLflow:
systemctl status mlflowproxyПримечание: если сервис не запущен, проверьте журналы с помощью следующей команды:
journalctl -u mlflowproxy
Шаг 3: проверьте доступ к MLflow REST API
В этом разделе показано, как взаимодействовать с REST API MLflow через ALB.
Примечание: в этих примерах используется протокол HTTP (без шифрования). Для производственной среды мы рекомендуем HTTPS. В этой статье мы используем curl для выполнения API-запросов, но вы можете использовать любой удобный инструмент. Приведённые команды curl работают одинаково как для режима tracking server, так и для serverless; прокси-сервис прозрачно обрабатывает различия.
- Получите DNS-имя вашего ALB, выполнив следующую команду на рабочей станции:
Формулы и расчет
aws cloudformation describe-stacks --stack-name sagemaker-infra-flaskapp-{mlflowType} --query 'Stacks[0].Outputs[?OutputKey==`ALBUrl`].OutputValue' --output text - Проверьте конечные точки MLflow API, выполнив следующие команды на рабочей станции. Замените
<ALB DNS>,<EXP ID>,<RUN ID>и<RUN NAME>соответствующими значениями.- Создайте эксперимент:
curl -X POST http://<ALB DNS>/ajax-api/2.0/mlflow/experiments/create -H "Content-Type: application/json" -d '{"name": "mlflow-experiment"}' - Найдите эксперименты:
curl -X POST http://<ALB DNS>/ajax-api/2.0/mlflow/experiments/search -H "Content-Type: application/json" -d '{"max_results": 5}' - Получите эксперимент:
Формулы и расчет
curl -X GET 'http://<ALB DNS>/ajax-api/2.0/mlflow/experiments/get?experiment_id=0' - Создайте запуск внутри эксперимента:
curl -X POST http://<ALB DNS>/ajax-api/2.0/mlflow/runs/create -H "Content-Type: application/json" -d '{"experiment_id": <EXP ID>, "run_name": "<RUN NAME>"}' - Получите список артефактов запуска:
Формулы и расчет
curl -X GET "http://<ALB DNS>/ajax-api/2.0/mlflow/artifacts/list?run_id=<RUN ID>" - Установите тег для запуска:
curl -X POST "http://<ALB DNS>/ajax-api/2.0/mlflow/runs/set-tag" -H "Content-Type: application/json" -d '{"run_id": "<RUN ID>", "key": "model_type","value": "api-test"}' - Удалите запуск:
curl -X POST http://<ALB DNS>/ajax-api/2.0/mlflow/runs/delete -H "Content-Type: application/json" -d '{"run_id": "<RUN ID>"}'
Примечание: вы также можете открыть MLflow UI и увидеть изменения, которые вносите с помощью приведённых команд curl. Инструкции по запуску MLflow UI см. в статье Запуск MLflow UI с использованием предварительно подписанного URL.
- Создайте эксперимент:
Очистка
Чтобы избежать дальнейших расходов и удалить ресурсы, созданные этим решением, выполните следующие шаги очистки:
- Удалите ресурсы, управляемые CDK. Перейдите в корневой каталог клонированного репозитория на рабочей станции и выполните следующие команды. Для развёртывания на базе tracking server:
Формулы и расчет
npx cdk destroy --all -c mlflowType=trackingДля развёртывания на базе serverless app:
Формулы и расчетnpx cdk destroy --all -c mlflowType=serverlessПримечание: сетевой стек и стек домена SageMaker используются совместно обоими режимами развёртывания. AWS CDK удаляет их только тогда, когда удалена последняя пара стеков MLflow или Flask app.
- Ручная очистка ресурсов. Некоторые ресурсы могут потребовать ручного удаления из-за политик хранения или зависимостей:
- Ведёрки Amazon S3:
- Перейдите в консоль Amazon S3.
- Определите ведёрки, созданные этим решением.
- Очистите каждое ведёрко и удалите его.
- Группы журналов Amazon CloudWatch:
- В консоли CloudWatch найдите группы журналов, связанные с этим решением.
- Удалите эти группы журналов.
- Ведёрки Amazon S3:
Соображения по безопасности
При развёртывании этого решения в производственной среде рассмотрите следующие меры безопасности:
- Настройте мониторинг Amazon CloudWatch для прокси-сервиса на базе Flask, чтобы отслеживать состояние приложения, выявлять аномалии и настраивать оповещения о подозрительной активности.
- Внедрите ограничение частоты запросов для прокси-сервиса Flask, чтобы защититься от потенциальных атак отказа в обслуживании (DoS) и контролировать число запросов от отдельных клиентов. Для реализации правил на основе частоты можно использовать AWS WAF (web application firewall) вместе с ALB.
- Разверните внутренний (не доступный из интернета) ALB, чтобы ограничить доступ к прокси только вашей частной сетью. Такая схема гарантирует, что к сервису сможет обращаться только трафик из вашей VPC или связанных сетей. Подключайтесь через VPC peering или AWS Transit Gateway.
- Включите HTTPS-терминацию на уровне ALB для защищённой связи между клиентами и вашим приложением. Для выдачи и управления SSL/TLS-сертификатами можно использовать AWS Certificate Manager (ACM). Инструкции по настройке HTTPS listeners см. в документации по HTTPS listeners Application Load Balancer.
Эти меры безопасности помогают защитить Flask-приложение от распространённых веб-уязвимостей и обеспечивают защищённую связь между компонентами.
Заключение
В этой статье мы показали, как построить защищённый прокси-сервис на Flask, обеспечивающий HTTPS-доступ к Amazon SageMaker MLflow. Это решение помогает организациям связать существующую инфраструктуру с управляемыми возможностями MLflow в AWS, сохраняя корпоративные требования безопасности.
Преимущества решения:
- Интеграция с существующими корпоративными средствами безопасности.
- Минимальные изменения в существующих рабочих процессах ML.
- Снижение сложности развёртывания.
- Интеграция через REST API.
- Совместимость с корпоративными прокси-сервисами.
Что дальше
- Изучите документацию Amazon SageMaker MLflow.
- Прочитайте о серверах отслеживания MLflow и приложениях MLflow.
Попробуйте это решение в своей среде и расскажите о своём опыте в комментариях.
Материал — перевод статьи с английского.
Оригинал: Streamline external access to Amazon SageMaker MLflow using a REST API proxy