You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:12:47