2016-03-03 19 views
24

Sto cercando di iniziare a utilizzare AWS Lambda Python (principiante in Python btw) ma con alcuni problemi con l'inclusione della dipendenza MySQL. Sto cercando di seguire le istruzioni here sul mio Mac.Problemi di utilizzo di MySQL con AWS Lambda in Python

Per numero di passo 3, io sono sempre alcuni problemi con il fare il comando alla base del mio progetto

sudo pip install MySQL-python -t/

Errore:

Exception: Traceback (most recent call last): File "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/basecommand.py", line 122, in main status = self.run(options, args) File "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/commands/install.py", line 311, in run os.path.join(options.target_dir, item) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 292, in move raise Error, "Destination path '%s' already exists" % real_dst Error: Destination path '/MySQL_python-1.2.5-py2.7.egg-info/MySQL_python-1.2.5-py2.7.egg-info' already exists

finisco per scrivere le mie seguente funzione lambda (opere bene sul mio Mac), che è:

import MySQLdb 

def lambda_handler(event, context): 
    # Open database connection 
    db = MySQLdb.connect(...) 

    # prepare a cursor object using cursor() method 
    cursor = db.cursor() 

    sql = "SELECT * FROM Users" 

    try: 
     # Execute the SQL command 
     cursor.execute(sql) 
     # Fetch all the rows in a list of lists. 
     results = cursor.fetchall() 
     for row in results: 
     fname = row[0] 
     lname = row[1] 
     age = row[2] 
     sex = row[3] 
     income = row[4] 
     # Now print fetched result 
     print ("lname=%s" %(lname)) 
    except: 
     print "Error: unable to fecth data" 

    # disconnect from server 
    db.close() 

Quello che ho continuato a fare è andare a /Library/Python/2.7/site-p ackage e copia delle cartelle/file MySQLdb che sono stati scaricati quando ho fatto sudo pip installare MySQL-python (senza -t /) (sono sicuro che sto facendo qualcosa di sbagliato qui), al mio progetto lambda, e poi zippato il contenuto insieme a lambda_function.py e caricato su AWS Lambda.

tanto sono:

Unable to import module 'lambda_function': No module named MySQLdb

grato per qualsiasi aiuto e suggerimenti!

EDIT

