如何将Lambda的Event信息传递至SageMaker笔记本实例的LCC?
解决方案:将Lambda Event信息传递给SageMaker笔记本生命周期配置(LCC)
以下是三种可行的实现方案,均无需修改start_notebook_instance调用逻辑,且能稳定传递event中的S3存储桶/文件信息到LCC:
方案一:使用AWS Systems Manager Parameter Store传递参数
通过Lambda将event信息写入SSM参数存储,再让LCC脚本读取该参数。
1. 修改Lambda代码
import boto3 def lambda_handler(event, context): # 从event中提取S3信息 s3_bucket = event['s3_bucket'] s3_key = event['s3_key'] # 将参数写入SSM Parameter Store ssm_client = boto3.client('ssm') param_name = '/sagemaker/experiment/s3_input_params' ssm_client.put_parameter( Name=param_name, Value=f"{s3_bucket}|{s3_key}", Type='String', Overwrite=True ) # 启动SageMaker笔记本实例 sagemaker_client = boto3.client('sagemaker') sagemaker_client.start_notebook_instance(NotebookInstanceName='experiment') return 0
2. 配置LCC启动脚本
在笔记本的生命周期配置中添加启动脚本,读取SSM参数并写入环境变量:
#!/bin/bash set -e # 从SSM读取参数 PARAM_VALUE=$(aws ssm get-parameter --name "/sagemaker/experiment/s3_input_params" --query "Parameter.Value" --output text) # 分割存储桶和文件路径 S3_BUCKET=$(echo $PARAM_VALUE | cut -d'|' -f1) S3_KEY=$(echo $PARAM_VALUE | cut -d'|' -f2) # 将参数写入笔记本环境变量(所有终端会话生效) echo "export S3_INPUT_BUCKET=$S3_BUCKET" >> /home/ec2-user/.bashrc echo "export S3_INPUT_KEY=$S3_KEY" >> /home/ec2-user/.bashrc # 可选:直接下载S3文件到笔记本目录 aws s3 cp s3://$S3_BUCKET/$S3_KEY /home/ec2-user/SageMaker/
3. 配置IAM权限
给SageMaker笔记本的IAM角色添加SSM读取权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:GetParameter", "Resource": "arn:aws:ssm:你的区域:你的账号ID:parameter/sagemaker/experiment/s3_input_params" } ] }
方案二:使用S3存储临时配置文件
Lambda将event信息写入S3临时文件,LCC脚本下载并解析该文件。
1. 修改Lambda代码
import boto3 import json def lambda_handler(event, context): s3_bucket = event['s3_bucket'] s3_key = event['s3_key'] # 构造配置数据 config_data = { "input_bucket": s3_bucket, "input_key": s3_key } # 将配置写入S3临时桶 temp_s3_client = boto3.client('s3') temp_bucket = "你的临时存储桶名称" temp_key = "sagemaker/experiment/temp_config.json" temp_s3_client.put_object( Bucket=temp_bucket, Key=temp_key, Body=json.dumps(config_data) ) # 启动笔记本实例 sagemaker_client = boto3.client('sagemaker') sagemaker_client.start_notebook_instance(NotebookInstanceName='experiment') return 0
2. 配置LCC启动脚本
#!/bin/bash set -e # 下载临时配置文件 aws s3 cp s3://你的临时存储桶名称/sagemaker/experiment/temp_config.json /tmp/config.json # 解析配置内容 S3_BUCKET=$(jq -r '.input_bucket' /tmp/config.json) S3_KEY=$(jq -r '.input_key' /tmp/config.json) # 写入环境变量 echo "export S3_INPUT_BUCKET=$S3_BUCKET" >> /home/ec2-user/.bashrc echo "export S3_INPUT_KEY=$S3_KEY" >> /home/ec2-user/.bashrc # 清理临时文件 rm /tmp/config.json
3. 配置IAM权限
给SageMaker角色添加访问临时S3桶的权限。
方案三:通过笔记本实例标签传递信息
Lambda给笔记本实例添加包含S3信息的标签,LCC脚本通过EC2元数据获取实例信息后读取标签。
1. 修改Lambda代码
import boto3 def lambda_handler(event, context): s3_bucket = event['s3_bucket'] s3_key = event['s3_key'] sagemaker_client = boto3.client('sagemaker') notebook_arn = f"arn:aws:sagemaker:你的区域:你的账号ID:notebook-instance/experiment" # 更新笔记本实例标签 sagemaker_client.add_tags( ResourceArn=notebook_arn, Tags=[ {'Key': 'S3Bucket', 'Value': s3_bucket}, {'Key': 'S3Key', 'Value': s3_key} ] ) # 启动实例 sagemaker_client.start_notebook_instance(NotebookInstanceName='experiment') return 0
2. 配置LCC启动脚本
#!/bin/bash set -e # 获取当前EC2实例ID INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) # 通过EC2实例ID关联到SageMaker笔记本ARN NOTEBOOK_ARN=$(aws sagemaker list-notebook-instances --filters "Name=InstanceInstanceId,Values=$INSTANCE_ID" --query "NotebookInstances[0].NotebookInstanceArn" --output text) # 读取标签信息 S3_BUCKET=$(aws sagemaker list-tags --resource-arn $NOTEBOOK_ARN --query "Tags[?Key=='S3Bucket'].Value" --output text) S3_KEY=$(aws sagemaker list-tags --resource-arn $NOTEBOOK_ARN --query "Tags[?Key=='S3Key'].Value" --output text) # 写入环境变量 echo "export S3_INPUT_BUCKET=$S3_BUCKET" >> /home/ec2-user/.bashrc echo "export S3_INPUT_KEY=$S3_KEY" >> /home/ec2-user/.bashrc
3. 配置IAM权限
给SageMaker角色添加list-notebook-instances和list-tags权限。
注意事项
- 并发处理:如果多个Lambda调用同时启动同一个实例,需注意参数/标签覆盖问题,可给参数名添加时间戳或实例唯一标识
- 资源清理:对于临时文件或SSM参数,可在LCC执行后删除,或给SSM参数设置过期时间
- 区域一致性:确保所有资源(Lambda、SageMaker、SSM、S3)处于同一AWS区域
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

