我正在尝试用 Poetry 构建一个 Python Lambda。我的功能取决于
psycopg2
。该库又依赖于平台二进制文件:libpq
。因此,我需要将其捆绑到我的发行版(ZIP 文件)中。 PyPi 上有一个 psycopg2-binary 软件包,我相信它有我需要的轮子:psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
。 Python 版本 3.9,就像我的运行时一样,ARM 64 架构。它包含我需要的libpq
:
$ file psycopg2_binary.libs/libpq-33589b1f.so.5.15
psycopg2_binary.libs/libpq-33589b1f.so.5.15: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0874810fb70766ff96a80897579633a2ef7af60e, stripped
这绝对是我需要的。
我通过三个步骤构建我的诗歌功能:
poetry build
poetry run pip install --upgrade --target package dist/*.whl
cd package; zip -r ../distro.zip . -x '*.pyc'
问题是,当我安装
psycopg2-binary
(poetry add psycopg2-binary
) 时,它会安装 Intel 轮子(我的主机操作系统)。
我什至尝试下载我需要的轮子并安装它
poetry add ./psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
但是它给了我一个错误:
ERROR: psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl is not a supported wheel on this platform.
我尝试添加平台:
poetry add --platform=manylinux2014_aarch64 ./psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
但这什么也没做。它不会失败,也不会安装任何东西。
那么,如何在 Intel 上对 ARM 和 Poetry 进行交叉编译?
附注请不要建议使用 aws-psycopg2,它的
libpq
版本太低 (9) 而我需要 14+。
事实证明评论中的@DeepSpace和@phd是正确的。最直接的方法是使用 Docker。您甚至不需要
docker buildx
。以下是实现目标的两个简单步骤:
Dockerfile
:FROM --platform=arm64 python:3.9
RUN apt update && apt install -y zip
RUN curl -sSL https://install.python-poetry.org | python -
ENV PATH="/root/.local/bin:$PATH"
docker-compose.yml
:services:
builder:
platform: linux/arm64
build: .
volumes:
- ./:/lambda
working_dir: /lambda
我也有一个
Makefile
,但它是可选的。 Bash 脚本也可以。
clean:
rm -rf dist package neonbranch.zip
dist: lambda
poetry build
package: dist
poetry run pip install --upgrade --target package dist/*.whl
distro.zip: package
cd package; zip -r ../distro.zip . -x '*.pyc'
这很简单。
现在,运行
docker-compose up
来启动构建器。可能需要一段时间。
完成后,我可以使用
docker-compose run builder make distro.zip
构建我的包!
您可以使用poetry-plugin-lambda-build
为诗歌添加插件
poetry self add poetry-plugin-lambda-build
poetry self add poetry-plugin-export
配置 pyproject.toml 例如 AWS lambda 部署
[tool.poetry-plugin-lambda-build]
layer_artifact_path = "artifacts/layer.zip"
layer_install_dir = "python"
function_artifact_path = "artifacts/function.zip"
without = "dev"
运行以在容器中构建 zips
poetry build-lambda docker_image=public.ecr.aws/sam/build-python3.11:latest-arm64
如果您之前正在使用 M1 Mac 导出
DOCKER_HOST
export DOCKER_HOST=unix:///Users/$USER/.docker/run/docker.sock
插件应在提供的路径中生成结果
artifacts
├── function.zip
└── layer.zip
享受吧!