使用Lamda层在AWS Lambda中部署Pytidylib模块

时间:2020-07-13 08:17:08

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

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

onSubmit

我想了解一下,有什么方法可以通过对代码进行一些更改来使这项工作有效,并使pytidyliblib模块通过各层运行。 下面是错误:-

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/

2 个答案:

答案 0 :(得分:0)

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

如果您想尝试一下,这就是我用来构造图层的方式。它涉及到最新的 AWS博客中描述的 docker工具

我创建了Pytidylib层,如下所示:

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

  2. 转到该文件夹​​并创建内容为{p>的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']

答案 1 :(得分:0)

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

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