web-dev-qa-db-fra.com

Problèmes d'utilisation de MySQL avec AWS Lambda dans Python

J'essaie de devenir opérationnel avec AWS Lambda Python (débutant dans Python btw) mais j'ai des problèmes avec l'inclusion de la dépendance MySQL. J'essaie de suivre les instructions ici sur mon Mac.

Pour l'étape 3, je rencontre des problèmes avec l'exécution de la commande à la racine de mon projet

Sudo pip install MySQL-python -t /

Erreur:

Exception: trace (dernier appel le plus récent): fichier "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.Egg/pip/basecommand.py", ligne 122, dans l'état principal = self .run (options, args) Fichier "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.Egg/pip/commands/install.py", ligne 311, dans l'exécution os.path. join (options.target_dir, item) Fichier "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", ligne 292, lors du déplacement augmenter Erreur, "Chemin de destination '% s 'existe déjà "% real_dst Erreur: chemin de destination' /MySQL_python-1.2.5-py2.7.Egg-info/MySQL_python-1.2.5-py2.7.Egg-info 'existe déjà

Je finis par écrire ma fonction lambda suivante (fonctionne très bien sur mon Mac), qui est:

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()

Ce que j'ai continué à faire est d'aller dans /Library/Python/2.7/site-packages et de copier les dossiers/fichiers MySQLdb qui ont été téléchargés lorsque j'ai fait installer Sudo pip MySQL-python (sans -t /) (je suis je fais bien quelque chose de mal ici), à mon projet lambda, puis j'ai compressé le contenu avec le lambda_function.py et téléchargé sur AWS Lambda.

Ensuite, je reçois:

Impossible d'importer le module 'lambda_function': aucun module nommé MySQLdb

Reconnaissant pour toute aide et suggestions!

[~ # ~] modifier [~ # ~]

A réussi à faire en sorte que Sudo pip installe MySQL-python -t/pathToProject (merci pour l'aide dans les commentaires) mais maintenant j'obtiens ceci lors de l'exécution de la fonction lambda:

Impossible d'importer le module 'lambda_function': /var/task/_mysql.so: en-tête ELF non valide

Je sais que si je travaille sur une boîte Linux, cela devrait fonctionner correctement (comme suggéré par certaines personnes), mais je me demande si je peux le faire fonctionner à partir d'une boîte OS X.

25
Guy Daher

Pour un cas d'utilisation comme Lambda, vous serez beaucoup plus heureux en utilisant une implémentation pure python comme PyMySQL .

C'est une baisse de remplacement pour MySQLdb qui suit la spécification Python Database API . Pour la plupart des choses comme les événements Lambda déclenchés, ce sera tout aussi rapide.

Je l'ai beaucoup utilisé en production et cela fonctionne très bien.

9
systemjack

Mettez simplement à jour votre couche lambda en téléchargeant deux packages: - sqlalchemy - PyMySQL (pilote à utiliser à la place de mysqlclient)

Maintenant, mettez à jour l'url de votre pilote en "mysql + pymysql: // ...".

Cela vous fait utiliser le pilote pymysql qui est compatible avec l'environnement Lambda pour vos environnements existants.

N'oubliez pas de définir le point de terminaison VPC pour RDS. Cela permet de contrôler les performances et la sécurité.

1
Pranav Nandan

Vous devrez utiliser une instance Amazon Linux pour créer vos packages python puis les inclure dans votre package de déploiement Lambda. Consultez cet excellent article sur la façon de faire Les packages mentionnés dans l'article sont différents de celui dont vous avez besoin, mais de la même manière, cela m'a aidé à créer psycopg2 et pymssql pour mes lambdas.

0
nanestev