Wie behebe ich die Fehler „Berechtigung verweigert“ oder „Modul kann nicht importiert werden“ beim Hochladen eines Lambda-Bereitstellungspakets?

Lesedauer: 5 Minute
0

Wenn ich mein AWS Lambda-Bereitstellungspaket hochlade, erhalte ich entweder die Fehlermeldung „Genehmigung verweigert“ oder „Modul kann nicht importiert werden“.

Kurzbeschreibung

Lambda benötigt globale Leseberechtigungen für Codedateien und alle abhängigen Bibliotheken in Ihrem Bereitstellungspaket. Wenn Sie Ihr Lambda-Bereitstellungspaket nicht mit den richtigen Sicherheitsberechtigungen konfigurieren, gibt Lambda einen Fehler zurück, wenn Sie versuchen, die Datei hochzuladen. Die Fehler Zugriff verweigert und Modul kann nicht importiert werden treten häufig auf, wenn Anwendungen zur kontinuierlichen Integration Bereitstellungspakete erstellen.

Für interpretierte Laufzeiten wie Python ist die richtige Berechtigung für die Dateien im Bereitstellungspaket 644. Für Ordner im Bereitstellungspaket ist die richtige Berechtigung 755.

Für kompilierte Laufzeiten wie Go ist die korrekte Berechtigung für ausführbare Dateien und Verzeichnisse in einem Bereitstellungspaket 755 in numerischer Schreibweise für Unix-Berechtigungen.

**Hinweis:**Da Lambda POSIX-Berechtigungen verwendet, empfiehlt es sich, beim Erstellen von Lambda-Bereitstellungspaketen ein POSIX-kompatibles Betriebssystem (OS) zu verwenden. Zu den kompatiblen Betriebssystemen gehören Linux, Unix oder macOS. Die Gleichheit zwischen dem Berechtigungsmodell in Ihrer Build-Umgebung und der Laufzeitumgebung von Lambda reduziert die Wahrscheinlichkeit von Berechtigungsproblemen.

Um ein Berechtigungsproblem als Windows-Benutzer zu beheben, führen Sie eine der folgenden Aufgaben aus, um eine Linux-Umgebung einzurichten:

Behebung

Suchen Sie die Datei oder den Ordner, die den Fehler verursacht haben

Abhängig von der Programmiersprache, die Sie zum Schreiben Ihres Lambda-Funktionscodes verwendet haben, ist die Ursache des Fehlers in der Fehlermeldung möglicherweise nicht klar.

Beispielsweise listet eine Fehlermeldung der Funktion Node.js den Namen der Datei oder des Ordners auf, die die Fehlerquelle ist. Eine Python-Funktionsfehlermeldung listet jedoch nicht den Namen der Datei oder des Ordners auf, die die Fehlerquelle ist.

Beispiel für einen Node.js Lambda-Funktionsberechtigungsverweigerungsfehler

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

Beispiel für eine Python-Lambda-Funktion, Modulfehler kann nicht importiert werden

„Modul Index kann nicht importiert werden: Kein Modul mit dem Namen Index“

Um diesen Fehler zu beheben, siehe Wie behebe ich die Fehlermeldung "Modul kann nicht importiert werden", die ich erhalte, wenn ich Lambda-Code in Python ausführe?

Wenn es sich bei Ihrem Lambda-Bereitstellungspaket nicht um Amazon Linux 2 oder Amazon Linux 2023 handelt, müssen Sie die Kompatibilität mit den Amazon Linux-Versionen abgleichen. Verwenden Sie dazu die folgenden Parameter, wenn Sie das Paket installieren. Das folgende Beispiel verwendet ein Python 3.12-Betriebssystem und NumPy-Bibliotheken in demselben Ordner, in dem sich die Lambda-Funktion befindet:

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

Passen Sie je nach Anwendungsfall die folgenden Werte an: 

  • Der Wert platform manylinux2014_x86_64 gibt die Plattform des Pakets an.
  • Der Wert python-version 3.12 gibt an, dass das Paket mit der angegebenen Python-Version kompatibel ist. Passen Sie diesen Wert entsprechend der Python-Laufzeitversion an, auf die Sie in Lambda abzielen.
  • Der Parameter only-binary=:all Pip an, nur Binärdateien herunterzuladen. Dadurch wird sichergestellt, dass das Paket mit der Lambda-Laufzeitumgebung kompatibel ist.

Beispiel für einen Python-Lambda-Funktionsfehler für externe Bibliotheken, denen die erforderlichen Berechtigungen fehlen

„Modul Index kann nicht importiert werden: Kein Modul mit dem Namen Anfragen“

Um die Berechtigungen für alle Dateien und Ordner in der ZIP-Datei des Bereitstellungspakets zu überprüfen, führen Sie den Befehl zipinfo in Ihrer Befehlszeilenschnittstelle (CLI) aus:

zipinfo lambda-package.zip

**Hinweis:**Ersetzen Sie lambda-package.zip durch den .zip-Dateinamen Ihres Bereitstellungspakets.

Beispiel für eine zipinfo-Befehlsantwort

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%

**Hinweis:**Im vorherigen Beispiel ist die Berechtigung für example.py \ -r-------- oder 400 in numerischer Schreibweise für Unix-Berechtigungen. Aktualisieren Sie die Berechtigung für die Datei auf 644. Weitere Informationen finden Sie unter Notation traditioneller Unix-Berechtigungen auf der Wikipedia-Website.

Aktualisieren Sie die Berechtigungen für Ihr Bereitstellungspaket

**Hinweis:**Die folgenden Befehle funktionieren nur für Linux, Unix und macOS.

  1. Um die Dateien und Ordner in Ihrem Bereitstellungspaket in einen temporären Ordner zu entpacken, führen Sie den folgenden Befehl in Ihrer CLI aus:

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

    **Hinweis:**Ersetzen Sie lambda-package.zip durch den Dateinamen Ihres Bereitstellungspakets und temp-folder durch einen Namen für den temporären Ordner.

  2. Aktualisieren Sie die Berechtigungen der Bibliotheksdateien.
    **Hinweis:**Um die Verzeichnisse ausführbar zu machen und alle Dateien und Ordner im entpackten Bereitstellungspaket für jeden Benutzer lesbar zu machen, führen Sie den Befehl chmod aus:

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

    Führen Sie den folgenden Befehl aus, um die entpackten Bereitstellungspaketdateien für kompilierte Laufzeiten ausführbar zu machen:

    $ chmod 755 -R
  3. Nachdem Sie die Berechtigungen korrigiert haben, führen Sie den folgenden Befehl aus, um die Dateien und den Ordner erneut in eine neue ZIP-Datei zu packen:

    zip -r new-lambda-package.zip *
  4. Neues Bereitstellungspaket hochladen.

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Monaten