Come posso risolvere gli errori "autorizzazione negata" o "impossibile importare il modulo" durante il caricamento di un pacchetto di implementazione Lambda?

5 minuti di lettura
0

Quando carico il mio pacchetto di implementazione AWS Lambda, ricevo un errore "autorizzazione negata" o "impossibile importare il modulo".

Breve descrizione

Lambda richiede autorizzazioni globali in lettura sui file di codice e su tutte le librerie dipendenti contenute nel pacchetto di implementazione. Se non configuri il pacchetto di implementazione Lambda con le autorizzazioni di sicurezza corrette, Lambda restituisce un errore quando provi a caricare il file. Gli errori autorizzazione negata e impossoibile importare modulo si verificano in genere quando le applicazioni per l’integrazione continua creano pacchetti di implementazione.

Per i runtime che vengono interpretati, come Python, l'autorizzazione corretta per i file nel pacchetto di implementazione è 644. Per le cartelle nel pacchetto di implementazione, l'autorizzazione corretta è 755.

Per i runtime compilati, come Go, l'autorizzazione corretta per i file eseguibili e le directory di un pacchetto di implementazione è 755 nella notazione numerica dei permessi Unix.

Nota: poiché Lambda utilizza le autorizzazioni POSIX, è consigliabile utilizzare un sistema operativo (OS) conforme a POSIX quando si creano pacchetti di implementazione Lambda. I sistemi operativi conformi sono Linux, Unix o macOS. L'equiparazione tra il modello di autorizzazioni per l'ambiente di compilazione e l'ambiente runtime di Lambda riduce la possibilità di problemi relativi alle autorizzazioni.

Per risolvere un problema di autorizzazioni come utente Windows, completa una delle seguenti attività per configurare un ambiente Linux:

Soluzione

Trova il file o la cartella che causano l'errore

A seconda del linguaggio di programmazione utilizzato per scrivere il codice della funzione Lambda, la causa dell'errore potrebbe non essere chiara nel messaggio di errore.

Ad esempio, un messaggio di errore della funzione Node.js elenca il nome del file o della cartella che è l'origine dell'errore. Tuttavia, un messaggio di errore di una funzione Python non elenca il nome del file o della cartella che è l'origine dell'errore.

Esempio di errore di autorizzazione negata della funzione 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)"  
  ]   
}

Esempio di errore impossibile importare modulo di una funzione Lambda in Python

"Impossibile importare modulo 'index': Nessun modulo denominato index"

Per risolvere questo errore, consulta Come posso risolvere l'errore "Impossibile importare modulo" che ricevo quando eseguo il codice Lambda in Python?

Se il tuo pacchetto di implementazione Lambda non è Amazon Linux 2 o Amazon Linux 2023, è necessario garantire la compatibilità con le versioni di Amazon Linux. A tal fine, utilizza i seguenti parametri quando installi il pacchetto. L'esempio seguente utilizza un sistema operativo Python 3.12 e le librerie NumPy nella stessa cartella della funzione Lambda:

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

In base al caso d'uso, adatta i seguenti valori: 

  • Il valore platform manylinux2014_x86_64 specifica la piattaforma del pacchetto.
  • Il valore python-version 3.12 indica che il pacchetto è compatibile con la versione Python specificata. Adegua questo valore in base alla versione runtime di Python utilizzata come target in Lambda.
  • Il parametro only-binary=:all indica al pip di scaricare solo i file binari. Ciò assicura che il pacchetto sia compatibile con l'ambiente runtime di Lambda.

Esempio di errore della funzione Lambda di Python per librerie esterne prive delle autorizzazioni richieste

"Impossibile importare modulo 'index': Nessun modulo denominato requests"

Per verificare le autorizzazioni per tutti i file e le cartelle nel file .zip del pacchetto di implementazione, esegui il comando zipinfo nell'interfaccia a riga di comando (CLI):

zipinfo lambda-package.zip

Nota: sostituisci lambda-package.zip con il nome del file .zip del pacchetto di implementazione.

Esempio di risposta al comando 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%

Nota: nell'esempio precedente, l’autorizzazione per example.py è -r--------, o 400 nella notazione numerica dei permessi Unix. Aggiorna l'autorizzazione per il file a 644. Per ulteriori informazioni, consulta la sezione Notation of traditional Unix permissions sul sito Web di Wikipedia.

Aggiorna le autorizzazioni per il tuo pacchetto di implementazione

Nota: i seguenti comandi funzionano solo per Linux, Unix e macOS.

  1. Per decomprimere i file e le cartelle all'interno del pacchetto di implementazione in una cartella temporanea, esegui il seguente comando nella CLI:

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

    Nota: sostituisci lambda-package.zip con il nome del file del pacchetto di implementazione e la cartella temp con un nome per la cartella temporanea.

  2. Aggiorna le autorizzazioni dei file della libreria.
    Nota: per rendere le directory eseguibili e tutti i file e le cartelle nel pacchetto di implementazione decompresso leggibili da qualsiasi utente, esegui il comando chmod:

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

    Per rendere eseguibili i file del pacchetto di implementazione decompressi per i runtime compilati, esegui il comando seguente:

    $ chmod 755 -R
  3. Dopo aver corretto le autorizzazioni, esegui il comando seguente per ricreare il pacchetto inserendo i file e la cartella in un nuovo file .zip:

    zip -r new-lambda-package.zip *
  4. Carica il nuovo pacchetto di implementazione.

AWS UFFICIALE
AWS UFFICIALEAggiornata 4 mesi fa