2016-02-11 17 views
35

Sto creando un pacchetto di distribuzione Python AWA Lambda. Sto usando una richiesta di dipendenza esterna. Ho installato la dipendenza esterna utilizzando la documentazione di AWS http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html. Di seguito è riportato il mio codice Python.Errore modulo di importazione Lambda AWS in python

import requests 

print('Loading function') 

s3 = boto3.client('s3') 


def lambda_handler(event, context): 
    #print("Received event: " + json.dumps(event, indent=2)) 

    # Get the object from the event and show its content type 
    bucket = event['Records'][0]['s3']['bucket']['name'] 
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8') 
    try: 
     response = s3.get_object(Bucket=bucket, Key=key) 
     s3.download_file(bucket,key, '/tmp/data.txt') 
     lines = [line.rstrip('\n') for line in open('/tmp/data.txt')] 
     for line in lines: 
      col=line.split(',') 
      print(col[5],col[6]) 
     print("CONTENT TYPE: " + response['ContentType']) 
     return response['ContentType'] 
    except Exception as e: 
     print(e) 
     print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) 
     raise e 

Creato Zip il contenuto della directory del progetto-dir e caricato lambda (Zip il contenuto della directory, non la directory). Quando eseguo la funzione sto ottenendo l'errore sotto indicato.

START RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Version: $LATEST 
**Unable to import module 'lambda_function': No module named lambda_function** 

END RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 
REPORT RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Duration: 19.63 ms Billed Duration: 100 ms  Memory Size: 128 MB Max Memory Used: 9 MB 

Gentilmente aiutarmi a eseguire il debug dell'errore.

+0

E 'il codice completo? Dall'errore sembra che qualche cosa voglia "importare lambda_function" che non è stato trovato. Forse vuoi 'dalla futura importazione lambda_function'? O semplicemente * pip installa lambda_function * su cmd line. – Berci

+0

@Berci Sto eseguendo questo codice Python nella piattaforma AWS. Non posso usare pip. ovunque nel mio codice sto usando lambda_function. Se copio incollare lo stesso codice nella console AWS funzionerà –

+0

Vedere l'ultimo commento su [questa discussione] (https://gist.github.com/kapilt/770bdf5d2a55b7385a9c) - può essere applicato a te? – kwinkunks

risposta

50

Errore dovuto al nome file della funzione lambda. Durante la creazione della funzione lambda verrà richiesto il gestore della funzione Lambda. Devi chiamarlo come tuo Python_File_Name.Method_Name. In questo scenario l'ho chiamato lambda.lambda_handler (lambda.py è il nome del file).

Si prega di trovare sotto l'istantanea. enter image description here

+1

Il mio codice è appena in lambda come codice - non come un file. –

+0

@BenWheeler: Anche se è un codice inline, è in un file che effettivamente lo si scrive. Puoi vedere il nome del file e l'intera struttura della directory a sinistra della finestra. – Vineeth

10

Ho trovato la risposta di Nithin molto utile. Ecco una specifica walk-through:

look-up questi valori:

  1. Il nome della funzione lambda_handler nello script python. Il nome utilizzato negli esempi AWS è "lambda_handler" con come "def lambda_handler (event, context)". In questo caso, il valore è "lambda_handler"
  2. Nella dashboard Lambda, trovare il nome del gestore nella casella di testo "Gestore" nella sezione "Configurazione" nella dashboard lambda per la funzione (mostrato in Screenshot di Nithin). Il mio nome predefinito era "lambda_function.lambda_handler".
  3. Il nome del tuo script python. Diciamo che è "cool.py"

Con questi valori, è necessario rinominare il gestore (mostrato nello screenshot) in "cool.lambda_handler". Questo è un modo per sbarazzarsi del messaggio di errore "Impossibile importare il modulo 'lambda_function'". Se dovessi rinominare il gestore nel tuo script python in "sup", dovresti rinominare il gestore nel dashboard lambda in "cool.sup"

+0

Il mio codice è appena in lambda come codice - non come un file. –

17

Un'altra fonte di questo problema sono le autorizzazioni sul file che è zippato. È DEVE essere almeno leggibile in tutto il mondo. (min chmod 444)

Ho eseguito quanto segue sul file python prima di zipparlo e ha funzionato correttamente.

chmod u=rwx,go=r 
+4

Questo. Stavo usando Python's ZipFile per programmare in modo programmato le funzioni lambda nello ZIP, per default ha '0600' che come dici non è abbastanza. Inoltre, l'editor di codice sorgente Lambda integrato (sulla pagina Web di Amazon) leggerà felicemente il file senza preavviso sui problemi di autorizzazione. – cjhanks

+1

Secondo. Ho funzionato impostando i permessi dei file usando il metodo mostrato qui: http://stackoverflow.com/a/434689/931277 – dokkaebi

4

ci sono solo tanti grattacapi durante la creazione di pacchetti di distribuzione per AWS Lambda (per Python). Ho passato ore e ore a eseguire il debug delle sessioni finché non ho trovato una formula che raramente fallisce.

Ho creato uno script che automatizza l'intero processo e pertanto lo rende meno incline agli errori. Ho anche scritto un tutorial che spiega come funziona tutto.Si consiglia di check it out:

Hassle-Free Python Lambda Deployment [Tutorial + Script]

10

Se si sta caricando un file zip. Assicurati di zippare il contenuto della directory e non la directory stessa.

1

Ho trovato questo modo difficile dopo aver provato tutte le soluzioni di cui sopra. Se stai utilizzando le sottodirectory nel file zip, assicurati di includere il file __init__.py in ciascuna sottodirectory e che ha funzionato per me.

2

Ho avuto anche l'errore. Scopri che il mio file zip include la cartella genitore del codice. Quando I unzip e ispeziono il file zip, il file lambda_function si trova nella cartella principale ./lambda.

utilizzare il comando zip, correggere l'errore:

zip -r ../lambda.zip ./* 
+0

esegui lo zip all'interno della tua cartella di codice. il mio caso qui, cd lambda && zip -r ../lambda.zip ./* – Joe

Problemi correlati