AWS Lambda 未检测到 pyopenssl

AWS Lambda not detecting pyopenssl

我有一个使用 oauth2clientSignedJwtAssertionCredentials 的 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 库时才有效)是:

  1. 创建 ec2 主机(使用 t2.micro 和 AWS AMI 映像)
  2. 安装 python 和 virtualenv
  3. 创建虚拟环境
  4. 安装目标库
  5. 压缩 virtualenv virtualenv/site-packages 和 virtualenv/dist-packages 并将它们移出机器
  6. 丢弃机器映像

此 zip 需要在上传前扩展为您的 lambda zip。结果将是驻留在 zip 文件根目录中的所需包(不在 site-packages 或 dist-packages 文件夹中)

对于简单的依赖项,这是有效的,如果您还需要本机库(例如 Numpy 或 Scipy),您将需要采取更详细的方法,例如此处概述的方法:http://thankcoder.com/questions/jns3d/using-moviepy-scipy-and-numpy-in-amazon-lambda