AWS Lambda Python的FileNotFoundError问题:本地与Lambda路径差异
解决本地Windows与AWS Lambda的S3文件路径兼容问题
我之前也踩过这个跨环境路径的坑,太懂这种本地跑正常、部署到Lambda就报错的憋屈感了!咱们一步步来解决:
问题根源拆解
- 临时文件路径差异:Windows本地用
os.path.join('tmp', file_name)生成的是tmp\filename(相对当前目录的tmp文件夹),而Lambda运行在Linux环境,它的临时目录是绝对路径/tmp,相对路径的tmp在Lambda里会找不到。 - S3对象键的前导斜杠问题:S3的对象键本质上没有“根目录”的概念,前导斜杠
/会被当作键的一部分。本地能识别不带前导斜杠的键(比如folder/file.txt),但如果Lambda环境中传入的键带了前导斜杠(比如/folder/file.txt),就会匹配不到正确的S3对象,反过来也一样。
兼容双环境的解决方案
1. 统一临时文件路径处理
放弃手动写tmp,改用跨平台的临时目录获取方式,不管是Windows还是Lambda都能自动适配:
import tempfile import os # 获取当前环境的默认临时目录 temp_dir = tempfile.gettempdir() # 生成正确的临时文件路径 new_file_path = os.path.join(temp_dir, file_name)
- Windows下,
tempfile.gettempdir()会返回系统临时目录(比如C:\Users\你的用户名\AppData\Local\Temp) - Lambda下,它会自动指向
/tmp目录,完美适配。
如果你坚持要在本地用当前目录下的tmp文件夹,也可以加个环境判断:
def is_lambda_env(): # 通过环境变量判断是否在Lambda中运行 return os.environ.get('AWS_EXECUTION_ENV') is not None if is_lambda_env(): temp_dir = '/tmp' else: temp_dir = 'tmp' # 确保本地tmp文件夹存在,避免创建失败 os.makedirs(temp_dir, exist_ok=True) new_file_path = os.path.join(temp_dir, file_name)
2. 标准化S3对象键
不管传入的file_key带不带前导斜杠,都统一处理成S3能识别的格式:
# 移除所有前导斜杠,确保键格式正确 normalized_file_key = file_key.lstrip('/')
这样不管本地测试时用的是folder/file.txt,还是Lambda触发时传入的/folder/file.txt,都会被转换成正确的对象键,避免找不到文件的问题。
完整兼容代码
把上面的逻辑整合起来,就是能在双环境正常运行的代码:
import boto3 import os import tempfile def download_s3_file(file_key, file_name): # 标准化S3对象键,移除多余前导斜杠 normalized_file_key = file_key.lstrip('/') # 获取跨环境兼容的临时目录 temp_dir = tempfile.gettempdir() new_file_path = os.path.join(temp_dir, file_name) # 初始化S3资源并下载文件 s3 = boto3.resource('s3') s3.Bucket('bucketname').download_file(normalized_file_key, new_file_path) return new_file_path
额外提醒
- 永远不要依赖S3对象键的前导斜杠!S3不是文件系统,
/folder/file.txt和folder/file.txt是两个完全不同的对象键。 - Lambda的
/tmp目录有空间限制(目前是10GB),下载大文件时要注意容量。
内容的提问来源于stack exchange,提问作者TravisVOX
相关产品推荐
相关产品推荐

