我几天来一直在尝试创建一个使用 psycopg2 的 AWS Lambda 函数。经过大量的教程和大量的试验和错误后,我有以下过程。
我从以下 Dockerfile 构建并运行一个 docker 容器:
FROM public.ecr.aws/lambda/python:3.12
# Setup
COPY requirements.txt .
RUN pip install --upgrade pip
RUN mkdir python
RUN dnf install -y zip
RUN dnf clean all
# Install prereqs for psycopg2. Info: https://www.psycopg.org/docs/install.html#install-from-source
RUN dnf -y install gcc
RUN dnf -y install python3-devel
RUN dnf -y install libpq-devel
# Install psycopg2 into newly created directory named 'python'
RUN pip install -r requirements.txt -t python
# Zip directory
RUN zip -r9 python.zip python
# Needed or it complains about entry point
ENTRYPOINT ["bash"]
然后我将
python.zip
从容器中复制出来,并将其作为层上传到 Lambda。 requirements.txt
的内容只是一行文字 psycopg2
。
当我在 Lambda 函数中尝试
import psycopg2
时,我得到以下结果:
{
"errorMessage": "Unable to import module 'main': No module named 'psycopg2._psycopg'",
"errorType": "Runtime.ImportModuleError",
"requestId": "0e68c374-83b9-4531-8ef7-26bf84cc3270",
"stackTrace": []
}
我解压了
python.zip
并找到了一个名为_psycopg.cpython-312-aarch64-linux-gnu.so
的文件。如果我将此文件重命名为 _psycopg.so
并重新上传为新图层,我会得到:
{
"errorMessage": "Unable to import module 'main': /opt/python/psycopg2/_psycopg.so: cannot open shared object file: No such file or directory",
"errorType": "Runtime.ImportModuleError",
"requestId": "e47dc97c-733d-4ecf-bf47-acf5d24be0a0",
"stackTrace": []
}
无论出于何种原因,AWS Lambda 似乎都无法处理这个 .so 文件,即使它可以在 Docker 容器上运行。我见过其他一些解决类似问题的 StackOverflow 问题,但没有一个很有帮助。许多答案建议使用 GitHub 上的库,例如 awslambda-psycopg2,这些库已有多年历史并且不支持最新的 python 版本。如果可能的话我想避免这种情况。我现在非常沮丧,非常感谢任何帮助。预先感谢!
免责声明:我是 AWS 和 Docker 的新手,所以如果我明显不知道自己在做什么,那就是原因。
编辑:我使用的是带有 M2 芯片的 macOS Sonoma 14.3
我也遇到过同样的问题。我尝试在requirements.txt中使用aws-psycopg2而不是psycopg2-binary,这解决了我的问题。
使用此链接了解更多信息。