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

使用Docker镜像部署AWS Lambda函数遇模块导入问题求助

解决Docker部署AWS Lambda时的模块导入错误问题

问题核心

你的Dockerfile将src目录下的内容直接复制到${LAMBDA_TASK_ROOT},导致Lambda运行时无法识别src作为Python模块,从而抛出No module named 'src'的错误。

两种可行解决方案

方案1:保留src模块结构

修改Dockerfile中的COPY命令,将整个src目录完整复制到${LAMBDA_TASK_ROOT}下,而非仅复制目录内的文件:

FROM public.ecr.aws/lambda/python:3.8

# 将整个src目录复制到Lambda任务根目录下的src文件夹
COPY src ${LAMBDA_TASK_ROOT}/src
COPY requirements.txt ${LAMBDA_TASK_ROOT}

RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

WORKDIR ${LAMBDA_TASK_ROOT}

# 保持原CMD路径,此时src是合法的Python模块
CMD [ "src.main.handler" ]

这种方案无需修改代码中的导入语句,src模块结构被完整保留,代码内from src.xxx import xxx这类导入可正常工作。

方案2:移除src模块前缀

如果不需要保留src作为模块前缀,可将src内的所有文件直接复制到${LAMBDA_TASK_ROOT}根目录,同时调整CMD和代码导入路径:

  1. 修改Dockerfile:
FROM public.ecr.aws/lambda/python:3.8

# 将src目录内的所有文件复制到Lambda任务根目录
COPY src/* ${LAMBDA_TASK_ROOT}/
COPY requirements.txt ${LAMBDA_TASK_ROOT}

RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

WORKDIR ${LAMBDA_TASK_ROOT}

# CMD直接引用main.handler,无需src前缀
CMD [ "main.handler" ]
  1. 调整代码导入语句:
    将所有from src.aws.ssm import xxx这类导入改为from aws.ssm import xxx,此时aws、db等子模块直接位于Python的sys.path路径下。

原因说明

AWS Lambda的Python运行时会将${LAMBDA_TASK_ROOT}加入Python的sys.path。仅复制src内的文件到根目录时,src本身不存在于该路径下,无法作为模块被导入;只有当src目录完整存在于${LAMBDA_TASK_ROOT}下且包含__init__.py文件时,它才会被识别为合法的Python包。

内容的提问来源于stack exchange,提问作者Ben Muller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 08:27:39