python - AWS Lambda 未检测到 pyopenssl

标签 python amazon-web-services openssl aws-lambda

我有一个使用 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 的一个或多个依赖项是 native 包或具有未针对目标平台编译的 native 绑定(bind)(加密是 pyopenssl 的依赖项并且依赖于 libssl)。

不幸的是,获取编译版本的过程各不相同。最简单的方法(仅当平台不同且不缺少 .so 库时才有效)是:

  1. 创建一个 ec2 主机(使用 t2.micro 和 AWS AMI Image)
  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

关于python - AWS Lambda 未检测到 pyopenssl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35707138/

相关文章:

python selenium - 在网站上查找文本并将其存储在变量中

json - AWS CLI-为参数分配多个值的语法是什么

python - Elastic Beanstalk 中的导入错误 : No module named django. core.wsgi

c++ - 如何在 AES_set_encrypt_key 中使用 openssl 中的自定义 key

sockets - 如何在 openssl 中管理错误队列(SSL_get_error 和 ERR_get_error)

python - 如何使用自定义 Django 后端?

python - pandas 分组数据框 - python

python - 如何检查网站的 SSLv2 或 SSLv3?

python - 在附加到列表之前展平列表

json - 同一安全组的 CidrIp json 模板