è stato in grado di fare fare sudo pip installare MySQL-python -t/pathToProject lavoro (grazie per l'aiuto nei commenti), ma ora ottengo questo quando runing la funzione lambda:

Unable to import module 'lambda_function': /var/task/_mysql.so: invalid ELF header

So che se lavoro su una macchina Linux, quindi dovrebbe funzionare bene (come suggerito da alcune persone), ma mi chiedo se posso farlo funzionare da una scatola OS X.

+0

Qual è l'output di 'python -c" import sys; print (sys.path) "'? Perché stai usando il sistema python? Non ne hai installato uno nel percorso '/ usr/local' con homebrew o macports? Se no, dovresti. Non avrai bisogno di usare 'sudo' per pip perché sarà di proprietà del tuo utente e non cambierà alcun file di proprietà del sistema. Inoltre, sarà completamente separato dal python da cui dipende il tuo sistema. Sarà anche una versione più recente, poiché proviene da un repository. –

+0

Se non ce l'hai, installa homebrew con l'istruzione 'curl' da' http: // brew.sh' e quindi esegui 'brew install python'. Pip installa MySQLdb'. Verifica che il tuo python sia in/usr/local/bin eseguendo 'which python' - homebrew avrà impostato la variabile $ PATH per cercare in/usr/local /' per trovare il python corretto. –

+0

Grazie per i commenti, userà homebrew per l'installazione. Ti terremo aggiornato (per fortuna sono un principiante in Python, quindi grazie per avermi aiutato) –

risposta

-1

Credo che il problema riguardi principalmente i pacchetti di sviluppo mancanti. Penso che è necessario il seguente:

sudo yum -y install mysql-devel

+0

equivalente a OS X? –

+0

http://stackoverflow.com/a/35886213/3479860 –

+0

Ah, mi dispiace non averlo mai avuto per il mio Mac ma ho installato il modulo di pip MySQLdb con successo sul mio Mac. Hai mysql installato già sul tuo Mac? In caso contrario, http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg – rahimbah

-3

Il problema si verifica in modo simile nel mio programma di installazione di Ubuntu, il vero problema è perché è in attesa su un driver del connettore client mysql. Quindi la soluzione è installare il pacchetto mysql client-dev per rendere felice MySQL-python (per utilizzare la libreria client).

# Ubuntu only(or setup vm for ubuntu inside your mac) 
# Three dependencies for MySQL python recompilation 
sudo apt-get install python-dev libssl-dev 

#Now the mysql client-dev 
sudo apt-get install libmysqlclient-dev 

# If you like mariadb client 
sudo apt-get install libmariadbclient-dev 

Per MAC

# try this first 
fink install mysql-unified-dev 

# or this if above fail. 
brew install mysql 
# you must add this to your user profile startup if you use brew 
export PATH=$PATH:/usr/local/mysql/bin 

È possibile ottenere risposta simile qui: Mac OS X - EnvironmentError: mysql_config not found

quindi provare il pip install.

Non consiglio a nessuno di utilizzare "sudo pip". È necessario configurare Virtualenv e virtualwrapper per lo sviluppo di python, che consentono di eseguire pip senza sudo. Ed è più facile isolare e testare la nuova distribuzione. (anche se non risolve il problema della libreria mysqlclient-dev)

0

Dovrai utilizzare l'istanza di Amazon Linux per costruire i tuoi pacchetti python e quindi includerli nel tuo pacchetto di distribuzione Lambda. Controlla this excellent article su come farlo.I pacchetti menzionati nell'articolo sono diversi da quelli di cui hai bisogno, ma allo stesso modo mi ha aiutato a creare psycopg2 e pymssql per i miei lambda.

+0

Interessante! Lo proveremo appena tornerò dalle vacanze.Grazie per il suggerimento –

6

Per un caso d'uso come Lambda, sarai molto più felice utilizzando un'implementazione in puro pitone come PyMySQL.

È una sostituzione in sostituzione di MySQLdb che segue la specifica Python Database API. Per la maggior parte delle cose, come gli eventi Lambda innescati, sarà altrettanto veloce.

L'ho usato molto in produzione e funziona benissimo.

+0

Ricevo un errore "ImportError: nessun modulo chiamato MySQLdb' quando sostituisco MySQLdb con PyMySQL per i miei modelli sqlalchemy – Hussain

+0

@systemjack: puoi per favore fammi sapere come hai incluso pymysql nel tuo lamda. – Nipun

+0

@Hussain Non usiamo sqlalchemy quindi non sono sicuro su come farlo usare pymysql. Ecco alcuni link che mostrano l'utilizzo di base: http://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-deployment-pkg.html, http://docs.aws.amazon.com/lambda/ latest/dg/lambda-python-how-to-create-deployment-package.html ... È necessario utilizzare pip per installarlo nella directory del progetto/pacchetto di distribuzione con l'opzione -t. – systemjack

0

Utilizzando lambda-docker è possibile impostare e testare le funzioni Lambda senza accedere a un ambiente Linux simile a quello.

Per impostare il lambda, utilizzare un'immagine build lambda-docker per eseguire un contenitore finestra mobile distaccato ed eseguire i comandi pip install <package> sul contenitore. Quindi esportare il contenitore, afferrare i pacchetti installati sotto usr/lib e inserirli nel pacchetto AWS Lambda.

Quindi è possibile verificare la compatibilità eseguendo il lambda su un'immagine lambda-docker. Se funziona, vai avanti e carica su AWS Lambda con fiducia.

docker run -d -v "$PWD":/var/task lambci/lambda:build-python2.7 tail -f /dev/null 

docker ps 

docker exec 0c55aae443e6 pip install pandas 

docker exec 0c55aae443e6 pip install sqlalchemy 

docker exec 0c55aae443e6 pip freeze 

docker exec 0c55aae443e6 python -c "import site; print(site.getsitepackages())" 

docker container export -o lambda_ready_container 0c55aae443e6