pysftp 库在 AWS lambda 层中不起作用

pysftp library not working in AWS lambda layer

我想使用 pysftp 库(Python 脚本)将文件上传到 EC2 实例。所以我创建了一个小的 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)

此脚本会使用 .pem 文件将文件从我的本地 Windows 机器上传到 EC2 实例,并且它工作正常。

现在我想使用具有 API 网关 功能的 AWS lambda 执行此操作。

所以我已经将 Python 脚本上传到 AWS lambda。现在我不确定如何在 AWS lambda 中使用 pysftp 库,所以我找到了在 AWS lambda 层中添加 pysftp 库层的解决方案。我用

做到了

pip3 install pysftp -t ./library_folder

然后我将上述文件夹压缩并添加到 AWS lambda 层中。

但是我还是一一遇到了很多错误:-

No module named 'pysftp'

No module named 'paramiko'

Undefined Symbol: PyInt_FromLong

cannot import name '_bcrypt' from partially initialized module 'bcrypt' (most likely due to a circular import)

cffi module not found

我只是淡化了上述错误,我没有找到合适的解决方案。如何在我的 AWS lambda 中无缝使用 pysftp 库?

我构建了 pysftp 层并使用 python 3.8 在我的 lambda 上对其进行了测试。只是为了查看导入和基本打印:

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 并在我的测试 lambda 函数中使用它。

您还可以查看 如何使用此 docker 工具(我使用的 docker 命令基于 link 中的内容)。

希望对您有所帮助