AWS Lambda Python 3.11:无法导入 lxml:libxslt.so.1:无法打开共享对象文件:没有这样的文件或目录

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

我在 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

python amazon-web-services lambda arm lxml
1个回答
0
投票

如果您想避免分层,您可以为您的应用程序创建一个包含所有依赖项的 .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 二进制文件,则需要构建一个)。

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