【问题标题】:import requests on AWS Lambda for python 3.8AWS Lambda for python 3.8 上的导入请求
【发布时间】:2019-11-20 11:09:46
【问题描述】:

使用 botocore.vendored 中的requests 的技巧不再适用于 AWS Lambda 上的 Python 3.8,我假设它包括最新的 botocore-1.13。 此版本不再嵌入requests。导入它可以,但包实际上是空的。

[ERROR] AttributeError: module 'botocore.vendored.requests' has no attribute 'post'

有没有办法在原生 lambda 上导入 requests?这是一个基础,为非常简单的 Lambda 打包代码会很痛苦。

或者,没有requests,任何人都有另一个技巧来调用API-Gateway?

【问题讨论】:

    标签: python aws-lambda python-requests python-3.8


    【解决方案1】:

    哇哦,我想这是我们很少看到的 AWS Lambda 上的“重大变化”。

    AWS 之前已经警告过这一点,有几个选择:

    • 使用 Serverless Framework 和 serverless-python-requirements 插件
    • 查看来自this repo 的请求的 Python3.7 Lambda 层是否适用于 Python3.8
    • 使用lambci for python3.8自行打包

    【讨论】:

    • 现在我或多或少决定不使用 3.8 或发送 SNS 消息而不是 API 调用......我想这就是 AWS 想要的方式。
    【解决方案2】:

    在您的项目中本地安装“请求”:

    pip install requests -t ./
    

    然后打包并部署它 - 此处使用无服务器框架示例:

    serverless deploy -s test
    

    【讨论】:

    • 这会大大增加包的大小。还有其他解决方法吗?
    • 这有很大的启动延迟,需要保温机制。
    【解决方案3】:

    您可以在 EFS 端点 pip 安装包。 pip install requests -t efs_endpoint

    从您的 Lambda 函数挂载该 EFS 端点。然后在你的 lambda 函数中 import sys 并添加你的模块安装路径: sys.path.insert(0, '/efs_mnt/path/to/module')

    然后您可以将模块导入到您在 Lambda 中的 python 环境中。

    设置 EFS 并弄清楚如何挂载它并不难——您可能需要更改挂载点的所有权以允许写入。

    您也可以将外部模块以 zip 文件的形式导入 Lambda,但您(基本上)在大小方面受到限制。

    【讨论】:

    • 有趣的提议!你知道它的效率吗?安装 Lambda 需要多长时间才能保持温暖?
    • 我正在努力实现这一点,并将向您提供任何重要的细节,但到目前为止它看起来既简单又快速。您使用 EFS 端点配置 Lambda;我没有对部署带有和不带有 EFS 挂载的 lambda 实例的延迟进行基准测试,但据我所知,它的速度和性能确实可以忽略不计。你的保暖问题是一个很好的问题,我将在我当前项目的背景下进行调查。
    • 太棒了!期待您的来信。
    • 嘿@VincentAlvo - 只是想回到这个话题。将依赖项引入 Lambda 中的 Python 运行时对我来说效果很好。它超级快——我没有进行基准测试,但在我的上下文中没有明显的区别。您的 Lambda 不需要保持温暖,尽管冷 lambda 仍然必须进行通常的启动。最大的警告是 EFS 具有有限的突发吞吐量以及 AWS 典型的突发信用系统。因此,您需要注意每个 lambda 的总 EFS I/O * lambda 调用次数不大于突发容量或信用率。
    • 嗨@connor,感谢您的反馈!非常感激。我的速度明显变慢,通常超过网关上的 30 秒超时。这可能只是我使用的代码或库。你的包裹大约有多大?根据 api,我有 10-50Mo 之间。
    【解决方案4】:

    我遇到了同样的问题。解决它的方法是在 AWS lambda 中使用自定义层,其中包含您需要的相关站点包。

    它对我有用。

    这里有一个向您展示如何(通过快速谷歌搜索)创建图层的示例:https://dev.to/razcodes/how-to-create-a-lambda-layer-in-aws-106m

    【讨论】:

      【解决方案5】:

      单独安装requests 依赖。

      $ pip install requests

      使用下面的导入。

      import requests
      response = requests.get('https://...')
      

      Removing the vendored verion and alternate solution

      Associated PR which introduced this change

      【讨论】:

      • 这在默认的 lambda 环境中是不可能的。
      • 改为在项目本地安装“请求”
      猜你喜欢
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2021-02-28
      • 2018-07-29
      • 2018-01-07
      相关资源
      最近更新 更多