2
votes

erreur d'initialisation du module: impossible de charger le module natif 'Crypto.Cipher._raw_ecb' sur AWS lambda

Je crée un service à l'aide d'AWS lambda. J'utilise PyCryptodome pour le cryptage et le décryptage. Je suis en mesure de tester mon application localement, mais lorsque je télécharge sur AWS lambda pour le déchiffrer. J'obtiens l'erreur comme

Erreur d'initialisation du module: impossible de charger le module natif 'Crypto.Cipher._raw_ecb': essai de '_raw_ecb.cpython-36m-x86_64-linux-gnu.so': /var/task/Cryptodome/Util/../Cipher/ _raw_ecb.cpython-36m-x86_64-linux-gnu.so: impossible d'ouvrir le fichier d'objet partagé: aucun fichier ou répertoire de ce type, essai '_raw_ecb.abi3.so': /var/task/Cryptodome/Util/../Cipher/_raw_ecb .abi3.so: impossible d'ouvrir le fichier d'objet partagé: aucun fichier ou répertoire de ce type, essai '_raw_ecb.so': /var/task/Cryptodome/Util/../Cipher/_raw_ecb.so: en-tête ELF invalide

Mon code de déchiffrement est

    def blowfish_decrypt(enc):
        secret_key = b"somestring"
        iv = b"somerandomiv"
        logger.info("in the decrypter")
        crypt_obj = bf_cbc.new(secret_key, bf_cbc.MODE_CBC, IV=iv)
        original = crypt_obj.decrypt(base64.b64decode(enc))
        original = original.decode("utf-8")
        logger.info("decrypted")
        return original

Je suivais la ressource: https://github.com/pyinstaller/pyinstaller/issues/2125 , mais cela ne m'a pas aidé non plus.

après avoir tout appliqué les détails comme spécifié J'obtiens la même erreur ci-dessus.


2 commentaires

Comment avez-vous créé la bibliothèque et comment déployez-vous votre Lambda?


J'ai enveloppé la fonction lambda et la bibliothèque requise dans un zip, puis je l'ai téléchargé sur AWS lambda. utilisé pip install pycryptodome -t. , pour collecter la bibliothèque dans le même dossier où réside la fonction lambda.


3 Réponses :


4
votes

Il semble que votre environnement de développement local n'est pas compatible avec l'environnement d'exécution Lambda. Les bibliothèques natives utilisées par PyCryptodome ne sont pas portables dans ces deux environnements; il importe dans quel environnement la bibliothèque a été installée.

Une façon de résoudre ce problème est d'utiliser Lambci a > image docker pour créer la bibliothèque, puis l'ajouter au fichier zip. En supposant que Docker est installé, faites

docker pull lambci/lambda:build-python3.6
docker run --rm -v `pwd`:/var/task lambci/lambda:build-python3.6 pip install pycryptodome -t pycryptodome

Cela installera la lib dans l'environnement docker. Une fois la commande terminée, vous l'aurez disponible dans le répertoire local de pycryptodome.

Pour une manière plus automatisée / répétable, jetez un œil à AWS SAM et aws -sam-cli qui vous donne des commandes très utiles pour créer, empaqueter et déployer vos applications Lambda.


1 commentaires

même si je n'ai pas pu exécuter d'autres modules à partir de python 3.6, j'ai donc dû passer à 2.7 et utiliser le lambci dans a fait mon travail grâce à Milan.



1
votes

J'ai installé et exécuté cryptodome 3.9.4 sur AWS Lambda avec succès (uniquement Python 3.6).

J'ai mis le paquet dans github. Il est nécessaire de le mettre dans votre microservice.

https://github.com/grmagalhaes/python-utilities/tree / master / Crypto


0 commentaires

2
votes

Cela se produit parce que le module pycryptodome installé sur votre machine locale n'est pas compatible avec lambda. il y a donc deux façons de résoudre ce problème.

  1. Utilisez docker pour extraire l'image amazonlinux et installer pycryptodome à l'aide de pip install. puis exportez le module pycryptodome vers les couches lambda.
  2. Démarrez une instance ec2, doit être amazonlinux et y installer pycryptodome. puis téléchargez le module en utilisant winscp ou cli dans votre local. Créez un package de couche lambda à l'aide du module téléchargé et importez-le dans la couche lambda.

Assurez-vous de suivre les instructions ci-dessous pour créer un package de couches lambda. Importer des bibliothèques dans des couches lambda


0 commentaires