【问题标题】:how to upload python code with libraries to aws lambda from windows local machine using aws console如何使用aws控制台将带有库的python代码从Windows本地机器上传到aws lambda
【发布时间】:2018-11-15 15:03:10
【问题描述】:

我需要使用通过 API 网关触发的 AWS Lambda。我有 python 脚本,它从 S3bucket 加载机器学习模型并从 api 调用获取输入并预测结果。我可以成功触发用python内联编写的lambda函数。但我想使用机器学习包来预测 lambda 函数。所以我知道我需要上传带有安装在虚拟环境中的包的代码,我做到了。但是触发时的 lambda 会给出错误“无法导入模型 lambda_function”。我有带有方法“处理程序”的 lambda_function.py。请让我知道我是否做得对(创建虚拟环境并安装软件包并上传它)以及为什么会出现此错误。另外,请告诉我 Windows 和 AWS 控制台的解决方案。我已经看到很多关于 Linux 命令和使用 aws cli 的答案。

zip folder

lambda_function

lamnda function settings

lambda function settings

更新:

这快把我逼疯了!我已经尝试了答案中找到的所有方法,但没有一个对我有用。它给出了同样的错误:'无法导入模块:lambda_function'所以我无法理解错误在哪里。如果您有任何建议,请帮助我。在你说函数名称之前:我有正确的名称:lambda_function.lambda_handler。我压缩了内容而不是目录。请在下面查看我的 lambda 代码和 lambda 设置 lambda json file 拉姆达函数代码: 导入 boto3 导入操作系统 导入 uuid 导入sklearn 进口泡菜

def lambda_handler(event, context):
s3_client = boto3.client('s3')
s_desc=event['params']['querystring']['token']
X_test1=[]
X_test1.append(s_desc)
#load model
bucket = 'harshini-snow-bucket'
key = 'model.pkl'
download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)
s3_client.download_file(bucket, key, download_path)

f = open(download_path, 'rb')
model = pickle.load(f)
f.close()
#class_predicted = model.predict(X_test1)

return X_test1

如果还有其他方法,请告诉我。我会尝试任何方法。

更新 2:

error

code

【问题讨论】:

  • 看起来您遇到了缩进问题。当我在文件之间复制粘贴代码时,有时会得到这些。尝试取消缩进,重新缩进 pack.py 中的代码(您的错误图像显示问题出在 pack.py 中)。文本编辑器中通常还有一些选项可以帮助突出显示可能使用空格而不是制表符的位置,或者如果您只是忘记在某处缩进。
  • 如你所见,我没有发现任何缩进错误,重试了几次。
  • 您没有发布 pack.py... 正如您在错误消息中看到的那样,它说 pack.py 在第 12 行附近存在缩进问题(查看错误图像的日志输出区域)。有时我不得不重新进行缩进,因为看起来缩进很好,但实际上使用空格而不是制表符复制了一行,反之亦然。您遇到的“未缩进与任何外部缩进级别不匹配”错误往往意味着缩进只是错误的,可能是因为没有在函数或控制结构下缩进。
  • 请查看显示 pack.py 的名为 code 的链接并检查缩进。
  • 抱歉,我以为是 lambda_function.py。从这里看缩进确实很好,但就像我之前所说的,有时当有隐藏字符导致缩进问题时看起来很好。您是否尝试过取消缩进和重新缩进 lambda_handler 中的所有行?

标签: python windows amazon-web-services aws-lambda


【解决方案1】:

首先在本地机器的一个文件夹中安装所有必需的包。还包括该文件夹中的主 lambda_function.py 文件。现在选择文件夹中的所有包和 python 文件并将它们压缩成一个 .zip 文件。此处您必须确保压缩文件夹的内容而不是文件夹本身。 然后您可以直接或通过 s3 将 zip 文件上传到 lambda。还有一点需要注意的是,python 文件是否命名为“lambda_function.py”。默认情况下,lambda 假定主 python 文件具有“lambda_function.py”名称。如果您使用了任何其他名称,您可以在 Handler 内的 Function code 部分下从 lambda 控制台更改文件名...希望这会有所帮助。

