如何用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"}
注意:脚本里直接用
param1、param2就能拿到参数,比如脚本里写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




