You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用AWS Lambda执行S3中的Python脚本并传递参数

解决AWS Lambda执行S3中Python脚本并传递参数的问题

我之前在Lambda里执行S3存的Python脚本时也踩过类似的坑,给你两个亲测有效的方案,按需选择就行:

方案一:直接执行脚本内容(快速简便,适合简单脚本)

不用折腾模块导入,直接把脚本内容读出来用exec执行,还能直接把参数注入到脚本的运行环境里:

import boto3
import os

def lambda_handler(event, context):
    # 1. 从S3读取脚本内容
    s3 = boto3.client('s3')
    bucket_name = "你的存储桶名称"
    script_key = "脚本在S3的路径,比如scripts/myscript.py"
    
    response = s3.get_object(Bucket=bucket_name, Key=script_key)
    script_content = response['Body'].read().decode('utf-8')
    
    # 2. 准备要传递的参数(从环境变量或触发事件里取都可以)
    params = {
        "param1": os.environ.get("PARAM_1"),
        "param2": event.get("input_param")  # 也可以从Lambda触发事件里拿参数
    }
    
    # 3. 执行脚本,把参数注入到脚本的全局命名空间
    exec(script_content, globals(), params)
    
    return {"status": "success"}

注意:脚本里直接用param1param2就能拿到参数,比如脚本里写print(f"收到参数:{param1}")即可。

方案二:修正/tmp导入法(适合模块化脚本)

你之前复制到/tmp后导入失败,大概率是因为Lambda的默认sys.path不包含/tmp目录,把它添加进去就能正常导入了:

import boto3
import os
import sys

def lambda_handler(event, context):
    # 1. 把S3里的脚本下载到/tmp目录
    s3 = boto3.client('s3')
    bucket_name = "你的存储桶名称"
    script_key = "scripts/myscript.py"
    local_script_path = "/tmp/myscript.py"
    
    s3.download_file(bucket_name, script_key, local_script_path)
    
    # 2. 把/tmp添加到Python的模块搜索路径
    if '/tmp' not in sys.path:
        sys.path.append('/tmp')
    
    # 3. 导入脚本模块并调用函数传递参数
    import myscript  # 模块名就是脚本文件名(去掉.py后缀)
    
    # 假设你的脚本里定义了接收参数的main函数
    result = myscript.main(
        param1=os.environ.get("PARAM_1"),
        param2=event.get("input_param")
    )
    
    return {"status": "success", "result": result}

前提:你的脚本里要提前定义好可调用的函数,比如def main(param1, param2): ...,这样Lambda里能直接调用传参。

额外注意事项

  • 确保Lambda的IAM角色拥有S3的s3:GetObject权限,否则会无法读取脚本
  • Lambda的/tmp目录最大有512MB空间,足够存放大多数脚本
  • 如果脚本依赖额外的第三方包,需要把依赖包打包到Lambda层,或者和脚本一起传到S3后解压到/tmp并添加到sys.path

内容的提问来源于stack exchange,提问作者Javed

火山引擎 最新活动