我对 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
当尝试打印时,它给我一个语法错误。抱歉格式化了。有什么建议吗?
requests 不是 AWS lambda 中的标准库。
有两种方法可以解决这个问题:
1- 从 Botocore 库堆栈中将其导入为:(给出答案后不推荐使用的选项)
from botocore.vendored import requests
这里有一个可以在 lambda 中导入的所有可用库的列表
2- 使用 virtualenv 创建部署包。
N.B
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)
urllib3 1.26.6 六 1.16.0 s3传输0.6.0 请求2.26.0 python-dateutil 2.8.2 jmespath 1.0.1 国际DNA 2.10 字符集标准化器 2.0.12 夏代4.0.0 证书 2020.11.8 博托核心 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
然后,在其中安装您需要的 Python 库。您可以使用单个库来完成此操作:
$ pip install --target . requests
或使用库列表(requirements.txt)
$ pip install --target . -r requirements.txt
最后,拉上所有东西的拉链。
... 在 Bash 中:
$ zip -r dependencies.zip ../python
...在 Powershell 中:
$ Compress-Archive -Path . -DestinationPath dependencies.zip
2。创建图层
您可以在 AWS 控制台或 CLI 中执行此操作。请遵循这些说明。
3.将图层添加到 lambda 函数
您可以使用 lambda 页面或 CLI 中的
Add a layer
选项来执行此操作。请遵循这些说明。
这是因为它在 lambda 中运行时缺少 requests 库 - 很可能它已全局安装在您的本地计算机上。如果你运行:
pip install requests -t .
pip install boto3 -t .
pip install json -t .
您想使用图层。您下载一个 python 模块,例如 pip install requests -t .,然后只需将所有模块文件夹放入名为 python 的文件夹中,然后将其压缩并上传到 aws 控制台的 lambda 层部分。将其添加到您的 lambda 函数中,它将起作用。目录结构非常重要,因此对于请求,当您解压缩文件夹时,它应该是 RequestLayer/python/requests/"requests 以及属于该包的所有其他文件夹"。 这家伙一步一步给出了很好的。
使用
urllib3
代替
虽然
requests
不是 AWS lambda 中的标准库,但标准库中存在替代方案,可以让您避免 Lambda 层。
如果您检查 Nilo_DS 链接的库列表 (https://gist.github.com/gene1wood/4a052f39490fae00e0c3),您会发现
urllib3
可用。
import requests
requests.post(<url>, data=json.dumps(<message>))
可以重写为
import urllib3
http = urllib3.PoolManager()
http.request('POST', '<url>',
headers={'Content-Type': 'application/json'},
body=json.dumps(<message>))
以及 get 请求的类似更改。
对于未来使用 Python 的读者:如果您直接在 Cloud9 中创建 Lambda 应用程序,您会注意到您的应用程序有一个虚拟环境。要安装 requests(或任何其他与此相关的包),请执行以下操作:
source venv/bin/activate
激活您的虚拟环境pip3 install requests
安装请求就是这样。您现在可以正常使用带有
import requests
的请求。
“requests”模块不在您尝试安装的“zip”文件中。你必须通过 'pip install module_name(such as requests) -t '将所有模块放入 zip 文件中。
你必须在Python代码中这样命名你的lambda:
def lambda_function(event, context):
并在 lambda 控制台处理程序中:
main.lambda_function
对于您的请求错误,在上传到 lambda 之前,您的 .zip 中必须包含该模块的文件夹。