2

我正在尝试使用 layers 将 pytidylib python 模块部署到 AWS lambda 函数中。我已经按照 aws 文档中的描述创建了路径并创建了新层。现在 pytidylib 的代码需要 /usr/lib 中的一些库,但我已经在 /python/lib/python3.7/site-packages/ 中安装了库,所以为了解决这个问题,我在 aws linux 服务器平台的 environ PATH 中添加了路径,但问题仍然没有解决。以下是我的代码:-

def lambda_handler(event, context):
"""Read  file from s3 on trigger."""
    s3 = boto3.client("s3")
    print(sys.platform)
    ld_library_path = os.environ["LD_LIBRARY_PATH"]
    print("old ld_library_path is ",ld_library_path)
    ld_library_path = ld_library_path + 
   ":/opt/python/lib/python3.7/site-packages/"
    os.environ["LD_LIBRARY_PATH"] = ld_library_path
    print("ld_library_path after set is 
    ",os.environ["LD_LIBRARY_PATH"])
  
ld_library_path after set is  /var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib:/opt/python/lib/python3.7/site-packages/

我想了解有什么方法可以通过代码中的一些更改来完成这项工作,并使 pytidylib 模块通过层运行。以下是错误:-

[ERROR] OSError: Could not load libtidy using any of these names: 
libtidy,libtidy.so,libtidy-0.99.so.0,cygtidy-0-99-0,tidylib,libtidy.dylib,tidy
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 68, in lambda_handler
document, errors = tidy_document(doc)
File "/opt/python/lib/python3.7/site-packages/tidylib/tidy.py", line 222, in tidy_document
return get_module_tidy().tidy_document(text, options)
File "/opt/python/lib/python3.7/site-packages/tidylib/tidy.py", line 234, in get_module_tidy
_tidy = Tidy()
File "/opt/python/lib/python3.7/site-packages/tidylib/tidy.py", line 99, in __init__
+ ",".join(lib_names))
4

2 回答 2

0

我试图复制 您的问题,对我来说,Pytidylib图层按预期工作。

这是我用来构建图层的方式,以防您想尝试一下。它涉及 最近的AWS 博客中描述的docker 工具

我创建Pytidylib图层如下:

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

  2. 转到文件夹并创建requirements.txt包含以下内容的文件

Pytidylib
  1. 运行以下 docker 命令(可以根据需要调整 python 版本):
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 -r pytidylayer.zip python > /dev/null
  1. pytidylayer.zip在 AWS 控制台中创建 lambda 层。不要忘记指定Compatible runtimesto python3.8

  2. 将图层添加到 lambda 并使用以下 lambda 函数进行测试:

import json
import  tidylib 

def lambda_handler(event, context):
    
    print(dir(tidylib))
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

该函数正确执行:

['PersistentTidy', 'Tidy', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'release_tidy_doc', 'sink', 'tidy', 'tidy_document', 'tidy_fragment']
于 2020-07-13T08:36:28.943 回答
0

我通过将 tidy 库 (libtidy.so.5.2.0) 的路径添加到 linux 服务器的 LD_LIBRARY_PATH 环境变量中解决了这个问题

对我来说,库预安装在 /usr/lib 的 ubuntu 18.04 服务器中。从此路径复制库,将其放在 tidylib 文件夹中创建一个 zip,然后按照 lambda-layers 创建的步骤操作。

于 2020-07-14T09:41:27.277 回答