Разверните модуль Pytidylib в aws лямбда с помощью слоев Lamda - PullRequest
2 голосов
/ 13 июля 2020

Я пытаюсь развернуть модуль pytidylib python в AWS лямбда-функцию, используя слои. Я создал путь, как описано в aws документах, и создал новый слой. Теперь для кода pytidylib нужны некоторые библиотеки из / usr / lib, но я установил библиотеки в /python/lib/python3.7/site-packages/, поэтому для решения этой проблемы я добавил путь в среду PATH aws linux серверная платформа, но проблема не решена. Ниже мой код: -

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))

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Я решил это, добавив путь к аккуратной библиотеке (libtidy.so.5.2.0) в переменную окружения LD_LIBRARY_PATH сервера linux

Для меня библиотека была предварительно установлена ​​на сервере ubuntu 18.04 в / usr / lib. Скопируйте библиотеку по этому пути, поместите ее в папку tidylib, создайте zip-архив и выполните действия по созданию лямбда-слоев.

0 голосов
/ 13 июля 2020
• 1000 попытка. Он включает в себя инструмент docker , описанный в недавнем блоге AWS :

Я создал слой Pytidylib следующим образом:

  1. Создайте пустую папку, например mylayer.

  2. Go в папку и создать файл requirements.txt с содержимым

Pytidylib
Выполните следующую команду 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"
Создать слой как zip:
zip -r pytidylayer.zip python > /dev/null

Создайте слой лямбда на основе pytidylayer.zip в AWS Console. Не забудьте указать Compatible runtimes на python3.8.

Добавьте слой к лямбда-выражению и протестируйте, используя следующую лямбда-функцию:

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']
...