pysftp库在AWS Lambda层中不起作用

时间:2020-04-21 06:11:13

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

我想使用 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 Layer中添加pysftp库Layer的解决方案。我做到了

pip3安装pysftp -t ./library_folder

然后压缩上面的文件夹并添加到AWS lambda Layer中。

但是我仍然遇到很多错误,就像一个接一个:-

没有名为“ pysftp”的模块

没有名为“ paramiko”的模块

未定义符号:PyInt_FromLong

无法从部分初始化的模块“ bcrypt”中导入名称“ _bcrypt”(很可能是由于循环导入)

找不到CFFI模块

我只是淡出了上面的错误,所以没有找到正确的解决方案。如何在我的AWS Lambda中无缝使用pysftp库?

1 个答案:

答案 0 :(得分:3)

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

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函数中使用它。

您还可以检查here如何使用此docker工具(我使用的docker命令基于该链接中的内容)。

希望这会有所帮助