web-dev-qa-db-fra.com

Erreur d'importation depuis cyptography.hazmat.bindings._constant_time import lib

J'essaie donc de créer une fonction aws lambda, de me connecter à une instance et de faire des choses. Et le script fonctionne bien en dehors de lambda, mais quand je le conditionne en utilisant les mêmes instructions que cela https://aws.Amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/ cela ne fonctionne pas. Il jette cette erreur.

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
19
Luis F Hernandez

Il manque un paramètre aux commandes Zip de ce didacticiel. J'ai rencontré ce problème aujourd'hui avec pysftp, qui est construit sur paramiko. libffi-72499c49.so.6.0.4 se trouve dans un répertoire de points cachés à l'intérieur de lib64/python2.7/site-packages/.libs_cffi_backend. Selon la façon dont vous avez compressé les dépendances dans votre virtualenv, vous avez peut-être exclu par inadvertance ce répertoire.

  1. Tout d'abord, assurez-vous que libffi-devel et openssl-devel sont installés sur votre instance Amazon Linux , sinon le module de cryptographie risque de ne pas se compiler correctement.

    Sudo yum install libffi-devel openssl-devel
    

Si ces packages n'ont pas été installés auparavant, supprimez et reconstruisez votre virtualenv.

  1. Assurez-vous que lorsque vous zippez vos packages de site que vous utilisez "." au lieu de '*', sinon vous n'incluerez pas les fichiers et répertoires qui sont cachés car leurs noms commencent par un point.

    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 .
    
25
Gabriel Totusek

Mes 2 cents: si vous voulez construire et tester votre fonction lambda dans l'environnement aussi similaire que possible à lambda réel mais toujours sous votre contrôle, je suggère d'utiliser images Docker de LambCI . Ils sont basés sur des vidages du système de fichiers lambda d'origine. Ils ont également des variantes spécifiques à la construction (balises build-python2.7 et build-python3.6 sont les plus intéressants pour nous). Ces images ne sont pas très petites - plus de 500 Mo - mais elles vous permettent d'éviter tout mal de tête lors de la construction.

L'avantage important sur Amazon Linux est que toutes les versions de package, etc. sont les mêmes que sur le vrai lambda.

Voici comment je me suis construit:

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

Pour l'automatiser avec GitLab CI, demandez-lui simplement d'utiliser la même image de docker et de mettre ces commandes dans la section de script de déploiement:

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: ...
5
MarSoft