用于 psycopg2 的 AWS Lambda 层

Khu*_*yen 0 psycopg2 aws-lambda python-3.7 aws-lambda-layers

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

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

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

我将他们新创建的层添加到我的 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

  • 该文档说“二进制包是开发和测试的实用选择,但在生产中建议使用从源代码构建的包。”尽管他们没有解释这样做的原因。 (6认同)

Vla*_*ler 6

psycopg2 的维护者不建议使用,psycopg2-binary因为它带有 linkedlibpqlibssl其他可能在某些情况下导致生产问题的内容。

我可能会想象这是一个问题,当升级 postgresql 服务器时捆绑libpq不兼容。我在arm64环境中运行的AWS Lambda也遇到了问题psycopg2-binary

我已经采取了构建postgresqlpsycopg在 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 是否找到了解决方案,但以防其他人降落在这里。我使用以下步骤解决了这个问题:

  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