Comment puis-je résoudre les erreurs « Autorisation refusée » ou « Unable to import module » lorsque je télécharge un package de déploiement Lambda ?

Lecture de 5 minute(s)
0

Lorsque je télécharge un package de déploiement AWS Lambda, le message d’erreur « Autorisation refusée » ou « Unable to import module » s’affiche.

Brève description

Le service Lambda nécessite des autorisations de lecture globales sur les fichiers de code et toutes les bibliothèques dépendantes du package de déploiement. Si vous ne configurez pas le package de déploiement Lambda avec les autorisations de sécurité appropriées, Lambda renvoie une erreur lorsque vous essayez de télécharger le fichier. Les erreurs Autorisation refusée et Unable to import module se produisent fréquemment lorsque les applications d’intégration continue créent des packages de déploiement.

Pour les environnements d’exécution interprétés comme Python, l’autorisation correcte pour les fichiers du package de déploiement est 644. Pour les dossiers du package de déploiement, l’autorisation correcte est 755.

Pour les environnements d’exécution compilés comme Go, l’autorisation correcte pour les fichiers exécutables et les répertoires d’un package de déploiement est 755 dans la notation numérique des autorisations Unix.

Remarque : comme Lambda utilise des autorisations POSIX, il est recommandé de créer des packages de déploiement Lambda avec un système d’exploitation (SE) conforme à POSIX. Les systèmes d’exploitation compatibles sont Linux, Unix ou macOS. L’égalité entre le modèle d’autorisations de l’environnement de génération et l’environnement d’exécution de Lambda réduit les risques de problèmes d’autorisations.

Pour résoudre un problème d’autorisations en tant qu’utilisateur Windows, effectuez l’une des tâches suivantes pour configurer un environnement Linux :

Résolution

Localisation du fichier ou du dossier à l’origine de l’erreur

Selon le langage de programmation que vous avez utilisé pour écrire le code de la fonction Lambda, la cause de l’erreur peut ne pas être clairement définie dans le message d’erreur.

Par exemple, un message d’erreur de la fonction Node.js répertorie le nom du fichier ou du dossier à l’origine de l’erreur. En revanche, le message d’erreur d’une fonction Python ne répertorie pas le nom du fichier ou du dossier à l’origine de l’erreur.

Exemple d’erreur d’autorisation refusée pour la fonction Lambda Node.js

{  "errorMessage": "EACCES: permission denied, open '/var/task/index.js'",      "errorType": "Error",  
    "stackTrace": [  
    "Object.fs.openSync (fs.js:641:18)",  
    "Object.fs.readFileSync (fs.js:509:33)",  
    "Object.Module._extensions..js (module.js:578:20)",  
    "Module.load (module.js:487:32)",  
    "tryModuleLoad (module.js:446:12)",  
    "Function.Module._load (module.js:438:3)",  
    "Module.require (module.js:497:17)",  
    "require (internal/module.js:20:19)"  
  ]   
}

Exemple d’erreur d’une fonction Lambda Python incapable d’importer le module

« Unable to import module 'index' : No module named index »

Pour corriger cette erreur, consultez Comment puis-je résoudre l’erreur « Unable to import module » qui s’affiche lorsque j’exécute du code Lambda en Python ?

Si le package de déploiement Lambda n’est pas Amazon Linux 2 ou Amazon Linux 2023, vous devez configurer la compatibilité avec les versions d’Amazon Linux. Pour ce faire, définissez les paramètres suivants lors de l’installation du package. L’exemple suivant utilise un système d’exploitation Python 3.12 et des bibliothèques NumPy dans le même dossier où se trouve la fonction Lambda :

pip3 install --platform manylinux2014_x86_64 --target . --python-version 3.12 --only-binary=:all: numpy

En fonction de votre cas d’utilisation, ajustez les valeurs suivantes : 

  • La valeur platform manylinux2014_x86_64 spécifie la plateforme du package.
  • La valeur python-version 3.12 indique que le package est compatible avec la version Python spécifiée. Ajustez cette valeur en fonction de la version d’exécution Python que vous ciblez dans Lambda.
  • Le paramètre only-binary=:all indique à pip de ne télécharger que les fichiers binaires. Ainsi, il est possible de s’assurer que le package est compatible avec l’environnement d’exécution Lambda.

Exemple d’erreur de fonction Python Lambda pour des bibliothèques externes qui ne disposent pas des autorisations requises

« Unable to import module 'index' : No module named requests »

Pour vérifier les autorisations sur tous les fichiers et dossiers du fichier .zip du package de déploiement, exécutez la commande zipinfo dans l’interface de ligne de commande (CLI) :

zipinfo lambda-package.zip

Remarque : remplacez lambda-package.zip par le nom de fichier .zip du package de déploiement.

Exemple de réponse à la commande zipinfo

Archive:  lambda-package.zipZip file size: 305 bytes, number of entries: 1-r--------  3.0 unx      188 tx defN 21-Feb-13 20:48 example.py
1 file, 188 bytes uncompressed, 135 bytes compressed:  28.2%

Remarque : dans l’exemple précédent, l’autorisation sur example.py est -r--------, ou 400 en notation numérique des autorisations Unix. Mettez à jour l’autorisation sur le fichier avec la valeur 644. Pour plus d’informations, consultez Notation of traditional Unix permissions sur le site Web de Wikipedia.

Mise à jour des autorisations sur le package de déploiement

Remarque : les commandes suivantes ne fonctionnent que pour Linux, Unix et macOS.

  1. Pour décompresser les fichiers et les dossiers du package de déploiement dans un dossier temporaire, exécutez la commande suivante dans l’interface de la ligne de commande :

    mkdir temp-folder; unzip lambda-package.zip -d temp-folder ;cd temp-folder;ls -l

    Remarque : remplacez lambda-package.zip par le nom de fichier du package de déploiement et temp-folder par le nom du dossier temporaire.

  2. Mettez à jour les autorisations sur les fichiers de la bibliothèque.
    Remarque : pour rendre les répertoires exécutables et tous les fichiers et dossiers du package de déploiement décompressé lisibles par n’importe quel utilisateur, exécutez la commande chmod suivante :

    $ sudo chmod 644 $(find -type f) && chmod 755 $(find -type d)

    Pour rendre les fichiers du package de déploiement décompressés exécutables dans les environnements d’exécution compilés, exécutez la commande suivante :

    $ chmod 755 -R
  3. Une fois les autorisations définies, exécutez la commande suivante pour reconditionner les fichiers et le dossier dans un nouveau fichier .zip :

    zip -r new-lambda-package.zip *
  4. Téléchargez le nouveau package de déploiement.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 4 mois