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

45
我最近开始使用AWS Lambda来触发我编写的一些Python代码。目前我有两个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,并且位于根目录中)。
另外,可能是日志的问题。我仔细检查了我的权限,我有能力使用所有资源创建日志。还有其他什么问题可能导致这个问题吗?
10个回答

63

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 ./


更新:从10/21/19开始,botocore中的vendored版本requests库将被删除。有关详细信息,请参见此博客文章


2
我也看到了那个答案,刚刚又尝试了一下,但没有成功。 - mifin
使用以下命令在应用程序的根目录中安装 requestspip install requests -t ./。完成后,将应用程序压缩并上传到函数。如果有 requirements.txt 文件,请将 requests 添加到其中。 - krishna_mee2004
1
如果我不想安装在同一个目录下怎么办?pip install requests -t ./会将其保存在同一目录下。 - Jun
17
botocore.vendored是什么?botocore.vendored是AWS SDK for Python(Boto3)中的一个模块,用于存储第三方库和其他模块的副本。这些副本被包含在SDK中以确保代码可以在不同的环境中执行,而无需依赖于系统上已安装的特定版本。 - Snowcrash
1
https://dev59.com/w1MH5IYBdhLWcg3wwSLz - Peter Cotton
显示剩余3条评论

18

这肯定会奏效,只需要遵循以下步骤:

在任何空目录内创建一个名为“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的Layers并上传此zip文件以创建一个层。根据您在Lambda函数中使用的Python版本选择运行时,或者您可以选择多个Python运行时版本。将此层添加到您的Lambda函数中,您应该能够无缝导入您的模块。


使用层解决了我的问题。非常感谢Bhaskar。 - puargs
如何向Lambda函数添加层的最佳答案。这应该在AWS网站上。 - Yasir
如何为您的Lambda函数添加一个层的最佳答案。这应该在AWS网站上。 - undefined
这肯定是创建图层的最佳方式。 - RushHour
这是这个问题的正确答案。 - roman

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

11
Unable to import module 'lambda_function': No module named 'requests'

请尝试使用Python3.7作为运行环境,这将解决请求问题!


这对我解决了问题。你知道为什么吗? - Reboot_87
我尝试了上面的解决方案,但这个解决方案解决了问题。我使用的是Python环境的v3.11版本。 - undefined

2

步骤1- 创建一个名为python的文件夹

步骤2- 使用pip3安装requests到python文件夹中

步骤3- 压缩python文件夹

步骤4- 在AWS Lambda函数中创建新层,并上传此压缩文件

步骤5- 将此层添加到您的Lambda函数中


1

所以这就是在我的情况下解决的方法

enter image description here

Handler :: "yfinance_lamdba.lambda_handler"

上述代码行中,

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

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

1
欢迎来到SO!我没有完全理解你的答案。你能否编辑一下,让你的建议更加清晰明了?谢谢! - My Koryto
1
添加了更多信息,如果您需要进一步澄清,请告诉我@MyKoryto。 - chaitanya kiran
Python 3.7也可以使用,足够用于快速原型开发。 - Fede Mika

1

0

如果您忘记将某些内容添加到Lambda层中,则通常会发生这种情况。我尝试复制我的一个Lambda函数,但忘记导入我旧的Lambda函数中拥有的Lambda层,因此在将文件导入层后,API开始正常工作。 也许这可以帮助其他人。


您的回答可以通过提供额外的支持信息来改善。请点击[编辑]以添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是否正确。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

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

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

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

0
我认为最好的方法是使用无服务器框架进行Lambda部署。它非常适应各种插件。你可以创建一个基本的Python Lambda函数:
serverless create --template aws-python3 --path python_example_service

它还将创建基本的serverless.yml文件。您可以使用插件:serverless-python-requirements。它会将requiremnts.txt文件中列出的所有包添加到lambda zip中。这通常是您为Python应用程序声明依赖项的方式。请确保serverless.yml包含该插件。
plugins:
  - serverless-python-requirements

显然,你需要使用以下命令来安装插件:
serverless plugin install --name serverless-python-requirements

你可以使用以下方式部署 Lambda:
serverless deploy --region us-west-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接