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 创建的。 ## 架构 ![架构图](https://raw.githubusercontent.com/aws-samples/sample-sagemaker-mlflow-embedded-ui/main/Architecture%20Diagram.png) ## 前置条件 - 具有足够 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, 机器学习运维, 自动化攻击, 逆向工具