使用 Python 为 AWS Lambda 构建 Docker 容器时导入模块错误

tom*_*tom 6 python amazon-web-services docker aws-lambda

我正在尝试构建一个在 AWS Lambda 上运行 Python 代码的 Docker 容器。构建工作正常,但是当我测试我的代码时,出现以下错误:

{"errorMessage": "Unable to import module 'function': No module named 'utils'", "errorType": "Runtime.ImportModuleError", "stackTrace": []}
Run Code Online (Sandbox Code Playgroud)

我的文件夹中基本上有两个 python 脚本,function.py 和 utils.py,我从 utils.py 导入一些函数并在 function.py 中使用它们。

在本地,一切正常,但是当我构建容器并使用以下curl命令对其进行测试时,出现上述错误。测试curl命令:

curl --request POST \
  --url http://localhost:9000/2015-03-31/functions/function/invocations \
  --header 'Content-Type: application/json' \
  --data '{"Input": 4}'
Run Code Online (Sandbox Code Playgroud)

这是我的 dockerfile:

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

WORKDIR /

COPY . .

COPY function.py ${LAMBDA_TASK_ROOT}

COPY requirements.txt .

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

CMD [ "function.lambda_handler" ]
Run Code Online (Sandbox Code Playgroud)

我在相关的Stackoverflow问题中读到的是尝试以另一种方式从utils.py导入函数,我尝试更改为from utils import *from .utils import all我更改了Dockerfile中的WORKDIR,并将utils文件放在单独的utils文件夹中并尝试导入这边走:from utils.utils import *。我还尝试过在 Python 3.8 中运行代码。

这是我的文件夹结构:这是我的文件夹结构

有谁知道我做错了什么?

Unb*_*ess 2

Dockerfile 语句COPY . .将所有文件复制到工作目录,给定您之前的WORKDIR, 是/.

要解决Python导入问题,您需要将Python模块移动到正确的目录:

COPY utils.py ${LAMBDA_TASK_ROOT}
Run Code Online (Sandbox Code Playgroud)