在AWS Lambda上针对python 3.8的导入请求

时间:2019-11-20 11:09:46

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

使用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网关吗?

5 个答案:

答案 0 :(得分:1)

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

AWS曾经对此发出警告,有几种选择:

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

答案 1 :(得分:0)

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

pip install requests -t ./

然后打包并部署它-使用无服务器框架的示例在这里:

serverless deploy -s test

答案 2 :(得分:0)

您可以在EFS端点上点安装软件包。 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,但是大小受到限制(基本上)。

答案 3 :(得分:0)

我有同样的问题。解决该问题的方法是在AWS lambda中使用包含您所需的相关网站包的自定义层。

对我有用。

此处显示了一个如何通过快速Google创建图层的示例:https://dev.to/razcodes/how-to-create-a-lambda-layer-in-aws-106m

答案 4 :(得分:-1)

分别安装requests依赖项。

$ pip install requests

使用以下导入。

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

Removing the vendored verion and alternate solution

Associated PR which introduced this change