aws lambda 无法导入模块“lambda_function”:没有名为“requests”的模块

Posted

技术标签:

【中文标题】aws lambda 无法导入模块“lambda_function”:没有名为“requests”的模块【英文标题】:aws lambda Unable to import module 'lambda_function': No module named 'requests' 【发布时间】:2018-08-01 09:48:18 【问题描述】:

我最近开始使用 AWS Lambda 来针对我编写的一些 python 代码使用触发器。我目前有 2 个 lambda 函数,这两个函数都是用 ZIP 文件创建的。我创建的第二个应该测试触发事件。

这是出于测试目的,所以我使用的是最好的代码:

def lambda_handler(event, context):
    print ("Hello World")

但是,我得到了这个错误:

Response:

  "errorMessage": "Unable to import module 'lambda_function'"


Request ID:
"65024f16-172c-11e8-ab26-27ff3322e597"

Function Logs:
START RequestId: 65024f16-172c-11e8-ab26-27ff3322e597 Version: $LATEST
Unable to import module 'lambda_function': No module named 'requests'

END RequestId: 65024f16-172c-11e8-ab26-27ff3322e597
REPORT RequestId: 65024f16-172c-11e8-ab26-27ff3322e597  Duration: 15.93 ms  
Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 22 MB  

在我搜索过的所有地方,答案都是通过确保函数名称正确或确保 .zip 文件可读来解决的。我已经满足了这两个条件(文件的名称是 lambda_function.py,它位于根目录中)。

另外,它似乎可能是日志的问题。我仔细检查了我的权限,我能够使用所有资源创建日志。任何其他想法可能是什么问题?

【问题讨论】:

【参考方案1】:

requests 库默认情况下不会出现在 lambda 中。看起来您正试图将它导入到您的函数/库中的某个地方。要导入它,您需要以下行:

from botocore.vendored import requests

或者,您需要将 requests 库压缩到 zip 文件的根目录中。

编辑:您的一个库中可能存在需要此功能的依赖项。要克服这个问题,请在您的应用程序 zip 中安装 requests。为此,请在应用程序的根目录中运行以下命令:pip install requests -t ./

更好的方法是创建一个名为requirements.txt 的文件并在其中添加所有依赖项。使用 virtualenv 安装 requirements.txt 中定义的所有包:pip install -r requirements.txt -t ./


更新:从 2019 年 10 月 21 日开始,botocore 中的请求库的供应商版本将被删除。详情请参考this blog post。

【讨论】:

我也看到了这个答案,只是又试了一次,没有成功。 使用应用程序根目录中的命令安装requestspip install requests -t ./。完成后,压缩应用程序并将其上传到函数。如果您有 requirements.txt,请在其中添加 requests 不想安装在同一个目录怎么办? pip install requests -t ./会保存在同一目录中 什么是botocore.vendored ***.com/questions/58445984/…【参考方案2】:

检查一下这个answer

如果您在 AWS Lambda 上使用 Python,并且需要使用 requests,您最好使用 urllib3,它目前在 AWS Lambda 上受支持,您可以直接导入,检查urllib3 站点上的示例。

import urllib3

http = urllib3.PoolManager()
r = http.request('GET', 'http://httpbin.org/robots.txt')

r.data
# b'User-agent: *\nDisallow: /deny\n'
r.status
# 200

【讨论】:

【参考方案3】:

这肯定会奏效。只需按照以下步骤操作:

在任何空目录中创建一个“python”目录并在其中 pip 安装模块

mkdir lambda_layers
cd lambda_layers
mkdir python
cd python
pip install requests -t ./
cd ..
zip -r python_modules.zip .

如果您想在单层中拥有多个模块,请将它们安装在您刚刚创建的同一个“python”目录中。

只需确保使用“-r”递归地压缩“python”目录本身。这样 lambda 处理程序可以在您使用的默认 python 版本中找到模块。

现在您有了包含所有依赖模块的“python_modules.zip”文件。转到 AWS 控制台中的 Lambda 层并创建一个上传此 zip 文件的层。根据您在 lambda 函数中使用的 python 版本选择运行时,或者您可以选择多个 python 运行时版本。将此层添加到您的 lambda 函数中,您应该能够完美地导入您的模块。

【讨论】:

【参考方案4】:
Unable to import module 'lambda_function': No module named 'requests'

请尝试使用 python3.7 作为运行时。它将解决请求问题!

【讨论】:

【参考方案5】:

https://aws.amazon.com/blogs/developer/removing-the-vendored-version-of-requests-from-botocore/

AWS 从 Botocore 中删除了 requests 的供应商版本。

步骤:

    cmd >> pip install requests

    Python 代码:

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

【讨论】:

【参考方案6】:

所以这就是我的情况解决的问题

处理程序::“yfinance_lamdba.lambda_handler”

在上面一行

               **yfinance_lamdba** is filename 'yfinance_script.py'

               **lambda_handler** is function 'def lambda_handler' which has actual code

【讨论】:

欢迎来到 SO!我无法正确理解您的回答。您能否对其进行编辑,以便您建议的解决方案更加清晰?谢谢! 添加了更多信息,如果您需要进一步说明,请告诉我@MyKoryto【参考方案7】:

step1- mkdir python

step2- pip3 install -t python requests

step3- 压缩python文件夹

step4- 在 aws lambda 函数中创建新层并上传此 zip 文件

step5- 在你的 lambda 函数中添加这一层

【讨论】:

【参考方案8】:

尝试使用wheel文件,它会起作用。

    'https://pypi.org/project/pytz/#files'
    'https://pypi.org/project/pandas/#files'
    'https://pypi.org/project/numpy/#files'

需要在本地解压缩并合并这些文件,然后将其压缩,然后再上传到 AWS Lambda 函数。

【讨论】:

以上是关于aws lambda 无法导入模块“lambda_function”:没有名为“requests”的模块的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda python 错误:Runtime.ImportModuleError:无法导入模块“app”:无法从“pyparsing”导入名称“operatorPrecedence”

Terraform 0.11:aws_lambda_function 中的条件 vpc_config

AWS:无法导入模块“处理程序”:没有名为“numpy”的模块

AWS 无法导入模块“app”:没有名为 Pymysql 的模块

python中的AWS Lambda导入模块错误

AWS Lambda NodeJS导入返回空模块,但仅在AWS中