我有一个使用oauth2client
和SignedJwtAssertionCredentials
的AWS Lambda函数。
我已经在我的Lambda函数目录的本地(在根目录)安装了我的需求。
requirements.txt
boto3==1.2.5
gspread==0.3.0
oauth2client==1.5.2
pyOpenSSL==0.15.1
pycrypto==2.6.1
我的lambda函数如下:
import boto3
import gspread
from oauth2client.client import SignedJwtAssertionCredentials
def lambda_handler(event, context):
dynamodb = boto3.resource('dynamodb')
scope = ['https://spreadsheets.google.com/feeds']
private_key = "!--some-private-key"
google_email = "some-email"
credentials = SignedJwtAssertionCredentials(google_email, private_key, scope)
gc = gspread.authorize(credentials)
然而,在运行时,我得到以下堆栈跟踪:
{
"stackTrace": [
[
"/var/task/lambda_function.py",
20,
"lambda_handler",
"credentials = SignedJwtAssertionCredentials(google_email, private_key, scope)"
],
[
"/var/task/oauth2client/util.py",
140,
"positional_wrapper",
"return wrapped(*args, **kwargs)"
],
[
"/var/task/oauth2client/client.py",
1630,
"__init__",
"_RequireCryptoOrDie()"
],
[
"/var/task/oauth2client/client.py",
1581,
"_RequireCryptoOrDie",
"raise CryptoUnavailableError('No crypto library available')"
]
],
"errorType": "CryptoUnavailableError",
"errorMessage": "No crypto library available"
}
从我在线阅读的所有内容中,我被告知需要安装pyopenssl。但是,我已经安装了pycrypto。
我有什么遗失的吗?
答案 0 :(得分:3)
看起来这个问题有点陈旧,但如果你还在寻找答案:
这是因为pyopenssl的一个或多个依赖项是本机程序包,或者具有本机绑定(加密是pyopenssl的依赖项并且依赖于libssl),而不是为目标平台编译。
不幸的是,这个过程因编译版本而异。最简单的方法(只有在平台上有所不同,而不是缺少.so库)才能:
在上传之前,需要将此zip文件扩展为lambda zip。结果将是驻留在zip文件根目录中的必需软件包(不在site-packages或dist-packages文件夹中)
对于简单的依赖项,如果您需要本机库(例如Numpy或Scipy),则需要采用更详细的方法,例如此处概述的方法:http://thankcoder.com/questions/jns3d/using-moviepy-scipy-and-numpy-in-amazon-lambda