Lambda连接S3报错:name 'boto3' is not defined 求助
Lambda连接S3时出现"boto3未定义"错误的解决方案
问题重现
你编写的Lambda代码如下:
import json import boto3 import io from io import StringIO import pandas as pd s3_client = boto3.client('s3') def lambda_handler(event, context): try: s3_Bucket_Name = "mybucket" s3_File_Name = "toconvert/abcd.xlsx" except Exception as err: print(err) # TODO implement return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
运行时触发以下错误:
Response { "errorMessage": "name 'boto3' is not defined", "errorType": "NameError", "requestId": "<RequestId>", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 5, in lambda_handler\n s3 = boto3.client('s3')\n" ] } Function Logs START RequestId: <RequestId> Version: $LATEST [ERROR] NameError: name 'boto3' is not defined Traceback (most recent call last): File "/var/task/lambda_function.py", line 5, in lambda_handler s3 = boto3.client('s3')END RequestId: <RequestId> REPORT RequestId: <RequestId> Duration: 13.35 ms Billed Duration: 14 ms Memory Size: 128 MB Max Memory Used: 33 MB Init Duration: 126.05 ms
原因分析
从错误栈可以看出,实际运行的代码中lambda_handler函数第5行调用了boto3.client('s3'),但这行代码并未出现在你提供的示例中,说明部署到Lambda的代码与本地编写的代码不一致。此外,虽然boto3是Lambda默认内置库,但自定义部署包的依赖冲突或打包错误,也会导致导入失败。
解决步骤
1. 核对部署代码一致性
- 检查上传到Lambda的代码,确保
import boto3语句位于代码最顶部,未被注释或遗漏。 - 确认
lambda_handler函数内的代码与本地编写的一致,避免出现未定义变量的情况。
2. 正确打包自定义依赖(针对pandas等第三方库)
由于你使用了Lambda默认不提供的pandas库,打包时需避免覆盖Lambda内置的boto3:
- 本地创建空文件夹,执行以下命令安装依赖(替换X.X为Lambda使用的Python版本,如3.9):
pip install pandas -t ./python/lib/pythonX.X/site-packages --no-deps - 将整个
python文件夹打包为zip文件,上传到Lambda作为部署包。
3. 使用Lambda层管理第三方依赖
用Lambda层隔离自定义依赖与Lambda内置库,避免冲突:
- 创建符合结构的文件夹:
python/lib/pythonX.X/site-packages(X.X为Python版本) - 在该路径下安装pandas:
pip install pandas -t ./python/lib/pythonX.X/site-packages - 将
python文件夹打包为zip,上传到Lambda层 - 在Lambda函数配置中添加该层
4. 匹配Python版本
确保Lambda函数配置的Python版本与本地开发环境一致,避免版本不兼容导致的导入问题。
内容的提问来源于stack exchange,提问作者user1318718
相关产品推荐
相关产品推荐

