【问题标题】:How do I add python libraries to an AWS lambda function for Alexa?如何将 python 库添加到 Alexa 的 AWS lambda 函数?
【发布时间】:2016-12-17 01:16:44
【问题描述】:

我正在按照教程使用 Python 创建一个 Alexa 应用程序:

Python Alexa Tutorial

我能够成功完成所有步骤并使应用程序运行。我现在想修改 python 代码并使用外部库,例如 import requests 或我使用 pip 安装的任何其他库。我将如何设置我的 lambda 函数以包含我在我的机器上本地安装的任何 pip 包?

【问题讨论】:

    标签: python amazon-web-services pip aws-lambda alexa-skills-kit


    【解决方案1】:

    正如亚马逊官方文档链接here中所描述的那样,它就像在您拥有 python lambda 代码的文件夹中安装所需的包后创建所有文件夹内容的 zip 一样简单。

    正如 Vineeth 在他的评论中指出的那样,从内联代码编辑器迁移到 zip 文件上传方法的第一步是在配置设置下更改 lambda 函数处理程序名称,以包含保存 lambda 的 python 脚本文件名处理程序。

    lambda_handler => {your-python-script-file-name}.lambda_handler.

    python-lambdalambda-uploader 等其他解决方案有助于简化上传过程以及最重要的本地测试。这些将节省大量的开发时间。

    【讨论】:

    • 这种方式不适用于带有 psycopg2 的 python 3.6 脚本。出现错误“无法导入模块'ProcessRawRetailSalesUsingCOPY':没有名为'psycopg2._psycopg'的模块”我正在使用带有pycharm的windows7 prof。如果可以的话,需要一些帮助。
    • 我们可以这样做并且仍然能够修改内联代码吗?似乎在添加了许多库之后,zip 文件很大,并且不允许我再更新内联代码(代码本身并不大)。有什么解决方法吗?
    • @Sarah 将你所有的库打包到一个 lambda 层中,并将你的源代码保存在你的 lambda zip 和层对你的 lambda 的依赖中。这将减小大小,您应该能够在线编辑代码。还可以在这里查看 aws sam 模板 => docs.aws.amazon.com/serverless-application-model/latest/…
    【解决方案2】:

    official documentation 很不错。简而言之,您需要创建一个目录的 zip 文件,其中包含 lambda 函数的代码和您在顶层使用的所有外部库。

    您可以通过停用您的 virtualenv、将所有需要的库复制到工作目录(如果您在命令行上调用脚本,则始终在 sys.path 中)并检查您的脚本是否仍然有效来模拟这种情况。

    【讨论】:

    • 我尝试按照文档进行操作。我将请求安装到库中。我拿了 color_game.py 并在顶部添加了 import requests、requests 目录和 requests-2.11.0.dist-info 目录,并将这三个发送到一个 zip 文件中。我将 zip 文件上传到 lambda,但是当我尝试运行 Alexa 函数时;这是行不通的。我得到The remote endpoint could not be called, or the response it returned was invalid.
    • 我想通了!我意识到我并没有更改我的处理程序的名称。如果您从内联代码转到 zip 文件,它应该是 filename.lambda_handler。谢谢!
    • 我们刚刚启动了一个项目bstpy,将 Python lambda 公开为 http 服务。您可能会发现它对测试很有用。您可以使用 curl 或 postman 向其抛出 json 有效负载。如果您尝试与其他Bespoken Tools 一起使用,您可以获得非常好的开发环境。
    • 不责怪信使,但这是 AWS 的一个难题。从 pip/conda 需求到 lambda 部署确实应该有一种更结构化的方法。
    • The official documentation is pretty good. 会不同意你的意见。我完全不清楚您单独链接到的页面的标题和第一句话是否与将包导入我的 AWS 实例有任何关系。 (是关于包装我创造的东西吗?谁知道呢!)
    【解决方案3】:

    您可能希望考虑使用诸如 zappa 之类的框架,它们将为您处理打包和部署 lambda 函数。

    您可以将它与flask-ask 结合使用,以便更轻松地掌握 Alexa 技能。甚至还有一个视频教程(来自 zappa 自述文件)here

    【讨论】:

      【解决方案4】:

      呼应@d3ming 的回答,此时框架是一个很好的方法。手动创建部署包并非不可能,但您需要上传包的编译代码,如果您在非 Linux 系统上编译该代码,则可能会遇到系统之间差异的问题并且 Lambda 函数的部署环境很高。

      然后,您可以通过在 linux 机器或 Docker 容器上编译代码来解决这个问题。但是在所有这些复杂性之间,您可以从采用框架中获得更多。

      Serverless 被广泛采用并支持自定义 python 包。它甚至与 Docker 集成以编译您的 python 依赖项并为您构建部署包。

      如果您正在寻找这方面的完整教程,I wrote one for Python Lambda functions here.

      【讨论】:

        【解决方案5】:

        为了解决这个特殊问题,我们使用了一个名为 juniper 的库。简而言之,您需要做的就是创建一个非常简单的清单文件,如下所示:

        functions:
          # Name the zip file you want juni to create
          router:
            # Where are your dependencies located?
            requirements: ./src/requirements.txt.
            # Your source code.
            include:
            - ./src/lambda_function.py
        

        从此清单文件中,调用 juni build 将为您创建 zip 文件工件。该文件将包含您在 requirements.txt 中指定的所有依赖项。

        该命令将创建此文件./dist/router.zip。我们将该文件与 sam 模板结合使用。但是,您可以使用该 zip 并将其上传到控制台,或通过 awscli。

        【讨论】:

          【解决方案6】:

          亚马逊创建了一个存储库来处理您的情况: https://github.com/awsdocs/aws-lambda-developer-guide/tree/master/sample-apps/blank-python

          空白应用程序是一个示例,说明如何根据要求推送 lambda 函数,并由 Amazon 提供奖励。

          您需要做的就是一步一步地按照您的需要更新存储库。

          【讨论】:

            【解决方案7】:

            我也为此苦苦挣扎了一段时间。在深入了解 aws 资源之后,我了解到 aws 上的 lambda 函数在 linux 上本地运行。并且拥有与 linux 版本相匹配的 python 包版本非常重要。

            您可以在以下位置找到更多信息: https://aws.amazon.com/lambda/faqs/

            按照步骤下载版本。 1、从pypi中找到包的.whl镜像,下载到本地。 2. 压缩包并将它们作为层添加到 aws lambda 3. 将图层添加到 lambda 函数中。

            注意:请确保您尝试安装 python 包的版本与 aws lambda 执行计算任务的 linux 操作系统相匹配。

            参考资料: https://pypi.org/project/Pandas3/#files

            【讨论】:

              【解决方案8】:

              很多python库可以通过Layers在这里导入:https://github.com/keithrozario/Klayers,或者你可以使用像serverless这样的框架,它有插件将包直接打包到你的工件中。

              【讨论】:

                猜你喜欢
                • 2023-02-08
                • 2019-07-16
                • 2017-09-05
                • 1970-01-01
                • 1970-01-01
                • 2018-10-29
                • 1970-01-01
                • 2016-03-23
                • 1970-01-01
                相关资源
                最近更新 更多