2016-08-15 2 views
8

Итак, я пытаюсь создать функцию aws лямбда, чтобы войти в экземпляр и сделать некоторые вещи. И скрипт отлично работает за пределами лямбда, но когда я упаковываю его, используя те же инструкции, что и этот https://aws.amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/, он не работает. Это порождает эту ошибку.Ошибка импорта из cyptography.hazmat.bindings._constant_time import lib

libffi-72499c49.so.6.0.4: cannot open shared object file: No such file or directory: ImportError 
Traceback (most recent call last): 
    File "/var/task/lambda_function.py", line 12, in lambda_handler 
    key = paramiko.RSAKey.from_private_key(key) 
    File "/var/task/paramiko/pkey.py", line 217, in from_private_key 
    key = cls(file_obj=file_obj, password=password) 
    File "/var/task/paramiko/rsakey.py", line 42, in __init__ 
    self._from_private_key(file_obj, password) 
    File "/var/task/paramiko/rsakey.py", line 168, in _from_private_key 
    self._decode_key(data) 
    File "/var/task/paramiko/rsakey.py", line 173, in _decode_key 
    data, password=None, backend=default_backend() 
    File "/var/task/cryptography/hazmat/backends/__init__.py", line 35, in default_backend 
    _default_backend = MultiBackend(_available_backends()) 
    File "/var/task/cryptography/hazmat/backends/__init__.py", line 22, in _available_backends 
    "cryptography.backends" 
    File "/var/task/pkg_resources/__init__.py", line 2236, in resolve 
    module = __import__(self.module_name, fromlist=['__name__'], level=0) 
    File "/var/task/cryptography/hazmat/backends/openssl/__init__.py", line 7, in <module> 
    from cryptography.hazmat.backends.openssl.backend import backend 
    File "/var/task/cryptography/hazmat/backends/openssl/backend.py", line 15, in <module> 
    from cryptography import utils, x509 
    File "/var/task/cryptography/x509/__init__.py", line 7, in <module> 
    from cryptography.x509.base import (
    File "/var/task/cryptography/x509/base.py", line 15, in <module> 
    from cryptography.x509.extensions import Extension, ExtensionType 
    File "/var/task/cryptography/x509/extensions.py", line 19, in <module> 
    from cryptography.hazmat.primitives import constant_time, serialization 
    File "/var/task/cryptography/hazmat/primitives/constant_time.py", line 9, in <module> 
    from cryptography.hazmat.bindings._constant_time import lib 
ImportError: libffi-72499c49.so.6.0.4: cannot open shared object file: No such file or directory 
+0

проверить версии вашей библиотеки - в частности openssl – intotecho

+0

@intotecho, как бы я это сделал? Когда я устанавливаю его, я устанавливаю его из pip. Единственные две команды, которые я делаю, это «pip install pycrypto» и «pip install paramiko», и это работает, когда я запускаю его на своем собственном сервере. Проблема возникает только тогда, когда я бросаю ее на aws lambda –

+0

'pip freeze' перечисляет все библиотеки на вашей серверной среде. Я не знаю, как проверить AWS. Вы можете спросить в блоге, где эти инструкции были опубликованы. – intotecho

ответ

17

В командах zip в этом учебнике отсутствует параметр. Сегодня я столкнулся с этой точной проблемой с pysftp, которая построена на парамико. libffi-72499c49.so.6.0.4 находится в каталоге скрытых точек внутри lib64/python2.7/site-packages/.libs_cffi_backend. В зависимости от того, как вы закрепили свои зависимости в вашем virtualenv, вы можете случайно исключить этот каталог.

  1. Во-первых, убедитесь, что libffi-разви и OpenSSL-разви установлены на вашем Amazon Linux instance, в противном случае модуль криптография не может быть компиляции правильно.

    sudo yum install libffi-devel openssl-devel 
    

Если эти пакеты не были установлены ранее, удалять и перестраивать свой virtualenv.

  1. Удостоверьтесь, что, когда вы загружаете свои сайты-пакеты, которые вы используете '.' вместо «*», иначе вы не будете включать файлы и каталоги, которые скрыты, потому что их имена начинаются с периода.

    cd path/to/my/helloworld-env/lib/python2.7/site-packages 
    zip -r9 path/to/zip/worker_function.zip . 
    cd path/to/my/helloworld-env/lib64/python2.7/site-packages 
    zip -r9 path/to/zip/worker_function.zip . 
    
+0

потрясающий! это помогло спасибо! –

+3

Спасибо за этот ответ! Для тех, кто начинает с нуля. Экземпляр Amazon Linux является абсолютно важной частью. И вы можете установить 'python-devel' и' gcc' перед 'pip install pycrypto' – warhod

+0

@warhod да! согласен, моя проблема была полностью устранена, когда я использовал экземпляр linux amazon для создания zip-файла.Lambda работает на Amazon Linux, поэтому сделайте zip и библиотеки на Amazon Linux. Это имеет смысл. –

2

Мои 2 цента: если вы хотите построить & тест вашей функции лямбда в среде, аналогично фактическому лямбда, как это возможно, но все еще под вашим контролем, я предложил бы использовать LambdaCI's Docker images. Они основаны на дампах исходной файловой системы лямбды. Также у них есть варианты, специфичные для сборки (для нас наиболее интересны теги build-python2.7 и build-python3.6). Эти изображения не очень маленькие - более 500 мб, но они позволяют избежать головной боли при строительстве.

Важное преимущество над Amazon Linux заключается в том, что все версии пакета и те же, что и на реальной лямбда.

Вот как я строить себя:

cd PROJECT_DIR 
docker run --rm -it -v "$PWD":/var/task lambci/lambda:build-python2.7 bash 
### now in docker 
mkdir deps 
pip install -t deps -r requirements.txt 
# now all dependencies for our package are installed to deps/ directory, 
# without any garbage like wheel or setuptools - unlike when using virtualenv 
zip -r archive.zip MYCODE.py MYMODULE MYMODULE2.py 
cd deps 
# it's important to use . here, not * - or else some dot-starting directories will be omitted 
zip -r ../archive.zip . 
exit 
### now locally 
# just upload archive to lambda, with or without s3 

Для автоматизации его GitLab CI, просто инструктировать его использовать тот же Docker изображение и поместить эти команды в развертывания секции сценария:

deploy: 
    stage: deploy 
    image: lambci/lambda:build-python2.7 
    script: 
     - mkdir deps 
     - pip install -t deps -r requirements.txt 
     - zip -r archive.zip MYCODE.py MYMODULE MYMODULE2.py 
     - cd deps && zip -r ../archive.zip . && cd .. 
     - aws s3 cp archive.zip ${bucket}/${key} 
     - aws lambda update-function-code --function-name ${func} --s3-bucket ${bucket} --s3-key ${key} 
    variables: 
     bucket: ... 
     key: ... 
     func: ... 
Смежные вопросы