SageMaker Processing无法读写S3数据问题排查求助
排查SageMaker管道Processor无法读写S3的问题
以下是针对性的排查步骤和解决方案:
1. 确认S3路径配置正确性
- 替换代码中的占位符路径:将
"s3_input_path_before_procssing"和"s3_output_path_after_processing"替换为完整的S3 URI,格式为s3://bucket-name/path/to/target/ - 注意路径末尾斜杠:如果目标是文件夹,必须添加末尾斜杠,避免SageMaker将文件误识别为文件夹名称
修正后的路径配置示例:
s3_input_path = "s3://your-bucket/input/joined-data/" s3_output_path = f"s3://your-bucket/output/processed-data/{market}/" parse_json_step = ProcessingStep( # ... 其他配置不变 inputs=[ ProcessingInput( source=s3_input_path, input_name="input", destination="/opt/ml/processing/data/common/joined-data", ), ], outputs=[ ProcessingOutput( source="/opt/ml/processing/data/common/joined-data-processed", output_name="joined_data_processed", destination=s3_output_path, ) ], )
2. 验证IAM角色权限细节
- 确认角色包含以下核心权限:
s3:GetObject、s3:ListBucket(读S3数据)s3:PutObject、s3:ListBucket(写S3数据)- 权限的资源范围需覆盖目标S3桶及路径(例如
arn:aws:s3:::your-bucket/*)
- 检查角色信任关系:确保信任策略允许
sagemaker.amazonaws.com作为可信实体,否则SageMaker无法扮演该角色访问S3 - 如果S3桶使用自定义KMS密钥加密,需额外添加KMS的
kms:GenerateDataKey和kms:Decrypt权限
3. 检查ProcessingOutput与脚本输出一致性
- 确认容器内的Python脚本确实将处理后的数据写入到
/opt/ml/processing/data/common/joined-data-processed路径下,且路径下存在非空文件 - 禁用缓存测试:临时移除
cache_config参数,避免缓存的旧结果干扰数据同步
4. 查看CloudWatch日志定位错误
- 进入AWS控制台SageMaker服务,找到对应的Processing Job,查看CloudWatch日志:
- 搜索
AccessDenied关键词,确认是否存在S3权限拒绝错误 - 查看容器内脚本日志,确认数据生成路径、文件数量是否符合预期
- 检查SageMaker数据同步阶段日志,是否有文件传输失败的提示
- 搜索
5. 验证容器内的身份与凭证
- 在容器脚本中添加代码,打印当前AWS身份信息,确认是否使用了指定的IAM角色:
import boto3 print(boto3.client('sts').get_caller_identity()) - 确认容器内已自动注入AWS临时凭证(SageMaker会将角色凭证写入容器环境变量或
~/.aws/credentials文件)
6. 检查S3桶策略
- 确认S3桶策略没有拒绝目标IAM角色的
PutObject/GetObject请求 - 如果桶开启了公共访问阻止,需确保IAM角色的访问不受该规则限制
内容的提问来源于stack exchange,提问作者Bharat Sharma
相关产品推荐
相关产品推荐

