2016-02-29 3 views
2

У меня есть функция AWS Lambda, которая использует oauth2client и SignedJwtAssertionCredentials.AWS Лямбда не обнаруживает pyopenssl

Я установил свои требования локально (в корне) моего каталога функций Lambda.

requirements.txt

boto3==1.2.5 
gspread==0.3.0 
oauth2client==1.5.2 
pyOpenSSL==0.15.1 
pycrypto==2.6.1 

Моя лямбда-функция выглядит следующим образом:

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" 
} 

От все, что я читал в Интернете, мне сказали, что мне нужно кипящий пиропенсль. Тем не менее, у меня уже есть установленный и pycrypto.

Есть ли что-то, что мне не хватает?

ответ

2

Похоже, это старовато вопрос, но если вы все еще ищете ответ:

Это происходит потому, что один или несколько зависимостей для pyopenssl является уроженцем пакет или имеют собственные привязки (криптография является зависимостью pyopenssl и имеет зависимость от libssl), которая не скомпилирована для целевой платформы.

К сожалению, процесс зависит от того, как получить скомпилированные версии. Самый простой способ (который работает только тогда, когда его другим на платформах, не пропуская .so библиотеки) заключается в следующем:

  1. Создание EC2 хоста (используйте t2.micro и AWS AMI Image)
  2. Установить питон и virtualenv
  3. Создание виртуального окр
  4. Установка вашей целевой библиотеки
  5. застегивать virtualenv virtualenv/сайт-пакеты и virtualenv/расст-пакеты и перемещать их машину
  6. Отклонить машина изображения

Этот почтовый индекс затем должен быть расширен до вашего лямбда-молнии перед загрузкой. Результатом будут необходимые пакеты, находящиеся в корне вашего zip-файла (не в папках сайтов или пакетов dist-пакетов)

Для простых зависимостей это работает, если вам требуются также собственные библиотеки (например, для Numpy или Scipy), вам нужно будет использовать более сложные подходы, такие как описанные здесь: http://thankcoder.com/questions/jns3d/using-moviepy-scipy-and-numpy-in-amazon-lambda

Смежные вопросы