无法在aws lambda上导入lxml etree

0

【以下的问题经过翻译处理】 { "errorMessage": "Unable to import module 'lambda_function': cannot import name 'etree' from 'lxml' (/var/task/lxml/init.py)", "errorType": "Runtime.ImportModuleError" } 也尝试了 https://gist.github.com/allen-munsch/ad8faf9c04b72aa8d0808fa8953bc639:

{ "errorMessage": "Unable to import module 'lambda_function': cannot import name 'etree' from 'lxml' (/var/task/lxml-4.3.4-py3.6-linux-x86_64.egg/lxml/init.py)", "errorType": "Runtime.ImportModuleError" }

我在本地电脑上用的是Ubuntu 18.04,尝试使用了在EC2上的 Amazon Linux 镜像。 我也尝试了激活的虚拟环境

STATIC_DEPS=true pip3 install lxml --target ./package --upgrade --no-cache-dir
I have also tried copying the shared object files based on pulling which files were opened when running the script with strace:

#! /bin/bash

export Z=$(pwd)/ok-daily-lambda.zip
rm $Z
zip $Z lambda_function.py
zip $Z init.py

for dir in $(find venv_here/lib/python3.6/site-packages)
do
if [ -d $dir ] ; then
pushd $dir
echo zip -r9 $Z $(pwd)
zip -r9 $Z $(pwd)
popd
fi
done

export LIBD=$(pwd)/lib
mkdir -p $LIBD

cp "/home/jmunsch/.local/lib/python3.6/site-packages/.libs_cffi_backend/libffi-d78936b1.so.6.0.4" $LIBD
cp "/lib/x86_64-linux-gnu/libbz2.so.1.0" $LIBD
cp "/lib/x86_64-linux-gnu/libc.so.6" $LIBD
cp "/lib/x86_64-linux-gnu/libdl.so.2" $LIBD
cp "/lib/x86_64-linux-gnu/libexpat.so.1" $LIBD
cp "/lib/x86_64-linux-gnu/libgcc_s.so.1" $LIBD
cp "/lib/x86_64-linux-gnu/liblzma.so.5" $LIBD
cp "/lib/x86_64-linux-gnu/libm.so.6" $LIBD
cp "/lib/x86_64-linux-gnu/libnss_dns.so.2" $LIBD
cp "/lib/x86_64-linux-gnu/libnss_files.so.2" $LIBD
cp "/lib/x86_64-linux-gnu/libnss_mdns4_minimal.so.2" $LIBD
cp "/lib/x86_64-linux-gnu/libpthread.so.0" $LIBD
cp "/lib/x86_64-linux-gnu/libresolv.so.2" $LIBD
cp "/lib/x86_64-linux-gnu/librt.so.1" $LIBD
cp "/lib/x86_64-linux-gnu/libtinfo.so.5" $LIBD
cp "/lib/x86_64-linux-gnu/libudev.so.1" $LIBD
cp "/lib/x86_64-linux-gnu/libutil.so.1" $LIBD
cp "/lib/x86_64-linux-gnu/libuuid.so.1" $LIBD
cp "/lib/x86_64-linux-gnu/libz.so.1" $LIBD
cp "/usr/lib/x86_64-linux-gnu/libapt-pkg.so.5.0" $LIBD
cp "/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1" $LIBD
cp "/usr/lib/x86_64-linux-gnu/libffi.so.6" $LIBD
cp "/usr/lib/x86_64-linux-gnu/liblz4.so.1" $LIBD
cp "/usr/lib/x86_64-linux-gnu/libmpdec.so.2" $LIBD
cp "/usr/lib/x86_64-linux-gnu/libssl.so.1.1" $LIBD
cp "/usr/lib/x86_64-linux-gnu/libstdc++.so.6" $LIBD
cp "/usr/lib/x86_64-linux-gnu/libzstd.so.1" $LIBD

zip -r $Z $LIBD

