AWS Lambda容器镜像报错:无法导入模块'app',请求排查帮助
解决Lambda Docker镜像的模块导入错误
我将Lambda函数打包为Docker镜像存储在ECR仓库中,该函数仅输出"Welcome",已配置为当S3存储桶有活动时触发。当我向S3上传文件时,Lambda虽被调用但报错:
[ERROR] Runtime.ImportModuleError: Unable to import module 'app': No module named 'app' Traceback (most recent call last):该错误可在AWS Lambda的CloudWatch日志中查看。
我的文件内容
app.py
import os import logging logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) logger.info('In app.py................................') def handler(event, context) -> None: logger.info('Inside handler....Welcome') logger.info("Iam from app.py") logger.info('event: ', event) logger.info('context: ', context)
Dockerfile
FROM public.ecr.aws/lambda/python:3.9 WORKDIR /var/task COPY . . RUN pip3 install --no-cache-dir \ --trusted-host pypi.org \ --trusted-host pypi.python.org \ --trusted-host files.pythonhosted.org \ --upgrade pip RUN pip3 install --no-cache-dir \ --trusted-host pypi.org \ --trusted-host pypi.python.org \ --trusted-host files.pythonhosted.org \ -r requirements.txt \ --target "${LAMBDA_TASK_ROOT}" CMD [ "app.handler" ]
requirements.txt
boto3>=1.24.1
问题排查与解决方法
确认文件复制完整性:本地构建镜像后,进入容器检查
/var/task目录下是否存在app.py:docker build -t lambda-test . docker run -it lambda-test /bin/bash ls /var/task如果没有
app.py,说明构建命令未在包含该文件的目录执行,导致COPY . .未正确复制文件。简化Dockerfile配置:官方Lambda Python镜像默认工作目录为
/var/task,LAMBDA_TASK_ROOT也指向该路径,可简化配置避免干扰:FROM public.ecr.aws/lambda/python:3.9 COPY . ${LAMBDA_TASK_ROOT} RUN pip3 install --no-cache-dir --upgrade pip && \ pip3 install --no-cache-dir -r requirements.txt --target "${LAMBDA_TASK_ROOT}" CMD [ "app.handler" ]检查文件权限与命名:确保
app.py文件名无拼写错误,且容器内文件权限允许Lambda读取:# 进入容器后执行 ls -l /var/task/app.py若权限不足,可在Dockerfile中添加权限设置:
RUN chmod 644 ${LAMBDA_TASK_ROOT}/app.py验证CMD指令准确性:确认
CMD [ "app.handler" ]中的模块名(app对应app.py)和函数名(handler)完全匹配,大小写一致。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

