编程语言
首页 > 编程语言> > python-AWS Lambda未检测到pyopenssl

python-AWS Lambda未检测到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

标签:amazon-web-services,openssl,aws-lambda,python
来源: https://codeday.me/bug/20191119/2032509.html