AWS_ACCESS_KEY_ID="xxx" AWS_SECRET_ACCESS_KEY="xxx" AWS_DEFAULT_REGION="us-east-1" aws lambda update-function-code --function-name ok-today --zip-file fileb://ok-daily-lambda.zip

这是我最近的 zip 文件目录 https://gist.github.com/allen-munsch/5ddc27873e64db6ff106ab828febf434

profile picture
专家
已提问 1 年前5 查看次数
1 回答
0

【以下的回答经过翻译处理】 有一些模块不能直接添加到site-packages目录中,供AWS Lambda环境中识别。当发生这种情况时,您必须从Docker存储库获取Amazon Linux镜像,并创建自己的编译环境,以在运行在AWS Lambda上的容器版本中运行。

例如,如果您要使用Python 3.6,那么一个好的选择是amazonlinux:2018.03,以防您想安装其他软件包,如pandas,numpy,scipy。

docker run -v $(pwd):/outputs -it amazonlinux:2018.03  

由于Amazon Linux基于Red Hat,因此在运行docker并已经创建了虚拟环境时,必须通过yum安装所有依赖项。

yum update -y  
yum install -y \  
  python36 \  
  python36-devel \  
  python36-virtualenv \  
  python34-setuptools \  
  gcc \  
  gcc-c++ \  
  findutils \  
  rsync \  
  Cython \  
  findutils \  
  which \  
  gzip \  
  tar \  
  man-pages \  
  man \  
  wget \  
  make \  
  zip  

对于lxml,您还需要安装以下内容:

(lambda_docker) bash-4.2# yum install libxml2  
...  
(lambda_docker) bash-4.2# yum install libxslt  
...  

您可以像往常一样安装模块:

pip3.6 install lxml  

然后,创建您的函数lambda_function.py,并将其添加到您的docker会话中的zipped package pushd-ed和popd-ed中。

from lxml import etree  

def lambda_handler(event, context):  
    print(__name__)  
    print(etree.LXML_VERSION)  

在创建之后:

zip -g site-packages.zip lambda_function.py  

上传之前,您可以检查您的zip文件是否包含lxml目录。

\[jonathan@docker lambda_docker]$ unzip -l site-packages.zip   
Archive:  site-packages.zip  
  Length      Date    Time    Name  
---------  ---------- -----   ----  
        0  06-29-2019 23:09   __pycache__/  
      277  06-29-2019 23:09   __pycache__/easy_install.cpython-36.pyc  
      126  06-29-2019 23:09   easy_install.py  
      119  06-29-2019 23:29   lambda_function.py  
        0  06-29-2019 23:21   lib/  
        0  06-29-2019 23:39   lxml/  
        0  06-29-2019 23:37   lxml-4.3.4.dist-info/  
        4  06-29-2019 23:37   lxml-4.3.4.dist-info/INSTALLER  
     2954  06-29-2019 23:37   lxml-4.3.4.dist-info/METADATA  
    13384  06-29-2019 23:37   lxml-4.3.4.dist-info/RECORD  
      109  06-29-2019 23:37   lxml-4.3.4.dist-info/WHEEL  
        5  06-29-2019 23:37   lxml-4.3.4.dist-info/top_level.txt  
     7668  06-29-2019 23:37   lxml/ElementInclude.py  
      551  06-29-2019 23:37   lxml/__init__.py  
        0  06-29-2019 23:37   lxml/__pycache__/  
     3331  06-29-2019 23:37   lxml/__pycache__/ElementInclude.cpython-36.pyc  
...  

然后上传zip文件,在lambda中创建一个空的测试 {}.
结果如下

START RequestId: bb240a17-c2dd-4d63-92c8-fa7561c09f64 Version: $LATEST  
lambda_function  
(4, 3, 4, 0)  
END RequestId: bb240a17-c2dd-4d63-92c8-fa7561c09f64  
REPORT RequestId: bb240a17-c2dd-4d63-92c8-fa7561c09f64  Duration: 0.30 ms   Billed Duration: 100 ms 
profile picture
专家
已回答 1 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则