如何在Lambda函数中运行S3存储的Python代码及报错排查
问题根因
你当前的实现逻辑存在多处错误,无法正常运行:
boto3的S3客户端未初始化,代码中直接使用未定义的s3变量本身就会触发运行错误s3.download_file()方法的作用是将S3文件下载到本地路径,该方法没有返回值(固定返回None),你对None值调用xyz()方法,就是当前报错的直接原因- S3对象路径书写错误,你上传的脚本存放在
scripts/目录下,代码中写的script/test2.py缺少尾缀s,无法匹配到S3上的实际文件 - 仅下载
test2.py不够,该脚本依赖test1.py,缺少依赖文件时导入模块会失败 - Lambda运行时默认不会把
/tmp目录加入Python模块搜索路径,就算文件下载完成,直接导入也会找不到对应模块 - 下载到本地的
.py文件不会自动转为可调用的Python模块对象,需要手动触发导入逻辑才能调用内部函数
正确实现代码
按照以下逻辑修改Lambda代码即可正常运行:
import boto3 import sys # 初始化S3客户端 s3 = boto3.client("s3") # 将/tmp目录加入Python模块搜索路径 sys.path.append("/tmp") def lambda_handler(event, context): # 下载所有依赖的脚本文件到/tmp目录,注意修正S3路径为scripts/ s3.download_file("test_s3_bucket", "scripts/test1.py", "/tmp/test1.py") s3.download_file("test_s3_bucket", "scripts/test2.py", "/tmp/test2.py") # 导入已下载的test2模块 import test2 # 调用目标函数并返回结果 return test2.xyz()
配置提醒:需要给Lambda执行角色绑定目标S3桶的
s3:GetObject权限,否则会触发权限拒绝错误。如果脚本体量小、更新不频繁,更推荐把所有Python脚本直接和Lambda代码打包部署,或者制作成Lambda层挂载,省去每次运行时下载文件的开销,执行效率更高。
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

