执行Sagemaker Pipeline upsert时遇JumpStart S3上传权限拒绝错误
问题分析
用JumpStart的LightGBM模型搭了个包含预处理、训练、评估、建模型和转换的Pipeline,单独跑每个步骤都没问题,一组合起来执行pipeline.upsert()就报错,具体错误如下:
S3UploadFailedError: Failed to upload /tmp/tmpexrxqr32/new.tar.gz to jumpstart-cache-prod-ap-southeast-1/source-directory-tarballs/lightgbm/inference/classification/v1.1.2/sourcedir.tar.gz: An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied
而且只要创建Model时指定entry_point就触发这个权限错误,把这行注释掉后pipeline.upsert()能成功,但后续的转换任务又失败了。
解决办法
1. 给Pipeline执行角色补充S3权限
你用的Pipeline执行IAM角色,得拥有对jumpstart-cache-prod-ap-southeast-1桶的写入权限——因为指定entry_point时,系统会自动把你的自定义代码包上传到JumpStart的官方缓存桶。给角色添加如下权限策略试试:
{ "Effect": "Allow", "Action": [ "s3:PutObject", "s3:CreateMultipartUpload", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": "arn:aws:s3:::jumpstart-cache-prod-ap-southeast-1/*" }
2. 不要直接修改JumpStart模型的entry_point
JumpStart预构建模型的entry_point是官方适配好的,自定义指定会触发系统往官方缓存桶上传代码,但这个桶通常限制外部写入。换个方式扩展功能:
- 自己写个推理脚本(比如命名为
inference.py),把需要的预处理、后处理逻辑写进去。 - 创建Model时,用
source_dir参数指定存放该脚本的目录,不要直接覆盖entry_point。 - 确保脚本兼容JumpStart模型的输入输出格式。
3. 排查转换任务的依赖问题
注释entry_point后转换失败,大概率是缺少了自定义推理逻辑,导致模型无法处理转换任务的输入。可以:
- 检查转换任务的输入数据格式是否符合JumpStart模型的默认要求。
- 如果确实需要自定义逻辑,就按上面的方法通过
source_dir添加脚本,同时保证Pipeline角色能访问脚本所在的S3路径。
4. 用自定义S3桶存储代码包
如果必须使用自定义推理代码,可配置系统将代码包上传到你自己的S3桶,避开JumpStart的官方缓存桶:
- 创建Model时,用
model_data参数指向你自己的模型包,或者通过output_path指定自己的S3路径。
内容的提问来源于stack exchange,提问作者Mai Nguyen
相关产品推荐
相关产品推荐

