使用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和代码导入路径:
- 修改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" ]
- 调整代码导入语句:
将所有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
相关产品推荐
相关产品推荐

