我是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
文件名是lambda_function.py;我已经检查了stackoverflow上的类似问题,有些人提到我必须更改文件命名。但它没有帮助。以下是python方法的命名方式:
这是我得到的错误:
START RequestId: cf24e9be-bbef-11e7-97b4-d9b586307f3e Version: $LATEST
Unable to import module 'lambda_function': No module named requests
当尝试打印时,它给我一个语法错误。抱歉格式化。有什么建议吗?
答案 0 :(得分:15)
请求不是AWS lambda中的标准库。
有两种解决方法:
1-将其从Botocore库堆栈导入为:
\Users\<Name>\AppData\Roaming\Netbeans\
Here有一个列表,列出了要在lambda中导入的所有可用库
2- Create一个包含virtualenv的部署包。
答案 1 :(得分:5)
这是因为它在lambda中运行时缺少请求库 - 可能是它在本地计算机上全局安装。如果您运行:
pip install requests -t .
在与源代码相同的目录中,它将在该目录中安装请求包,然后您可以将其与lambda_function.py一起上载到lambda。您可能需要对boto3和json执行相同的操作:
pip install boto3 -t .
pip install json -t .
答案 2 :(得分:0)
您要使用Layers。您下载了一个python模块,例如 pip install requests -t。,然后只需将所有模块文件夹放入一个名为python的文件夹中,然后将其压缩并上传到aws控制台的lambda层部分即可。将其添加到您的lambda函数中,它将起作用。 dir结构非常重要,因此对于请求,当您解压缩该文件夹时,它应该是RequestLayer / python / requests /“ requests以及该软件包中所有其他文件夹”。 This guy gives a good step by step。
答案 3 :(得分:0)
供以后使用Python的读者使用:如果直接在Cloud9中创建Lambda应用程序,则会注意到您的应用程序有一个虚拟环境。要安装请求(或与此相关的任何其他软件包),请执行以下操作:
source venv/bin/activate
以激活您的虚拟环境pip3 install requests
以安装请求就是这样。现在,您可以按照常规使用带有import requests
的请求了。
答案 4 :(得分:0)
如果要包括requests
之类的库,则可以使用lambda的图层。
1。创建邮政编码:
这是一个zip,其中包含您希望lambda函数使用的所有库。
首先,创建python
文件夹:
$ mkdir python
$ cd python
然后,在其中安装所需的Python库。 您可以使用一个库来完成此操作:
$ pip install --target . requests
或带有库列表(requirements.txt)
$ pip install --target . -r requirements.txt
最后,压缩所有内容:
$ zip -r dependencies.zip .
2。创建一个图层
3。将图层添加到lambda函数
答案 5 :(得分:-1)
你必须在python代码中以这种方式命名你的lambda:
def lambda_function(event, context):
并在lambda控制台处理程序中:
main.lambda_function
对于您的请求错误,在上传到lambda之前,必须在.zip上包含该模块的文件夹。