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

ins*_*son 11 amazon-web-services python-2.7 aws-lambda

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

该文件的名称是lambda_function.py; 我已经检查了stackoverflow上的类似问题,有些人提到我必须更改文件命名.但它没有帮助.以下是python方法的命名方式:
在此输入图像描述 这是我得到的错误: START RequestId: cf24e9be-bbef-11e7-97b4-d9b586307f3e Version: $LATEST Unable to import module 'lambda_function': No module named requests 当尝试打印时,它给我一个语法错误.抱歉格式化.有什么建议?

Unb*_*ess 33

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

urllib3 1.26.6 六 1.16.0 s3transfer 0.6.0 请求 2.26.0 python-dateutil 2.8.2 jmespath 1.0.1 idna 2.10 字符集标准化器 2.0.12 chardet 4.0.0 certifi 2020.11.8 botocore 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
Run Code Online (Sandbox Code Playgroud)

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

$ pip install --target . requests
Run Code Online (Sandbox Code Playgroud)

或使用库列表(requirements.txt)

$ pip install --target . -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

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

...在重击中:

$ zip -r dependencies.zip ../python
Run Code Online (Sandbox Code Playgroud)

...在 Powershell 中:

$ Compress-Archive -Path . -DestinationPath dependencies.zip
Run Code Online (Sandbox Code Playgroud)

2. 创建图层

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


3. 将层添加到 lambda 函数

您可以使用Add a layerlambda 页面或 CLI 中的选项来执行此操作。请遵循这些说明


Nil*_*_DS 24

请求不是AWS lambda中的标准库.

所以有两种解决方法:

1-从Botocore库堆栈导入它:

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

这里有一个列表,列出了要在lambda中导入的所有可用库

2- 使用virtualenv 创建部署包.

  • 选项 1 喊出此消息: /var/runtime/botocore/vendored/requests/api.py:67: DeprecationWarning: 您正在使用 'botocore.vendored.requests' 中的 get() 函数。这不是 botocore 中的公共 API,将来会被删除。此外,此版本的请求已过时。我们建议您安装 requests 包,直接“导入 requests”,并使用 requests.get() 函数。 (4认同)
  • 根据警告的更新版本:“此依赖项已从 Botocore 中删除,并将在 2020 年 3 月 31 日后从 Lambda 中删除。” 坚持选择 2。 (3认同)

小智 6

这是因为在lambda中运行时缺少请求库-它可能已全局安装在本地计算机上。如果您
pip install requests -t .
在与源代码相同的目录中运行: 将请求包安装在该目录中,那么您可以将其与lambda_function.py一起上传到lambda。您可能需要对boto3和json执行相同的操作:
pip install boto3 -t .
pip install json -t .


小智 5

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


小智 -9

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

def lambda_function(event, context):
Run Code Online (Sandbox Code Playgroud)

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

main.lambda_function
Run Code Online (Sandbox Code Playgroud)

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