aws-samples/sample-sagemaker-mlflow-rest-apis
GitHub: aws-samples/sample-sagemaker-mlflow-rest-apis
该项目提供了一套 AWS CDK 模板,用于快速部署 Amazon SageMaker AI MLflow 环境及安全的 Flask 代理应用,实现外部服务对 MLflow REST API 的安全访问。
Stars: 1 | Forks: 1
# Amazon SageMaker AI MLflow CDK 项目
此 CDK 项目演示了如何通过外部服务访问 Amazon SageMaker AI MLflow REST API。它支持两种 MLflow 部署模式 —— **Tracking Server** 和 **Serverless App** —— 并创建一个 Flask Web 应用程序,作为外部安全访问 MLflow API 的代理,遵循 AWS 最佳实践。
## 架构概述
该项目由四个主要 Stack 组成:
1. **Networking Stack** - 基础 VPC 基础设施(共享)
2. **SageMaker Domain Stack** - 包含用户配置文件的 Amazon SageMaker AI Studio 域(共享)
3. **Managed MLflow Stack** - MLflow Tracking Server 或 Serverless App(特定类型)
4. **Flask App Stack** - 带有 ALB 的 Flask 代理应用程序,用于访问 MLflow API(特定类型)
### MLflow 部署模式
该项目支持两种 MLflow 部署模式,通过 `mlflowType` CDK context 参数进行选择:
| 方面 | Tracking Server (`tracking`) | Serverless App (`serverless`) |
|--------|------------------------------|-------------------------------|
| 资源 | `CfnMlflowTrackingServer` | Custom Resource(基于 Lambda 的 `create_mlflow_app`) |
| API Endpoint | `https://{region}.experiments.sagemaker.aws` | `https://mlflow.sagemaker.{region}.app.aws` |
| SigV4 服务 | `sagemaker-mlflow` | `sagemaker` |
| 请求标头 | `x-mlflow-sm-tracking-server-arn` | `x-sm-mlflow-app-arn` |
| IAM 权限 | `sagemaker-mlflow:*` | `sagemaker:CallMlflowAppApi`, `sagemaker-mlflow:*` |
这两种模式可以在同一个账户/区域中共存 —— Networking 和 Amazon SageMaker AI Domain Stack 是共享的,而 MLflow 和 Flask App Stack 会根据类型进行命名(例如:`sagemaker-infra-mlflow-tracking`、`sagemaker-infra-flaskapp-serverless`)。
## Stack 依赖关系
```
NetworkingStack (Foundation - shared)
├── SageMakerDomainStack (depends on NetworkingStack - shared)
├── ManagedMlflowStack (depends on NetworkingStack + SageMakerDomainStack - per mlflowType)
└── FlaskAppStack (depends on NetworkingStack + ManagedMlflowStack - per mlflowType)
```
## 功能
### Networking Stack
- 具有公有、私有和隔离子网的多可用区 VPC
- 用于优化成本和安全性的 VPC endpoint
- 遵循最小权限原则的安全组
- 用于出站互联网访问的 NAT 网关
### Amazon SageMaker AI Domain Stack
- 仅限 VPC 访问的 Amazon SageMaker AI Studio 域
- 具有适当权限的 IAM 执行角色
- 用于存放 Amazon SageMaker AI 工件的 S3 存储桶
- 默认用户配置文件配置
### Managed MLflow Stack
- **Tracking Server 模式**:具有自动模型注册功能的 Amazon SageMaker AI MLflow Tracking Server
- **Serverless App 模式**:通过 `create_mlflow_app` API 预置无服务器 MLflow 应用程序的 Lambda Custom Resource,包含自动打包的 boto3 Lambda layer(在 `cdk synth`/`cdk deploy` 期间自动构建 —— 如果可用,则使用本地 `pip`/`pip3`,否则回退到 Docker)
- 具有生命周期策略的 MLflow 工件 S3 存储桶
- 完全托管的后端(无需进行数据库管理)
### Flask App Stack
- 支持 Tracking Server 和 Serverless MLflow 两种模式的 Flask 代理应用程序
- 根据 ARN 格式自动检测模式(ARN 中包含 `:mlflow-app/` = Serverless)
- 使用适合模式的签名服务和标头进行 SigV4 请求签名
- Application Load Balancer(面向互联网,端口 80 -> EC2 端口 5000)
- EC2 实例(Ubuntu 24.04 LTS),通过 SSM Parameter Store 自动解析 AMI
- 通过 STS 担任的专用 IAM 角色(`FlaskMlflowRole`),仅具有最小的 MLflow 权限
- 遵循最小权限原则的安全组
- 使用用户数据脚本进行自动部署(S3 辅助程序下载、systemd 服务设置)
## 前置条件
要顺利完成本指南,请确保您具备以下前置条件:
- 一个 AWS 账户
- 一台安装了以下工具的工作站:
- 配置好 AWS CLI,且具有在 AWS 账户中创建 VPC、EC2、Amazon SageMaker AI、S3、IAM、CloudFormation 和 Application Load Balancer 的权限
- Node.js v18+
- NPM
- AWS CDK CLI v2.100.0+
- 带有 `pip`/`pip3` 的 Python 3.x(用于在 Serverless 部署期间自动打包 boto3 Lambda layer)。如果不可用,将回退使用 Docker。
### 辅助脚本
该项目包含将辅助脚本自动部署到 S3 的流程。请确保 `helpers/` 文件夹中包含:
- `app/main.py` - Flask 应用程序(带 SigV4 签名的双模式代理)
- `app/aws_utils.py` - AWS 工具(STS AssumeRole、带有可配置服务名称的 SigV4Auth)
- `app/requirements.txt` - Python 依赖项 (boto3 >= 1.42.0)
- `mlflowproxy.service` - Systemd 服务文件(环境变量由 CDK 注入)
- `setup_mlflow_proxy_app.sh` - 安装配置脚本
- `install_python13.sh` - Python 3.13 安装脚本
**注意**:在 CDK 部署期间,会使用 `BucketDeployment` 自动将辅助脚本上传到 S3。
## 安装
1. 克隆仓库并安装依赖项:
```
npm install
```
2. 引导 CDK(如果尚未执行):
```
npx cdk bootstrap aws:///
```
## 部署
### 使用 Tracking Server 部署(默认)
```
npx cdk deploy --all
```
或显式指定:
```
npx cdk deploy --all -c mlflowType=tracking
```
### 使用 Serverless MLflow App 部署
```
npx cdk deploy --all -c mlflowType=serverless
```
### 同时部署两种模式(在同一账户/区域中共存)
```
npx cdk deploy --all -c mlflowType=tracking
npx cdk deploy --all -c mlflowType=serverless
```
### 部署到其他区域
```
CDK_DEFAULT_REGION=us-west-2 npx cdk bootstrap aws:///us-west-2
CDK_DEFAULT_REGION=us-west-2 npx cdk deploy --all -c mlflowType=serverless
```
## 配置
### 环境变量
- `CDK_DEFAULT_ACCOUNT` - AWS 账户 ID
- `CDK_DEFAULT_REGION` - AWS 区域(默认为 us-east-1)
### Flask 应用程序组件
该 Flask 应用程序包含:
- **main.py** - 具有双模式 MLflow API 路由(Tracking Server / Serverless)的 Flask 代理应用程序
- **aws_utils.py** - AWS 身份验证、STS AssumeRole 和 SigV4 请求签名
- **mlflowproxy.service** - 用于自动启动的 Systemd 服务(环境变量:`SM_MLFLOW_ROLE_ARN`、`SM_MLFLOW_AWS_REGION`、`SM_MLFLOW_RESOURCE_ARN`)
- **setup_mlflow_proxy_app.sh`** - 安装和配置脚本
- **install_python13.sh** - Python 3.13 安装脚本
## 清理
要销毁特定模式的所有资源:
```
npx cdk destroy --all -c mlflowType=tracking
npx cdk destroy --all -c mlflowType=serverless
```
**注意**:某些资源(如 S3 存储桶)具有保留策略,可能需要手动删除。Networking 和 Amazon SageMaker AI Domain Stack 是共享的 —— 请仅在移除两个 MLflow/Flask Stack 后再销毁它们。
## 故障排除
### 常见问题
1. **VPC Endpoint 创建失败**:确保该区域支持所有必需的 VPC endpoint
2. **Amazon SageMaker AI Domain 创建超时**:检查安全组规则和子网配置
3. **无法访问 MLflow API**:验证 Flask 应用程序是否正在运行,以及 ALB 健康检查是否通过
4. **Flask 应用程序出现 403 错误**:检查 IAM 角色权限 —— Tracking Server 需要 `sagemaker-mlflow:*`,Serverless 模式额外需要 `sagemaker:CallMlflowAppApi`
5. **ALB 健康检查失败**:验证 EC2 实例是否正在运行,以及 Flask 应用程序是否已在端口 5000 上启动
6. **循环依赖错误**:确保安全组规则不会创建循环引用
7. **EC2 用户数据执行失败**:通过 SSM 检查 `/var/log/user-data.log` —— 常见原因是启动时 dpkg 锁被 `unattended-upgrades` 占用
8. **Serverless MLflow App 创建失败**:boto3 Lambda layer 会在综合阶段自动打包。如果本地 `pip`/`pip3` 不可用,则必须运行 Docker 以进行回退打包。请确保 layer 中安装的 boto3 >= 1.42.0(Lambda 自带的 boto3 对于 `create_mlflow_app` API 来说版本过旧)
## 贡献者
该项目的开发与维护由以下人员完成:
- **Manish Garg**
- **Ashish Bhatt**
- **Ram Yennapusa**
标签:Amazon SageMaker, AWS CDK, Flask, MITM代理, MLflow, MLOps, 人工智能, 用户模式Hook绕过, 自动化攻击, 逆向工具