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

mif*_*fin 7 python lambda logging amazon-web-services amazon-cloudwatch

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

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

def lambda_handler(event, context):
    print ("Hello World")
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

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  
Run Code Online (Sandbox Code Playgroud)

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

或者,似乎它可能是日志的问题.我仔细检查了我的许可,我有能力用所有资源创建日志.任何其他想法可能是什么问题?

kri*_*004 24

requests默认情况下,library不会出现在lambda中.看起来你正试图在你的函数/库中导入它.要导入它,您需要以下行:

from botocore.vendored import requests
Run Code Online (Sandbox Code Playgroud)

或者,您可以requests在zip文件的根目录中压缩库.

编辑:您的某个库可能需要依赖它.要解决此问题,请requests在您的应用程序zip中安装.为此,请在应用程序的根目录中运行以下命令:pip install requests -t ./.

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

  • 什么是`botocore.vendored`? (7认同)
  • 我也看到了这个答案,刚刚又试了一遍,但没有运气。 (2认同)

小智 19

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

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

mkdir lambda_layers
cd lambda_layers
mkdir python
cd python
pip install requests -t ./
cd ..
zip -r python_modules.zip .
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 12

对此答案进行检查

如果您在 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
Run Code Online (Sandbox Code Playgroud)


小智 11

Unable to import module 'lambda_function': No module named 'requests'
Run Code Online (Sandbox Code Playgroud)

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