我正在尝试创建一个新的 lambda 层以使用 psycopg2 导入 zip 文件,因为该库使我的部署包超过 3MB,并且我再也看不到 lambda 函数中的内联代码。
我使用 Python 3.7 为以下 2 种情况创建了 lambda 层:
我将他们新创建的层添加到我的 lambda 函数中。 但是,在这两种情况下,我的 lambda_function 都会抛出错误,如下所示: { "errorMessage": "无法导入模块 'lambda_function': 没有名为 'psycopg2' 的模块", “错误类型”:“运行时.ImportModuleError” }
该错误似乎是我的 zip 文件出了问题,无法识别它们。但是当它在我的部署包中运行良好时。
任何帮助或理由将不胜感激。谢谢!
不确定OP是否找到了解决方案,但以防其他人登陆这里。我使用以下步骤解决了这个问题:
mkdir -p python/lib/python3.7/site-packages/psycopg2
cp psycopg2-3.7/* python/lib/python3.7/site-packages/psycopg2
zip -r9 psycopg2-py37.zip python
如果您在 >= 2022 年进入此页面。使用官方 psycopg2-binary https://pypi.org/project/psycopg2-binary/
对我来说效果很好。只是
pip install --target ./python psycopg2-binary
zip -r python.zip python
psycopg2 的维护者不建议使用
psycopg2-binary
,因为它带有链接的 libpq
和 libssl
以及其他可能在某些情况下导致生产问题的内容。
我可能会想象这是升级 postgresql 服务器时的一个问题,而捆绑的
libpq
不兼容。我在arm64环境中运行的AWS Lambda也遇到了问题。我使用 psycopg2-binary
作为基础镜像,在
postgresql
平台上运行的 Docker 中构建 psycopg
和 linux/arm64
。public.ecr.aws/lambda/python:3.9
构建脚本如下,适用于
FROM public.ecr.aws/lambda/python:3.9
RUN yum -y update && \
yum -y upgrade && \
yum -y install libffi-devel postgresql-devel postgresql-libs zip rsync wget openssl openssl-devel && \
yum -y groupinstall "development tools" && \
pip install pipenv
ENTRYPOINT ["/bin/bash"]
平台。只需在
aarch64
步骤中将路径更改为 x86_64 版本即可。Prepare psycopg2
其中
#!/usr/bin/env bash
set -e
PG_VERSION="14.5"
cd "$TERRAFORM_ROOT"
if [ ! -f "postgresql-$PG_VERSION.tar.bz2" ]; then
wget "https://ftp.postgresql.org/pub/source/v$PG_VERSION/postgresql-$PG_VERSION.tar.bz2"
tar -xf "$(pwd)/postgresql-$PG_VERSION.tar.bz2"
fi
if [ ! -d "psycopg2" ]; then
git clone https://github.com/psycopg/psycopg2.git
fi
# Build postgres
cd "$TERRAFORM_ROOT/postgresql-$PG_VERSION"
./configure --without-readline --without-zlib
make
make install
# Build psycopg2
cd "$TERRAFORM_ROOT/psycopg2"
make clean
python setup.py build_ext \
--pg-config "$TERRAFORM_ROOT/postgresql-14.5/src/bin/pg_config/pg_config"
# Prepare psycopg2
cd build/lib.linux-aarch64-3.9
mkdir -p python/
cp -r psycopg2 python/
zip -9 -r "$BUNDLE" ./python
# Prepare libpq
cd "$TERRAFORM_ROOT/postgresql-$PG_VERSION/src/interfaces/libpq/"
mkdir -p lib/
cp libpq.so.5 lib/
zip -9 -r "$BUNDLE" ./lib
是现有 .zip 文件的路径。
我还尝试静态构建 psycopg2 二进制文件并链接$BUNDLE
,但是,我遇到了很多缺少符号的问题。
libpq.a
作为
参数的值。manylinux2014
--platform
然后您可以压缩目录的内容
pip install \
--platform manylinux2014_x86_64 \
--target=my-lambda-function \
--implementation cp \
--python 3.9 \
--only-binary=:all: --upgrade \
psycopg2-binary
将pip install创建的3个目录放入./python/lib/python3.9/site-packages/
如果您使用
terraform-aws-modules/lambda/aws 模块来构建层,
在requirements.txt中使用my-lambda-function
aws-psycopg2
requirements.txt 将具有依赖项。
docker run --platform linux/amd64 -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.10" /bin/sh -c "pip install -r requirements.txt -t python/; exit"
它将在 Python 文件夹内构建依赖项,您可以手动压缩和上传或使用 aws cli 命令
psycopg2-binary