如何使用 Poetry 在 Intel 机器上创建 AWS Graviton (ARM) Python Lambda

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

我正在尝试用 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+。

python python-poetry python-wheel aws-graviton
2个回答
0
投票

事实证明评论中的@DeepSpace和@phd是正确的。最直接的方法是使用 Docker。您甚至不需要

docker buildx
。以下是实现目标的两个简单步骤:

  1. 为构建器创建一个
    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"
  1. 使用此构建器创建
    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
构建我的包!


0
投票

您可以使用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

享受吧!

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