SageMaker中如何通过Lambda自动将S3路径参数传入Jupyter Notebook?
可以实现,以下是具体方案
1. 在Lambda中提取S3对象路径
当S3对象创建事件触发Lambda时,事件参数里包含了完整的桶名和对象Key,直接解析即可得到S3路径:
def lambda_handler(event, context): # 从触发事件中提取桶名和对象Key bucket = event['Records'][0]['s3']['bucket']['name'] object_key = event['Records'][0]['s3']['object']['key'] # 拼接成标准S3路径格式 s3_path = f"s3://{bucket}/{object_key}" # 后续执行Notebook的逻辑写在这里
2. 将S3路径传递给Jupyter Notebook
有两种实用的传递方式,按需选择:
方式一:用Papermill(推荐,专为参数化Notebook设计)
- 先在Lambda的执行环境中安装
papermill和jupyter依赖(可以打包成Lambda层,避免函数包体积过大) - 在你的源Notebook中,添加一个标记为
parameters的参数单元格:# parameters s3_path = "" # 这里会被papermill传入的参数覆盖 - 在Lambda中执行命令传递参数:
import subprocess subprocess.run([ "papermill", "/path/to/your/input_notebook.ipynb", "/path/to/output_notebook.ipynb", # 执行后的Notebook保存路径 "-p", "s3_path", s3_path ], check=True)
方式二:通过环境变量传递
- 在Lambda中设置环境变量,再执行Notebook:
import os import subprocess os.environ['S3_PATH'] = s3_path # 用nbconvert执行Notebook subprocess.run([ "jupyter", "nbconvert", "--execute", "/path/to/your/notebook.ipynb", "--to", "notebook", "--output", "/path/to/executed_notebook.ipynb" ], check=True) - 在Notebook中读取环境变量:
import os s3_path = os.environ.get('S3_PATH') # 后续业务逻辑直接使用s3_path即可
3. 注意事项
- 确保Lambda的IAM角色拥有访问目标S3桶的权限(读取触发对象、写入执行后的Notebook<如果需要>)
- 依赖包建议用Lambda层管理,避免函数包超过大小限制
- 如果Notebook需要处理S3对象,可直接用
s3_path结合boto3等工具操作
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

