我在 AWS Lambda 上有一个依赖于
lxml
的 Python 函数。依赖层包含 poetry install lxml
的结果,但我在运行时收到以下错误:
"errorMessage": "Unable to import module 'app.dim.application.watchdog': libxslt.so.1: cannot open shared object file: No such file or directory",
我检查了Python 3.11基础镜像,它不包括
libxslt.so.1
:
docker run -ti --rm --entrypoint bash public.ecr.aws/lambda/python:3.11
如何包含包(如
lxml
)依赖的所有共享库?我可以对 pip
或 poetry
说他们应该将它们包含在已安装的软件包中吗?有选择地将每个共享库复制到一个层中是一场噩梦。
运行时:Python 3.11
架构:ARM64
如果您想避免分层,您可以为您的应用程序创建一个包含所有依赖项的 .zip 部署包。
您需要编写一个设置脚本(参考)来允许在本地构建您的包。
您还需要编写一个具有固定依赖项的需求文件(以确保可重现的构建)。
完成后(即,您可以从项目目录中执行
pip install .
),您可以使用以下 Makefile 打包所有内容:
PACKAGE_DIR = /tmp/YOUR_APP_NAME
PACKAGE_ZIP = your_app_name.zip
.PHONY: package
package:
rm -rf "${PACKAGE_DIR}"
mkdir -p "${PACKAGE_DIR}"
rm -f "${PACKAGE_DIR}/../${PACKAGE_ZIP}"
pip install \
--quiet \
--python-version "3.11" \
--platform "manylinux1_x86_64" \
--platform "manylinux_2_17_x86_64" \
--platform "manylinux_2_28_x86_64" \
--only-binary ":all:" \
--target "${PACKAGE_DIR}" \
-r "requirements/base.txt" \
.
(cd ${PACKAGE_DIR}; find ./ -type f -name '*.pyc' -delete && find ./ -type d -name '__pycache__' -delete;)
(cd ${PACKAGE_DIR}; zip -9 -q -r ../${PACKAGE_ZIP} .;)
make package
将生成适合上传到 Lambda 的 zip 文件。它更喜欢软件包的二进制版本,因此您可以在 Windows 或 Mac OS 上构建(尽管如果您的依赖项之一没有 Linux 二进制文件,则需要构建一个)。