如何通过Lambda执行SageMaker数据处理任务?
解决方案:Lambda执行SageMaker数据处理流程 + CodePipeline自动化
一、解决Lambda中SageMaker包依赖问题
Lambda默认运行环境未预装SageMaker SDK,有两种可行方案:
方案1:使用Lambda层
- 本地创建对应Python版本的目录结构(以Python 3.9为例):
python/lib/python3.9/site-packages - 执行命令安装SDK到该目录:
pip install sagemaker -t python/lib/python3.9/site-packages - 将整个
python目录压缩为zip包,上传至Lambda层 - 在目标Lambda函数的配置中关联该层
方案2:容器镜像部署Lambda
- 基于Lambda官方Python镜像构建自定义镜像,在Dockerfile中添加
RUN pip install sagemaker - 将镜像上传至ECR,使用该镜像创建Lambda函数
二、Lambda中执行SageMaker Processing Job的正确代码
注意:Lambda环境中不能使用sagemaker.get_execution_role(),需手动指定SageMaker执行角色ARN,同时明确配置区域:
import boto3 from sagemaker.processing import Processor, ProcessingInput, ProcessingOutput import sagemaker def lambda_handler(event, context): # 配置参数 input_data = 's3://sagemaker-ap-south-1-057036842446/sagemaker/Data/Training/Churn_Modelling.csv' output_dir = 's3://sagemaker-ap-south-1-057036842446/sagemaker/Outputs/' image_uri = '057036842446.dkr.ecr.ap-south-1.amazonaws.com/aws-docker-repo:latest' # 替换为你的SageMaker执行角色ARN sagemaker_role_arn = 'arn:aws:iam::057036842446:role/SageMakerExecutionRole' # 初始化带区域的SageMaker会话 sagemaker_session = sagemaker.Session(boto3.Session(region_name='ap-south-1')) processor = Processor( image_uri=image_uri, role=sagemaker_role_arn, instance_count=1, instance_type="ml.m5.xlarge", sagemaker_session=sagemaker_session ) processor.run( inputs=[ ProcessingInput( source=input_data, destination='/opt/ml/processing/input' ) ], outputs=[ ProcessingOutput( source='/opt/ml/processing/output', destination=output_dir ) ] ) return { 'statusCode': 200, 'body': 'Processing job started successfully' }
关键权限配置
- Lambda执行角色:需添加以下权限(或更细粒度的权限策略):
sagemaker:CreateProcessingJob- 访问ECR镜像的权限
- S3读写权限(对应输入输出路径)
- SageMaker执行角色:需包含:
- 限定输入输出路径的S3读写权限(或
AmazonS3FullAccess) AmazonEC2ContainerRegistryReadOnly- SageMaker Processing Job相关执行权限(或
AmazonSageMakerFullAccess)
- 限定输入输出路径的S3读写权限(或
三、数据同步说明
SageMaker Processing Job会自动完成数据的拉取和推送,无需手动处理:
- 指定
ProcessingInput的source为S3路径时,SageMaker会自动将数据同步至容器内的destination目录(即/opt/ml/processing/input) - 指定
ProcessingOutput的source为容器内目录时,SageMaker会自动将目录下的处理结果同步至指定的S3destination路径
四、CodePipeline自动化实现
流程架构
- 源阶段:配置S3触发器(当输入数据更新时触发)或关联CodeCommit仓库
- 执行阶段:选择以下两种方式之一:
- CodeBuild执行:编写
buildspec.yml安装SDK并运行处理脚本 - Lambda触发:在CodePipeline中添加Lambda动作,调用上述Lambda函数
- CodeBuild执行:编写
- 验证阶段(可选):添加自定义验证步骤,检查S3输出目录是否生成预期文件
CodeBuild示例buildspec.yml
version: 0.2 phases: install: runtime-versions: python: 3.9 commands: - pip install sagemaker build: commands: - python run_processing_job.py
注:run_processing_job.py内容同上述Lambda中的核心处理代码,需手动指定SageMaker角色ARN和区域
CodePipeline权限配置
CodePipeline服务角色需具备:
- 调用Lambda/CodeBuild的权限
- 触发SageMaker Processing Job的权限
- S3资源访问权限
内容的提问来源于stack exchange,提问作者Karki
相关产品推荐
相关产品推荐

