AWS python lambda 函数:没有名为 requests 的模块

问题描述 投票:0回答:9

我对 AWS 还很陌生,遇到了一些问题。这是我的代码:

from __future__ import print_function
from urllib2 import Request, urlopen, URLError
import requests
import boto3
import json

def lambda_handler(event, context):
    url = "https://globalcurrencies.xignite.com/xGlobalCurrencies.json/GetHistoricalRatesRange?Symbol=BTCUSD&PriceType=Mid&StartDate=01/01/2017&EndDate=10/27/2017&PeriodType=Daily&FixingTime=22:00&_token=some_token_xyz"
    response = requests.get(url).json()
    # print json.dumps(response, indent=4) # gives a syntax error
    return response

文件名是lambda_function.py;我在 stackoverflow 上检查过类似的问题,有些人提到我必须更改文件命名。但这没有帮助。以下是 python 方法的命名方式:
这是我收到的错误:

START RequestId: cf24e9be-bbef-11e7-97b4-d9b586307f3e Version: $LATEST
Unable to import module 'lambda_function': No module named requests
当尝试打印时,它给我一个语法错误。抱歉格式化了。有什么建议吗?

python-2.7 amazon-web-services aws-lambda
9个回答
51
投票

requests 不是 AWS lambda 中的标准库。

有两种方法可以解决这个问题:

1- 从 Botocore 库堆栈中将其导入为:(给出答案后不推荐使用的选项)

from botocore.vendored import requests

这里有一个可以在 lambda 中导入的所有可用库的列表

2- 使用 virtualenv 创建部署包。


31
投票

N.B

requests
已包含在运行时 Python 3.7 的 lambda 函数中:

事实上:

from pkg_resources import working_set

def lambda_handler(event, context):
    for p in list(working_set):
        print(p.project_name, p.version)

urllib3 1.26.6 六 1.16.0 s3传输0.6.0 请求2.26.0 python-dateutil 2.8.2 jmespath 1.0.1 国际DNA 2.10 字符集标准化器 2.0.12 夏代4.0.0 证书 2020.11.8 博托核心 1.29.90 boto3 1.26.90 安装工具 47.1.0 点 22.0.4

对于所有其他运行时,请参阅下文。


如果你想包含不属于Python标准库的库,例如

requests
,你可以使用lambda的层

1。创建 zip

这是一个 zip 文件,其中包含您希望 lambda 函数使用的所有库。 首先,创建一个名为

python
:

的文件夹
$ mkdir python
$ cd python

然后,在其中安装您需要的 Python 库。您可以使用单个库来完成此操作:

$ pip install --target . requests

或使用库列表(requirements.txt)

$ pip install --target . -r requirements.txt

最后,拉上所有东西的拉链。

... 在 Bash 中:

$ zip -r dependencies.zip ../python

...在 Powershell 中:

$ Compress-Archive -Path . -DestinationPath dependencies.zip

2。创建图层

您可以在 AWS 控制台或 CLI 中执行此操作。请遵循这些说明


3.将图层添加到 lambda 函数

您可以使用 lambda 页面或 CLI 中的

Add a layer
选项来执行此操作。请遵循这些说明


14
投票

这是因为它在 lambda 中运行时缺少 requests 库 - 很可能它已全局安装在您的本地计算机上。如果你运行:

pip install requests -t .

在与源代码相同的目录中,它将在该目录中安装 requests 包,然后您可以将其与 lambda_function.py 一起上传到 lambda。您可能需要对 boto3 和 json 执行相同的操作:
pip install boto3 -t .

pip install json -t .


8
投票

您想使用图层。您下载一个 python 模块,例如 pip install requests -t .,然后只需将所有模块文件夹放入名为 python 的文件夹中,然后将其压缩并上传到 aws 控制台的 lambda 层部分。将其添加到您的 lambda 函数中,它将起作用。目录结构非常重要,因此对于请求,当您解压缩文件夹时,它应该是 RequestLayer/python/requests/"requests 以及属于该包的所有其他文件夹"。 这家伙一步一步给出了很好的


3
投票

使用

urllib3
代替

虽然

requests
不是 AWS lambda 中的标准库,但标准库中存在替代方案,可以让您避免 Lambda 层。

如果您检查 Nilo_DS 链接的库列表 (https://gist.github.com/gene1wood/4a052f39490fae00e0c3),您会发现

urllib3
可用。

import requests

requests.post(<url>, data=json.dumps(<message>))

可以重写为

import urllib3

http = urllib3.PoolManager()
http.request('POST', '<url>',
             headers={'Content-Type': 'application/json'},
             body=json.dumps(<message>))

以及 get 请求的类似更改。


2
投票

对于未来使用 Python 的读者:如果您直接在 Cloud9 中创建 Lambda 应用程序,您会注意到您的应用程序有一个虚拟环境。要安装 requests(或任何其他与此相关的包),请执行以下操作:

  1. 右键单击您的应用程序的文件夹
  2. 选择“在此处打开终端”
  3. 在终端中输入
    source venv/bin/activate
    激活您的虚拟环境
  4. 输入
    pip3 install requests
    安装请求

就是这样。您现在可以正常使用带有

import requests
的请求。


1
投票

“requests”模块不在您尝试安装的“zip”文件中。你必须通过 'pip install module_name(such as requests) -t '将所有模块放入 zip 文件中。


0
投票

发布:2024 年 2 月 20 日

您可以像下面一样使用

http.client

这解决了目的,您无需安装任何其他东西

http.client


-9
投票

你必须在Python代码中这样命名你的lambda:

def lambda_function(event, context):

并在 lambda 控制台处理程序中:

main.lambda_function

对于您的请求错误,在上传到 lambda 之前,您的 .zip 中必须包含该模块的文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.