Библиотека pysftp не работает в AWS лямбда-слое - PullRequest
3 голосов
/ 21 апреля 2020

Я хочу загрузить файлы в экземпляр EC2, используя pysftp библиотека (python скрипт) . Поэтому я создал небольшой сценарий python, который использует строку ниже для подключения

pysftp.Connection(
    host=Constants.MY_HOST_NAME,
    username=Constants.MY_EC2_INSTANCE_USERNAME,
    private_key="./mypemfilelocation.pem",
)
some code here .....
pysftp.put(file_to_be_upload, ec2_remote_file_path)

Этот сценарий будет загружать файлы с моего локального компьютера Windows в экземпляр EC2 с использованием файла .pem, и он работает правильно.

Теперь я хочу выполнить это действие, используя AWS lambda с функциональностью API Gateway .

Итак, я загрузил скрипт python в AWS lambda. Теперь у меня возникла проблема, связанная с тем, как я использую библиотеку pysftp в AWS lambda, поэтому я нашел решение добавить библиотеку pysftp Layer в AWS lambda. Layer, так что я сделал это с помощью

pip3 install pysftp -t ./library_folder

И я делаю zip из указанной выше папки и добавляю в AWS lambda Layer.

Но все же я получил так много ошибок, как одна за другой: -

Нет модуля с именем 'pysftp'

Нет модуля с именем 'paramiko'

Неопределенный символ: PyInt_FromLong

не может импортировать имя '_bcrypt' из частично инициализированного модуля 'bcrypt' (скорее всего, из-за циклического импорта)

модуль cffi не найден

Я просто исчез из вышеупомянутых ошибок, я не нашел правильного решения. Пожалуйста, помогите мне, чтобы я мог без проблем использовать библиотеку pysftp в моей AWS лямбде.

1 Ответ

2 голосов
/ 21 апреля 2020

Я строю pysftp слой и проверил его на своей лямбде с python 3.8. Просто чтобы увидеть импорт и основную c печать:

import json
import pysftp

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

Я использовал следующий инструмент docker для создания слоя pysftp:

Итак, что я сделал для pysftp было:

# create pysftp fresh python 3.8 environment
python -m venv pysftp

# activate it
source pysftp/bin/activate

cd pysftp

# install pysftp in the environemnt
pip3 install pysftp  

# generate requirements.txt
pip freeze > requirements.txt

# use docker to construct the layer
docker run --rm -v `pwd`:/var/task:z lambci/lambda:build-python3.8 python3.8 -m pip --isolated install -t ./mylayer -r requirements.txt

zip -r pysftp-layer.zip .

А остальное - загрузка zip в s3, создание нового слоя в консоли AWS , установив Compatible runtime в python 3.8 и используя его в моей тестовой лямбда-функции.

Вы также можете проверить здесь как использовать этот инструмент docker (команда docker Я использовал основанный на том, что находится в той ссылке).

Надеюсь, это поможет

...