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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:27:33