簡體   English   中英

AWS Lambda psycopg2 層

[英]AWS Lambda layer for psycopg2

我正在嘗試創建一個新的 lambda 層以使用 psycopg2 導入 zip 文件,因為該庫使我的部署 package 超過 3MB,而且我再也看不到 lambda function 中的內聯代碼。

我使用 Python 3.7 為以下 2 個案例創建了 lambda 層:

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

我將他們新創建的層添加到我的 lambda function 中。但是,在這兩種情況下,我的 lambda_function 都會拋出如下錯誤:{“errorMessage”:“無法導入模塊‘lambda_function’:沒有名為‘psycopg2’的模塊”,“errorType” : "Runtime.ImportModuleError" }

該錯誤似乎是我的 zip 文件出現問題,無法識別它們。 但是當它在我的部署中運行良好時 package。

任何幫助或理由將不勝感激。 謝謝!

不確定 OP 是否找到了解決方案,但萬一其他人降落在這里。 我使用以下步驟解決了這個問題:

  1. https://github.com/jkehler/awslambda-psycopg2下載代碼/克隆 git
  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

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

對我來說效果很好。 只是

pip install --target./python psycopg2-binary

zip -r python.zip python

psycopg2 的維護者不建議使用psycopg2-binary ,因為它帶有鏈接的libpqlibssl以及在某些情況下可能會導致生產問題的其他內容。

我可以想象這是升級 postgresql 服務器時的問題,而捆綁的libpq不兼容。 我在 arm64 環境中運行的 AWS Lambda 上也遇到了psycopg2-binary的問題。

我已經使用public.ecr.aws/lambda/python:3.9作為基礎鏡像在linux/arm64平台上運行的 Docker 中構建postgresqlpsycopg

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平台。 只需在Prepare psycopg2步驟中將路徑更改為 x86_64 版本。

#!/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

其中$BUNDLE是已經存在的.zip 文件的路徑。

我還嘗試靜態構建 psycopg2 二進制文件並鏈接libpq.a ,但是,我遇到了很多缺少符號的問題。

從 AWS 帖子如何將帶有編譯二進制文件的 Python 包添加到我的部署 package 並使 package 與 Lambda 兼容? :

要創建 Lambda 部署 package 或與 Lambda Python 運行時兼容的層,當在 Linux 操作系統之外使用 pip 時,運行 88133444 value20 install the manylinux2014 --platform parameter --linux 命令

pip install \
    --platform manylinux2014_x86_64 \
    --target=my-lambda-function \
    --implementation cp \
    --python 3.9 \
    --only-binary=:all: --upgrade \
    psycopg2-binary

然后你可以 zip 目錄my-lambda-function的內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM