【问题标题】:Deploy Pytidylib module in aws lambda by using Lamda Layers使用 Lamda 层在 aws lambda 中部署 Pytidylib 模块
【发布时间】:2020-07-13 08:17:08
【问题描述】:

我正在尝试使用 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))

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-lambda-layers


    【解决方案1】:

    我尝试复制您的问题,对我来说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. 在 AWS 控制台中基于 pytidylayer.zip 创建 lambda 层。不要忘记将Compatible runtimes 指定为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']
    

    【讨论】:

    • 我尝试了与您描述的相同的方式,但是一旦我通过“document,errors = tidy_document(doc)”实现 pytidylib,它就会中断并给出与上述相同的错误。
    • @user190549 我只测试了它是否加载。没有任何文件要测试更多。
    • 你知道如何将这些库添加到 lambda 服务器的 /usr/lib 中
    • @user190549 您无法修改这些文件夹。唯一的选择是尝试不使用层,只需将Pytidylib 与您的部署包捆绑在一起。但是如果它需要/usr/lib 中的一些操作系统级别的包,您将无法在其中添加它们。
    • 好吧,我试试部署包,谢谢帮助:)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 2020-02-17
      相关资源
      最近更新 更多