Problemas ao usar o MySQL com o AWS Lambda em Python

estou a tentar levantar-me e correr com o AWS Lambda Python (iniciante em Python btw), mas a ter alguns problemas com a inclusão da dependência do MySQL. Estou a tentar seguir as instruções do meu Mac.

para o passo número 3, estou a ter alguns problemas em fazer o comando na raiz do meu projecto {[[6]}

sudo pip install MySQL-python -t /

erro:

excepção: Traceback (última chamada mais recente): Arquivo "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/basecommand.py", Linha 122, principal status = self.executar (opções, args) Ficheiro "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/commands/install.py", linha 311, em execução o.caminho.join (opções.target_dir, item) Ficheiro "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", linha 292, em movimento erro de obtenção, " caminho de destino '%s' já existe " % real_ DST Erro: localização do Destino '/MySQL_python-1.2.5-py2. 7.egg-info/MySQL_python-1.2.5-py2. 7.a informação sobre os ovos já existe

acabo por escrever a minha seguinte função lambda( funciona bem no meu Mac), que é:

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

o que eu fiz foi ir para os pacotes /Library/Python/2.7/site e copiar as pastas/ficheiros MySQLdb que foram baixados quando eu fiz o sudo pip instalar o MySQL-python (sem-t/) (tenho a certeza que estou a fazer algo errado aqui), para o meu projecto lambda, e depois fechar o conteúdo juntamente com o lambda_function.py e enviado para a AWS Lambda.

depois recebo:

não é possível importar o módulo 'lambda_function' : nenhum módulo chamado MySQLdb

Obrigado por qualquer ajuda e sugestões!

EDITAR

foi capaz de fazer com que o sudo pip instalasse o MySQL-python-t /pathToProject (obrigado pela ajuda nos comentários) mas agora percebo isto ao executar a função lambda:

incapaz de importar o módulo 'lambda_function': /var/task/_mysql. so: cabeçalho ELF inválido

Eu sei que se eu trabalhar em uma caixa Linux, então ela deve funcionar bem (como sugerido por algumas pessoas), mas eu estou me perguntando se eu posso fazê-la funcionar a partir de uma caixa OS X.

Author: Guy Daher, 2016-03-03

5 answers

Para um caso de uso como o Lambda, você será muito mais feliz usando uma implementação python pura como PyMySQL .

É uma gota em substituição do MySQLdb que segue a especificação da base de dados Python API. Para a maioria das coisas, como os eventos Lambda desencadeados será tão rápido.

Já o usei muito na produção e funciona muito bem.
 8
Author: systemjack, 2016-03-31 00:03:25

Terá de usar a instância Amazon Linux para construir os seus pacotes python e depois incluí-los no seu pacote de implementação Lambda. Confira este excelente artigo sobre como fazê-lo. Pacotes mencionados no artigo são diferentes do que você precisa, mas da mesma forma ele me ajudou a construir psycopg2 e pymssql para o meu lambdas.

 0
Author: nanestev, 2016-03-24 15:51:34

Usando lambda-docker Você pode configurar e testar as suas funções Lambda sem acesso a um ambiente semelhante ao Linux.

Para configurar o seu lambda, use uma imagem de compilação lambda-docker para executar um contentor separado e executar os comandos pip install <package> no contentor. Em seguida, exportar o recipiente, pegar os pacotes instalados em usr/lib, e colocá-los em seu pacote AWS Lambda.

Então pode testar a compatibilidade executando a sua lambda numa imagem lambda-docker. Se funcionar, vai para a AWS Lambda com confiança.
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
 0
Author: Kevin, 2017-05-03 17:33:41
Acho que o seu problema se deve principalmente a pacotes de desenvolvimento em falta. Acho que vai precisar do seguinte:

Sudo yum-y install mysql-devel

 -1
Author: rahimbah, 2016-03-08 09:54:05

O problema acontece da mesma forma no meu instalador Ubuntu, o verdadeiro problema é porque ele está pendente em um controlador de conexão cliente mysql. Então a solução é instalar o pacote cliente-dev do Mysql para fazer o MySQL-python feliz (para fazer uso da biblioteca cliente).

# 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

Para 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

Pode obter uma resposta semelhante aqui: Mac OS X - EnvironmentError: mysql_ Config não encontrado

Então tente a instalação pip.

Não recomendo que ninguém use "sudo pip". Você deve configurar o Virtualenv e o virtualwrapper para o seu desenvolvimento em python, que lhe permite pip sem o sudo. E é mais fácil isolar e testar a nova implantação. (embora não resolva o problema da biblioteca mysqlclient-dev)
 -3
Author: mootmoot, 2017-05-23 12:18:18