psycopg2 的 AWS Lambda 层

问题描述 投票:0回答:6

我正在尝试创建一个新的 lambda 层以使用 psycopg2 导入 zip 文件,因为该库使我的部署包超过 3MB,并且我再也看不到 lambda 函数中的内联代码。

我使用 Python 3.7 为以下 2 种情况创建了 lambda 层:

  • psycopg2_lib.zip(包含 psycopg2、psycopg2_binary.libs 和 psycopg2_binary-2.8.5.dist-info 文件夹)
  • psycopg2_only.zip 仅包含 psycopg2 文件夹。

我将他们新创建的层添加到我的 lambda 函数中。 但是,在这两种情况下,我的 lambda_function 都会抛出错误,如下所示: { "errorMessage": "无法导入模块 'lambda_function': 没有名为 'psycopg2' 的模块", “错误类型”:“运行时.ImportModuleError” }

该错误似乎是我的 zip 文件出了问题,无法识别它们。但是当它在我的部署包中运行良好时。

任何帮助或理由将不胜感激。谢谢!

aws-lambda python-3.7 psycopg2 aws-lambda-layers
6个回答
18
投票

不确定OP是否找到了解决方案,但以防其他人登陆这里。我使用以下步骤解决了这个问题:

  1. 从以下位置下载代码/克隆 git: https://github.com/jkehler/awslambda-psycopg2
  2. 如果是为 python3.7 构建,则创建以下目录树,否则将“python3.7”替换为版本选择:
    mkdir -p python/lib/python3.7/site-packages/psycopg2
  3. 选择感兴趣的Python版本,并将步骤1中下载的文件夹中的文件复制到步骤2中的目录树中。如果为 python 3.7 构建一个层:
    cp psycopg2-3.7/* python/lib/python3.7/site-packages/psycopg2
  4. 为图层创建 zip 文件。例如:
    zip -r9 psycopg2-py37.zip python
  5. 在控制台或 cli 中创建图层并上传 zip

9
投票

如果您在 >= 2022 年进入此页面。使用官方 psycopg2-binary https://pypi.org/project/psycopg2-binary/

对我来说效果很好。只是

pip install --target ./python psycopg2-binary

zip -r python.zip python


6
投票

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

,但是,我遇到了很多缺少符号的问题。

    


3
投票
如何将带有已编译二进制文件的 Python 包添加到我的部署包中并使该包与 Lambda 兼容?

:

要在 Linux 操作系统之外使用 pip 时创建与 Lambda Python 运行时兼容的 Lambda 部署包或层,请运行 pip install 命令并使用
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

    


3
投票

将pip install创建的3个目录放入./python/lib/python3.9/site-packages/
  • 将 psycopg2 目录中的 .so 文件重命名为 _psycopg.so
  • 然后压缩./python目录的内容


0
投票

如果您使用

terraform-aws-modules/lambda/aws

模块来构建层, 在requirements.txt中使用my-lambda-function


如果您在本地构建层并手动上传它们,那么您可以使用 docker 构建它们

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

	
© www.soinside.com 2019 - 2024. All rights reserved.