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

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

我最近开始使用 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 并且位于根目录中)。

或者,这似乎可能是日志的问题。我仔细检查了我的权限,并且我有能力使用所有资源创建日志。还有其他想法可能是什么问题吗?

python amazon-web-services logging aws-lambda amazon-cloudwatch
10个回答
60
投票
lambda 中默认不提供

requests
库。看起来您正在尝试将其导入到您的函数/库中的某个位置。要导入它,您需要以下行:

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 中的请求库的供应版本将被删除。请参阅此博文了解更多详细信息。


17
投票

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

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

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 函数中,您应该能够完美地导入您的模块。


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

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


10
投票

勾选此答案

如果您在 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

2
投票

步骤1-mkdir python

步骤2- pip3 install -t python requests

step3- zip python 文件夹

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

第 5 步 - 将这一层添加到您的 lambda 函数中


1
投票

这就是我的案例的解决方案

处理程序::“yfinance_lamdba.lambda_handler”

在上面的行中

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

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

0
投票

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

AWS 从 Botocore 中删除了

requests
的供应版本。

步骤:

  1. cmd >>

    pip install requests

  2. Python代码:

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

0
投票

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

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

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


0
投票

如果您错过了要添加到 lambda 层的内容,通常会发生这种情况。我尝试复制我的一个 lambda 函数,但忘记导入旧 lambda 函数中的 lambda 层,因此在将文件导入到层中后,API 开始正常工作。 也许这对任何人都有帮助。


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
© www.soinside.com 2019 - 2024. All rights reserved.