我有一个使用 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。
有什么我想念的吗?
最佳答案
看起来这个问题有点老了,但如果你还在寻找答案:
发生这种情况是因为 pyopenssl 的一个或多个依赖项是 native 包或具有未针对目标平台编译的 native 绑定(bind)(加密是 pyopenssl 的依赖项并且依赖于 libssl)。
不幸的是,获取编译版本的过程各不相同。最简单的方法(仅当平台不同且不缺少 .so 库时才有效)是:
- 创建一个 ec2 主机(使用 t2.micro 和 AWS AMI Image)
- 安装python和virtualenv
- 创建一个虚拟环境
- 安装目标库
- 压缩 virtualenv virtualenv/site-packages 和 virtualenv/dist-packages 并将它们移出机器
- 丢弃机器镜像
此 zip 需要在上传前扩展到您的 lambda zip。结果将是位于 zip 文件根目录中的所需包(不在 site-packages 或 dist-packages 文件夹中)
对于简单的依赖项,这是有效的,如果您还需要本地库(例如 Numpy 或 Scipy),您将需要采取更精细的方法,例如此处概述的方法:http://thankcoder.com/questions/jns3d/using-moviepy-scipy-and-numpy-in-amazon-lambda
关于python - AWS Lambda 未检测到 pyopenssl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35707138/