2016-02-29 83 views
2

我有一个AWS Lambda函数,它使用oauth2clientSignedJwtAssertionCredentialsAWS Lambda未检测到pyopenssl

我已经在我的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。

有什么我失踪了吗?

回答

2

看起来这是一个有点老问题,但如果你还在寻找一个答案:

这是因为一个或多个依赖关系pyopenssl的是本机包或具有天然的绑定(密码是pyopenssl的一个依赖项,并且依赖于libssl),该目录不是针对目标平台编译的。

不幸的是,这个过程因如何获得编译版本而异。 (工作仅当它在平台的不同,不会遗漏。所以库)最简单的方法是:

  1. 创建EC2主机(使用t2.micro和AWS AMI图像)
  2. 安装Python和的virtualenv
  3. 创建虚拟ENV
  4. 安装你的目标库
  5. 拉上了virtualenv中的virtualenv /站点包和的virtualenv/DIST-包和移动它们关闭机器
  6. 弃机图像

然后在上传之前需要将该zip文件扩展到您的lambda zip中。结果将是所需的软件包驻留在您的zip文件的根目录中(不在站点包或dist-packages文件夹中)

对于简单的依赖关系,如果您还需要本地库(例如Numpy或Scipy),您需要采取更详尽的方法,例如这里列出的方法:http://thankcoder.com/questions/jns3d/using-moviepy-scipy-and-numpy-in-amazon-lambda