AWS Lambda 未检测到 pyopenssl
AWS Lambda not detecting pyopenssl
我有一个使用 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 的一个或多个依赖项是本机包或具有本机绑定(加密是 pyopenssl 的依赖项并且依赖于 libssl)未针对目标平台编译。
不幸的是,获取编译版本的过程各不相同。最简单的方法(只有当它在平台上不同,而不是缺少 .so 库时才有效)是:
- 创建 ec2 主机(使用 t2.micro 和 AWS AMI 映像)
- 安装 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
我有一个使用 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 的一个或多个依赖项是本机包或具有本机绑定(加密是 pyopenssl 的依赖项并且依赖于 libssl)未针对目标平台编译。
不幸的是,获取编译版本的过程各不相同。最简单的方法(只有当它在平台上不同,而不是缺少 .so 库时才有效)是:
- 创建 ec2 主机(使用 t2.micro 和 AWS AMI 映像)
- 安装 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