【讨论】:

  • 这个技巧对于机器学习模型非常有用,因为它使用的包通常很大。并且 lambda 的压缩源代码文件(根据文档)的限制约为 50MB,而未压缩的可能约为 250 MB。最简单的方法是将压缩文件(即使大于 50 MB)推送到 s3,然后在创建 lambda 函数时将其作为源。
  • 您好,我已经按照上述所有步骤操作,但仍然遇到错误。我压缩了文件而不是文件夹,我的函数名都是 lambda_function 。我被这个错误困扰了很长时间。不知道原因!!!
  • 这是我的带有 lambda_function.py 的 zip 文件夹,所有其他文件夹都是在我运行虚拟环境和安装包时创建的。(请参阅问题中的我的 zip 链接)
  • 尝试在没有虚拟环境概念的情况下将每个包单独安装在文件夹中!例如:要安装 boto3 库,请 pip install boto3 -t /path/to/your/folder
  • 我的 lambda_function.py 会怎样?以及如何直接上传到 lambda 函数。请指导
【解决方案2】:

您必须使用 dockerEC2 为 lambda 制作自定义部署包。如果您在本地机器上制作一个包,它将无法工作,因为它不会编译所需的库。

这里是完整的例子,你将如何制作一个自定义包,这个例子将python的PILLOW图像处理库与lambda代码一起打包,你可以打包你的模型需要的所有其他库以相同的方式与 PIL 一起在同一个包中

link to example

记住一件事,例如文件名是 CreateThumbnail.py,你可以给它任何名字,但总是以这种方式配置你的处理程序 filename.handler-function ,例如 disco.lambda_handler 其中 disco.py 是文件名,lambda_handler 是 lambda 的代码处理程序模块

【讨论】:

  • 我遵循了确切的步骤,但仍然得到相同的错误:无法导入模块 lambda_function。
  • 你的文件名是 lambda_function.py 吗?你的代码是否包含 lambda 处理程序?
  • 是的。查看创建的 zip 文件夹的图像,我的 lambda_function 和处理程序名称是 lambda 函数中的处理程序。
  • 能否在控制台中添加 lambda 环境设置的屏幕截图?
  • 附加。查看图片问题。
【解决方案3】:

此处的答案在技术上是正确的,但如果您使用的是 Windows 机器(或除 Amazon Linux 之外的任何机器),那么将自定义包放入 Python 应用程序可能会遇到很多问题。 Lambda 应用程序在 Amazon Linux 上运行,因此您需要使用该操作系统或尽可能接近的任何方式安装软件包。

这是我的一个答案,描述了我如何为我的 Lambda 应用程序组合包:

https://stackoverflow.com/a/50767639/3023353

【讨论】:

    【解决方案4】:

    我知道我回答这个问题有点晚了,但我在 python 的 pandas 库中遇到了同样的问题。

    这是帮助我解决此问题的链接 HERE

    所以简而言之就是

    1.转到here

    2.search the library you want to use

    3.then go to download option

    4.download the file with Linux option

    5.在你的项目文件夹中解压文件(我用的是7-zip)

    6.现在为您的项目创建一个新的 zip 文件并上传到 lambda

    【讨论】:

      【解决方案5】:

      您需要在 AWS Lambda 中为外部 python 库添加一个层。

      https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

      AWS 文档中的示例非常糟糕,对于我们的团队来说这并不容易。不得不手动安装一些库,但这很有效。

      【讨论】:

        【解决方案6】:

        这也让我发疯了。我正在使用 Windows 来创建 python 包。 解决这个问题的关键是将你的包存储在一个名为 python 的文件夹中。当我将文件夹命名为其他任何名称时,它都不起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-04
          • 2019-03-10
          • 2013-08-12
          • 2019-03-06
          • 2020-01-19
          • 1970-01-01
          • 2018-07-12
          • 2020-10-20
          相关资源
          最近更新 更多