aws-samples/sample-sagemaker-mlflow-embedded-ui
GitHub: aws-samples/sample-sagemaker-mlflow-embedded-ui
该项目提供了一套完整的 AWS CDK 基础设施和 Flask 反向代理方案,用于将 SageMaker 托管的 MLflow UI 通过 iframe 安全嵌入自定义 React 应用。
Stars: 1 | Forks: 1
# 示例:嵌入式 Amazon SageMaker 托管 MLflow UI
这是一个自定义的 React Web 应用程序,它通过 iframe 嵌入了 Amazon SageMaker 托管的 MLflow 跟踪 UI。在 Amazon EC2 上运行的 Flask 反向代理使用 AWS Signature Version 4 (SigV4) 签名对发往 SageMaker MLflow 端点的所有请求进行身份验证,从而实现对 MLflow UI 和 REST API 的透明访问。
整个基础设施使用 TypeScript 编写的 AWS CDK 进行配置,部署了四个堆栈:网络 (VPC)、SageMaker 域、MLflow 资源(IAM 角色和 S3 存储桶),以及带有 Application Load Balancer (ALB) 的 Flask 应用程序。作为自动化部署脚本的一部分,无服务器 MLflow App 是通过 AWS CLI 创建的。
## 架构

## 前置条件
- 具有足够 IAM 权限的 AWS 账户
- AWS CLI v2.34.5 或更高版本(`create-mlflow-app` 命令所需)
- 已安装并引导(`cdk bootstrap`)的 AWS CDK v2
- Node.js 18.x 或更高版本
- Python 3.13 或更高版本(本地使用,用于部署脚本的 JSON 解析)
## 项目结构
```
├── bin/app.ts # CDK app entry point
├── lib/
│ ├── networking-stack.ts # VPC, subnets, NAT gateway, VPC endpoints
│ ├── sagemaker-domain-stack.ts # SageMaker domain and execution role
│ ├── managed-mlflow-stack.ts # MLflow IAM role and S3 artifacts bucket
│ └── flask-app-stack.ts # EC2, ALB, IAM roles, S3 helper upload
├── helpers/
│ ├── app/
│ │ ├── main.py # Flask reverse proxy with SigV4 signing
│ │ ├── aws_utils.py # SigV4 signing utilities
│ │ └── requirements.txt # Python dependencies
│ ├── frontend/
│ │ ├── src/App.js # React app with MLflow iframe
│ │ ├── build/ # Pre-built React static files
│ │ └── package.json # React dependencies
│ ├── install_python13.sh # Python 3.13 installer for EC2
│ ├── setup_mlflow_proxy_app.sh # Flask app setup script for EC2
│ └── mlflowproxy.service # systemd service definition
├── deploy.sh # Automated deployment script
├── cleanup.sh # Automated teardown script
```
## 部署
### 1. 安装 CDK 依赖项
```
npm install
```
### 2. 预构建 React 前端
```
cd helpers/frontend
npm install
npm run build
cd ../..
```
### 3. 设置环境变量
```
export CDK_DEFAULT_ACCOUNT=
export CDK_DEFAULT_REGION=
```
如果您想部署到 `us-east-1` 以外的区域,请一并设置以下变量以覆盖 `~/.aws/config` 中的任何默认区域:
```
export AWS_DEFAULT_REGION=
export AWS_REGION=
```
### 4. 引导 CDK(每个账户/区域仅需一次)
```
npx cdk bootstrap aws:///
```
### 5. 运行部署脚本
```
bash deploy.sh
```
此单一脚本将执行以下操作:
1. 通过 CDK 部署网络、SageMaker 域和 MLflow 资源堆栈
2. 通过 `aws sagemaker create-mlflow-app` 创建无服务器 MLflow App
3. 部署 Flask App 堆栈,并将 MLflow App ARN 作为 CDK context 传递
请注意输出中的 ALB URL。
### 6. 在 EC2 上设置应用程序
通过 AWS Systems Manager Session Manager 连接到 EC2 实例,然后运行:
```
sudo bash /root/install_python13.sh
sudo bash /root/setup_mlflow_proxy_app.sh
```
### 7. 验证
在浏览器中打开 ALB URL。您应该会被重定向到 `/app`,页面会显示嵌入了 MLflow UI(通过 iframe)的 React 仪表板。
测试健康检查端点:
```
curl http:///health
```
## 测试 MLflow API
通过代理创建一个实验:
```
curl -X POST http:///api/2.0/mlflow/experiments/create \
-H "Content-Type: application/json" \
-d '{"name": "my-first-experiment"}'
```
## 清理
```
bash cleanup.sh
```
这将以正确的顺序销毁所有 CDK 堆栈,并删除无服务器 MLflow App。MLflow 产物的 S3 存储桶具有 RETAIN 策略,如果不再需要,必须手动将其删除。
## 关键技术细节
- **SigV4 签名**:Flask 代理使用服务名称 `sagemaker` 对请求进行签名,并包含 `x-sm-mlflow-app-arn` 标头
- **MLflow 端点**:`https://mlflow.sagemaker..app.aws`
- **IAM**:最小权限角色 —— EC2 实例角色会代入(assume)专用的 `FlaskMlflowRole` 以获取 MLflow API 访问权限
- **Iframe 嵌入**:代理会从上游响应中剔除 `X-Frame-Options` 和与 gzip 相关的标头
- **VPC 端点**:包含用于 SageMaker API、STS、S3、CloudWatch、ECR 和 KMS 的 VPC 端点
## 故障排除
| 问题 | 解决方案 |
|-------|----------|
| `deploy.sh` 在创建 MLflow App 时失败 | 确保已安装 AWS CLI v2.34.5+(`aws --version`) |
| ALB 返回 502 Bad Gateway | 在 EC2 实例上检查 Flask 服务:`systemctl status mlflowproxy` |
| MLflow UI 显示空白页 | 验证是否在 `main.py` 中剔除了 gzip 标头 |
| MLflow REST API 返回 403 | 检查 `aws_utils.py` 中的 SigV4 服务名称是否为 `sagemaker` |
| 堆栈删除失败 | 查看 VPC 清理 Lambda 函数的 CloudWatch 日志 |
## 安全注意事项
- ALB 部署时使用的是 HTTP(端口 80)。对于生产环境,请使用 SSL/TLS 证书添加 HTTPS。
- ALB 上未配置身份验证。对于生产环境,请使用带有 Amazon Cognito 或 OIDC 的 ALB 身份验证与您的 SSO 提供商进行集成。
- EC2 实例运行在没有直接互联网访问权限的私有子网中。
## 许可证
本项目基于 MIT-0 许可证授权。详情请参阅 LICENSE 文件。
## 贡献者
本项目的开发与维护人员:
- **Manish Garg**
- **Ashish Bhatt**
- **Ram Yennapusa**
标签:AWS, DPI, Flask, MLflow, MLOps, React, Syscalls, 机器学习运维, 自动化攻击, 逆向工具