繁体   English   中英

如何从 AWS Lambda 上的预编译二进制文件导入 lxml?

[英]How to import lxml from precompiled binary on AWS Lambda?

我试图在 Python 中导入lxml库以执行 AWS Lambda function 但我收到以下错误: [ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'lxml' 为了解决这个问题,我遵循了这个SO answer 的建议,并使用了来自以下repo的预编译二进制文件。

我使用了那个 repo 中的lxml_amazon_binaries.zip文件,它具有以下结构:

 lxml_amazon_binaries
    ├── lxml
    └── usr

我将整个zip文件上传到 AWS Lambda 层,创建了一个新的 Lambda function,并使用简单from lxml import etree进行了测试,这导致了上述错误。

我是否正确上传/使用这些二进制文件? 我不确定是什么导致了错误。 使用不同的 Python 运行时没有帮助。

创建lxml层的最可靠方法是使用 Docker,如AWS 博客中所述。 具体来说,经过验证的步骤是(在 Linux 上执行,但只要你有 Docker,windows 也应该可以工作):

  1. 创建空文件夹,例如mylayer

  2. Go 到文件夹并创建内容为requirements.txt的文件

lxml
  1. 运行以下 docker 命令:

该命令将为 python3.8 创建层:

docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
  1. 将图层存档为 zip:
zip -9 -r mylayer.zip python 
  1. 在 AWS 控制台中基于mylayer.zip创建 lambda 层。 不要忘记为python3.8指定Compatible runtime

  2. 将步骤 5 中创建的图层添加到您的 function。

  3. 我使用您的代码测试了该层:

from lxml import etree

def lambda_handler(event, context):
    
    root = etree.Element("root")
    root.append( etree.Element("child1") )
    print(etree.tostring(root, pretty_print=True))

它工作正常

b'<root>\n  <child1/>\n</root>\n'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM