Khu*_*yen 0 psycopg2 aws-lambda python-3.7 aws-lambda-layers
我正在尝试创建一个新的 lambda 层以使用 psycopg2 导入 zip 文件,因为该库使我的部署包超过 3MB,而且我再也看不到 lambda 函数中的内联代码。
我使用 Python 3.7 为以下两种情况创建了 lambda 层:
我将他们新创建的层添加到我的 lambda 函数中。但是,在这两种情况下,我的 lambda_function 都会抛出如下错误:{ "errorMessage": "Unable to import module 'lambda_function': No module named 'psycopg2'", "errorType": "Runtime.ImportModuleError" }
该错误似乎是我的 zip 文件出了问题,无法识别。但是当它在我的部署包中运行良好时。
任何帮助或理由都会非常有用。谢谢!
小智 9
如果您在 >= 2022 年进入此页面。使用官方 psycopg2-binary https://pypi.org/project/psycopg2-binary/
对我来说效果很好。只是
pip install --target ./python psycopg2-binary
zip -r python.zip python
psycopg2 的维护者不建议使用,psycopg2-binary因为它带有 linkedlibpq和libssl其他可能在某些情况下导致生产问题的内容。
我可能会想象这是一个问题,当升级 postgresql 服务器时捆绑libpq不兼容。我在arm64环境中运行的AWS Lambda也遇到了问题psycopg2-binary。
我已经采取了构建postgresql并psycopg在 Docker 中运行的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"]
Run Code Online (Sandbox Code Playgroud)
构建脚本如下并且对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
Run Code Online (Sandbox Code Playgroud)
其中$BUNDLE是现有 .zip 文件的路径。
我还尝试静态构建 psycopg2 二进制文件和链接libpq.a,但是,我遇到了很多缺少符号的问题。
小智 5
不确定 OP 是否找到了解决方案,但以防其他人降落在这里。我使用以下步骤解决了这个问题:
mkdir -p python/lib/python3.7/site-packages/psycopg2cp psycopg2-3.7/* python/lib/python3.7/site-packages/psycopg2zip -r9 psycopg2-py37.zip python| 归档时间: |
|
| 查看次数: |
1893 次 |
| 最近记录: |