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

AWS Lambda配置gspread层与依赖仍报No module named 'gspread'错误求助

问题:AWS Lambda层无法导入gspread等依赖模块

背景

  • 已安装并打包以下模块为AWS Lambda层:
    • google-api-python-client 2.73.0
    • gspread 5.7.2
    • boto3
    • google-auth 2.16.0
  • 运行Lambda函数时触发导入错误:

[ERROR] Runtime.ImportModuleError: Unable to import module 'a': No module named 'gspread'
Traceback (most recent call last)

  • 函数代码:
import io
import json
import csv
import boto3
import gspread
from google.oauth2.credentials import Credentials

def b(event, context):
    # 获取S3事件数据
    s3_event = event["Records"][0]["s3"]
    bucket_name = s3_event["bucket"]["name"]
    file_name = s3_event["object"]["key"]

    # 连接S3并获取CSV文件数据
    s3 = boto3.client('s3')
    csv_data = s3.get_object(Bucket=bucket_name, Key=file_name)["Body"].read().decode()

    # 将CSV数据转为列表
    csv_reader = csv.reader(csv_data.splitlines(), delimiter=',')
    csv_list = list(csv_reader)

    # 使用服务账号凭证认证Google Sheets API
    credentials = Credentials.from_service_account_file('/credentials.json')
    gc = gspread.authorize(credentials)
    # 连接目标表格
    sheet_id = 'redacted'
    sh = gc.open_by_key(sheet_id)
    worksheet = sh.get_worksheet(0)

    # 清空现有数据
    worksheet.clear()

    # 插入新数据
    cell_list = worksheet.range('A1:' + gspread.utils.rowcol_to_a1(len(csv_list), len(csv_list[0])))
    for i, val in enumerate(sum(csv_list, [])):
        cell_list[i].value = val
    worksheet.update_cells(cell_list)
    return {
        'statusCode': 200,
        'body': json.dumps('Data inserted successfully')
    }
  • 本地requirements.txt内容:
gspread
google-auth
google-auth-oauthlib
google-auth-httplib2
  • 异常细节:boto3可正常导入使用,但其他依赖均出现"找不到模块"的问题。

解决方案

1. 修正Lambda层的打包结构

AWS Lambda层要求依赖必须放在对应Python版本的子目录下,比如使用Python 3.9的话,路径为python/lib/python3.9/site-packages/。打包ZIP时需保留这个层级结构,不能直接把模块文件放在ZIP根目录。

正确打包步骤(以Python 3.9为例):

# 创建符合要求的目录结构
mkdir -p python/lib/python3.9/site-packages
# 进入目标目录安装依赖
cd python/lib/python3.9/site-packages
pip install gspread==5.7.2 google-api-python-client==2.73.0 google-auth==2.16.0 -t .
# 返回上级目录打包
cd ../../../..
zip -r layer.zip python/

2. 匹配Python版本

确保Lambda函数使用的Python版本,与打包层时安装依赖所用的Python版本完全一致(比如函数用3.10,打包时就用3.10环境安装),版本不匹配会导致模块无法被识别。

3. 确认层与函数的关联状态

在Lambda函数的配置页面,检查已创建的层是否正确添加到函数中,且层的状态为"活跃"。

4. 验证层的内容

将层的ZIP包下载解压,检查所有依赖是否都在python/lib/pythonX.X/site-packages/路径下,无遗漏或路径错误。

5. 关于boto3的特殊说明

boto3是AWS Lambda默认内置的SDK,即使不通过层或requirements.txt添加也能直接使用,因此它能正常导入不代表其他依赖的打包方式正确。

内容的提问来源于stack exchange,提问作者Michael Tanner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:55:24