【问题标题】:pysftp library not working in AWS lambda layerpysftp 库在 AWS lambda 层中不起作用
【发布时间】:2023-03-26 16:07:02
【问题描述】:

我想使用 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 实例,并且它可以正常工作。

现在我想使用 AWS lambda 和 API Gateway 功能来执行此操作。

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

pip3 install pysftp -t ./library_folder

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

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

没有名为“pysftp”的模块

没有名为“paramiko”的模块

未定义符号:PyInt_FromLong

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

找不到cffi模块

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

【问题讨论】:

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


    【解决方案1】:

    我构建了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 函数中使用它。

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

    希望对你有帮助

    【讨论】:

    • 还需要确保您的 .zip 在解压缩 python/lib/python3.6/site-packages/{LibrariesGoHere} 时遵循此文件夹结构。上传该 zip,确保该层已添加到 Lambda 函数中,您应该一切顺利。这是对我有用的结构。非常感谢您的帮助。你拯救了我的一周。
    • 我还有一些问题,比如如何在 AWS lambda 中使用 .pem 文件?在将文件上传到 EC2 时如何使用 AWS lambda 的临时位置?
    • pem 是一个重要文件。可以考虑将其作为秘密字符串存储在 Parameter Store 或 Lambda 环境变量(使用加密助手加密的事件)中。临时位置是/tmp,最大大小为 500MB。像在普通实例上一样使用它。如果有具体的问题/问题可能会更好地提出新问题。
    • 我遇到了 zip 缺少隐藏文件的问题,请参阅 (stackoverflow.com/questions/51219096/…)。并将mylayer 的内容放入一个名为python 的文件夹中,然后重新压缩。
    • 在 MAC 中不工作,我在 EC2 中构建层,然后它正在工作,错误出现在“bcript”中
    猜你喜欢
    • 2019-06-20
    • 2020-06-21
    • 2020-12-02
    • 2022-01-17
    • 2019-06-19
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多