2 votes

Erreur lors de l'importation d'un module python cffi depuis la couche AWS Lambda

J'ai un problème pour importer le argon2-cffi module python (version 20.1.0) d'une couche AWS Lambda dans une fonction AWS Lambda.

Cela semble s'appliquer à tous les paquets qui ont C comme base, car j'ai testé cela avec pandas et a obtenu les mêmes résultats.

Ma configuration cloudformation pour la couche est la suivante :

  MyLib:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: my-lib
      Description: In-house and 3rd party dependencies for my app.
      ContentUri: lambdas/lib/.
      CompatibleRuntimes:
        - python3.8

et la structure des dossiers à l'intérieur de /lib est la suivante :

lib
 python
    app
       ...
    lib/python3.8/site-packages
        argon2
           ...
        argon2_cffi-20.1.0.dist-info
           ...
        ...
        stdnum
            ...
 requirements.txt

conformément à recommandations de l'AWS où le dossier python/app contient ma bibliothèque personnalisée et le dossier python/lib/python3.8/site-packages contient des paquets de tiers.

Je le sais car argon2 dépend du code C, il doit être installé sur l'environnement d'exécution dans lequel la fonction Lambda qui l'utilise sera hébergée. J'utilise donc une image docker fournie par AWS pour installer les paquets dans lib/python3.8/site-packages en utilisant la commande

docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"

La fonction lambda que j'essaie d'exécuter est configurée dans le modèle de cloudformation comme suit

  AuthorizerFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      CodeUri: lambdas/handlers
      Handler: authorizer.handler
      Runtime: python3.8
      ...
      Layers:
        - !Ref MyLib

et commence par ces importations :

# authorizer.py

import app.utils as utils
import stdnum
from argon2 import PasswordHasher

Mais lorsque j'essaie de l'exécuter, j'obtiens l'erreur suivante

[ERROR] Runtime.ImportModuleError: Unable to import module 'authorizer': No module named 'argon2._ffi'

ce qui signifie que app y stdnum sont tous deux importés avec succès, mais pas argon2 .

Une idée de ce qui pourrait se passer ?

Je serais également heureux de recevoir des suggestions sur une autre bibliothèque de hachage avec un algorithme de hachage testé et éprouvé.

MISE À JOUR : Mise à jour de mon cffi , pip y setuptools comme il est recommandé aquí n'a pas fait l'affaire.

MISE À JOUR 2 : Je peux voir que l'argon installé à l'aide de la commande docker est celui qui est compatible avec linux, puisque la sortie comprend ces lignes :

Collecting argon2-cffi==20.1.0
  Downloading argon2_cffi-20.1.0-cp35-abi3-manylinux1_x86_64.whl (97 kB)

2voto

Nanna Points 409

D'accord, la réponse à mon problème est un peu embarrassante. Je vais tout de même la poster ici au cas où elle permettrait à quelqu'un de mieux comprendre.

J'utilise git pour le contrôle de la source et j'ai utilisé un modèle de VS Code pour le fichier .gitignore dossier. De plus, j'ai mis en place un processus de construction et de déploiement automatique, qui construit l'application Lambda en fonction du contenu du repo git.

Après avoir essayé pendant des jours de déboguer ce problème, j'ai découvert que .so n'étaient pas présents dans la base de données argon2_cffi dans la couche Lambda. Le coupable était le fichier .gitignore qui contient ces lignes :

# C extensions
*.so

Il n'est donc pas étonnant qu'aucun des paquets python basés sur le langage C ne fonctionne !

J'ai supprimé ces lignes de .gitignore et a commis tous les .so dans le repo qui n'était jamais arrivé jusqu'à la couche Lambda, et maintenant tout fonctionne bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X