[英]AWS Lambda layer for psycopg2
我正在嘗試創建一個新的 lambda 層以使用 psycopg2 導入 zip 文件,因為該庫使我的部署 package 超過 3MB,而且我再也看不到 lambda function 中的內聯代碼。
我使用 Python 3.7 為以下 2 個案例創建了 lambda 層:
我將他們新創建的層添加到我的 lambda function 中。但是,在這兩種情況下,我的 lambda_function 都會拋出如下錯誤:{“errorMessage”:“無法導入模塊‘lambda_function’:沒有名為‘psycopg2’的模塊”,“errorType” : "Runtime.ImportModuleError" }
該錯誤似乎是我的 zip 文件出現問題,無法識別它們。 但是當它在我的部署中運行良好時 package。
任何幫助或理由將不勝感激。 謝謝!
不確定 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
的問題。
我已經使用public.ecr.aws/lambda/python:3.9
作為基礎鏡像在linux/arm64
平台上運行的 Docker 中構建postgresql
和psycopg
。
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.