为什么我得到:无法导入模块 'handler':没有名为 'paramiko' 的模块?

Why am I getting : Unable to import module 'handler': No module named 'paramiko'?

我需要使用 aws-lambda 将文件从 SFTP 服务器移动到我的 AWS 账户, 然后我找到了这篇文章:

https://aws.amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/

谈论 paramiko 作为 SSH 客户端候选人以通过 ssh 移动文件。

然后我在 python 中编写了这个 calss 包装器,以便从我的无服务器处理程序文件中使用:

import paramiko
import sys

class FTPClient(object):

    def __init__(self, hostname, username, password):
        """
        creates ftp connection
            Args:
                hostname (string): endpoint of the ftp server
                username (string): username for logging in on the ftp server
                password (string): password for logging in on the ftp server
        """

        try:
            self._host = hostname
            self._port = 22

            #lets you save results of the download into a log file.
            #paramiko.util.log_to_file("path/to/log/file.txt")
            self._sftpTransport = paramiko.Transport((self._host, self._port))
            self._sftpTransport.connect(username=username, password=password)
            self._sftp          = paramiko.SFTPClient.from_transport(self._sftpTransport)
        except:
            print ("Unexpected error" , sys.exc_info())
            raise

    def get(self, sftpPath):
        """
        creates ftp connection
            Args:               
                sftpPath = "path/to/file/on/sftp/to/be/downloaded"
        """

        localPath="/tmp/temp-download.txt"

        self._sftp.get(sftpPath, localPath)
        self._sftp.close()

        tmpfile = open(localPath, 'r')

        return tmpfile.read()


    def close(self):
        self._sftpTransport.close()

在我的本地机器上它按预期工作 (test.py):

import ftp_client


sftp = ftp_client.FTPClient(
    "host", 
    "myuser",
    "password")

file = sftp.get('/testFile.txt')


print(file)

但是当我使用无服务器和 运行 handler.py 函数(与上面的 test.py 相同)部署它时,我得到了错误:

 Unable to import module 'handler': No module named 'paramiko' 

看起来部署无法导入 paramiko(根据上面的文章,它似乎应该可用于 AWS 上的 lambda python 3),不是吗?

如果不是,这种情况的最佳做法是什么?我是否应该将该库包含到我的本地项目中,然后 package/deploy 它到 aws?

您必须提供 AWS 的 Python 运行时中未安装的所有依赖项。

查看教程中的步骤 7。看起来他正在将虚拟环境中的依赖项添加到 zip 文件中。所以我假设您的 ZIP 文件包含以下内容:

  • 你的worker_function.py在顶层
  • 一个文件夹paramico,其中包含安装在虚拟环境中的文件

如果有帮助请告诉我。

全面的指南教程位于:

https://serverless.com/blog/serverless-python-packaging/

使用无服务器-python-需求包 作为无服务器节点插件。

创建虚拟环境和 Docker 在 AWS lambda 上部署之前需要 Deamon 打包您的无服务器项目

您必须创建一个 virtualenv,安装依赖项,然后将所有文件压缩到 sites-packages/

sudo pip install virtualenv 
virtualenv -p python3 myvirtualenv
source myvirtualenv/bin/activate
pip install paramiko
cp handler.py myvirtualenv/lib/python
zip -r myvirtualenv/lib/python3.6/site-packages/ -O package.zip

然后上传 package.zip 到 lambda

如果您使用

custom:
  pythonRequirements:
    zip: true

在您的 serverless.yml 中,您必须在处理程序的开头使用此代码片段

try:
  import unzip_requirements
except ImportError:
  pass

可在 Serverless Python Requirements documentation

中找到所有详细信息

我尝试了各种博客和指南,例如:

  1. web scraping with lambda
  2. AWS Layers for Pandas

花费数小时尝试事物。面临 that or being unable to import 等 SIZE 问题

..我快要结束了(即在本地调用我的处理程序函数),但是即使我的函数已完全正确部署并且甚至在本地调用时没有问题,也无法调用它在 AWS 上。

目前最全面、最好的指南或实际有效的示例是@koalaok 提到的上述内容!谢谢老哥!

实际link