Comment dépanner les erreurs « Autorisation refusée » ou « Impossible d'importer le module » lors du chargement d'un package de déploiement Lambda ?

Date de la dernière mise à jour : 19/05/2021

Lorsque j'essaie de télécharger mon package de déploiement AWS Lambda, je reçois une erreur « autorisation refusée » ou « impossible d'importer le module ». Comment y remédier ?

Brève description

Lambda a besoin des autorisations de lecture globales sur les fichiers de code et toutes les bibliothèques dépendantes de votre package de déploiement. Si votre package de déploiement Lambda n'est pas configuré avec les autorisations de sécurité correctes, Lambda renvoie une erreur lorsque vous tentez de télécharger le fichier. Ces erreurs autorisation refusée et impossible d'importer le module se produisent le plus souvent lorsque des packages de déploiement sont créés par des applications d'intégration continue.

Les bonnes autorisations pour tous les fichiers exécutables dans un package de déploiement Lambda sont 644 dans la notation numérique des autorisations Unix. Pour les dossiers d'un package de déploiement, le bon paramètre d'autorisations est 755.

Remarque : étant donné que Lambda utilise les autorisations POSIX, il est recommandé d'utiliser un système d'exploitation compatible POSIX lors de la création de packages de déploiement Lambda. Par exemple : Linux, Unix ou macOS. La parité entre le modèle d'autorisations dans votre environnement de construction et l'environnement d'exécution de Lambda réduit le risque de problèmes d'autorisation.

Si vous utilisez Windows pour le développement et que vous avez besoin de résoudre un problème d'autorisations, vous pouvez configurer un environnement Linux en procédant comme suit :

Résolution

Confirmer quel fichier ou dossier est la cause de l'erreur

Selon le langage de programmation utilisé pour écrire votre code de fonction Lambda, la cause de l'erreur peut ne pas être claire dans le message d'erreur.

Par exemple, un message d'erreur de fonction Node.js répertorie le nom du fichier ou du dossier qui est la source de l'erreur. Au contraire, un message d'erreur de fonction Python ne répertorie pas le nom du fichier ou du dossier qui est la source de l'erreur.

Node.js Exemple d'erreur d'autorisation refusée de la fonction Lambda

{
  "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)"
  ]
}

Python Exemple d'erreur d'impossibilité d'importer le module de la fonction Lambda

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

Python Exemple d'erreur d'impossibilité d'importer le module de la fonction Lambda pour les bibliothèques externes qui manquent des autorisations requises

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

Pour vérifier les autorisations pour tous les fichiers et dossiers du fichier .zip du package de déploiement, exécutez la commande zipinfo suivante dans votre interface de ligne de commande (CLI) :
Important : Remplacez lambda-package.zip par le nom du fichier .zip de votre package de déploiement.

zipinfo lambda-package.zip

Exemple de réponse de la commande Zipinfo

Archive:  lambda-package.zip
Zip 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 cet exemple, les autorisations de exemple.py sont -r--------, ou 400 dans la notation numérique des autorisations unix. Les autorisations pour le fichier doivent donc être mises à jour vers 644.

Corrigez les autorisations pour votre package de déploiement

Remarque : les commandes suivantes fonctionnent uniquement pour les systèmes d'exploitation Linux, Unix et macOS.

1.    Pour décompresser les fichiers et dossiers de votre package de déploiement dans un dossier temporaire, exécutez la commande suivante dans votre CLI :
Important : remplacez lambda-package.zip par le nom du fichier de votre package de déploiement. Remplacez temp-folder par le nom que vous souhaitez donner au nouveau dossier temporaire.

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

2.    Mettez à jour les autorisations des fichiers de la bibliothèque.

Remarque : pour rendre tous les fichiers et dossiers du répertoire courant lisibles par n'importe quel utilisateur, exécutez la commande chmod suivante :

$ chmod 644 $(find /tmp/package_contents -type f)
$ chmod 755 $(find /tmp/package_contents -type d)

3.    Après avoir corrigé les autorisations, reconditionnez les fichiers et le dossier dans un nouveau fichier .zip en exécutant la commande suivante :

zip -r new-lambda-package.zip *

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?