Подтвердить что ты не робот

Проблемы с использованием MySQL с AWS Lambda в Python

Я пытаюсь встать и работать с AWS Lambda Python (новичок в Python), но с некоторыми проблемами с включением зависимости MySQL. Я стараюсь следовать инструкциям здесь на моем Mac.

Для шага номер 3 у меня возникают некоторые проблемы с выполнением команды в корне моего проекта

sudo pip install MySQL-python -t /

Ошибка:

Исключение: Traceback (последний последний вызов):   Файл "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/basecommand.py", строка 122, в основном     status = self.run(опции, args)   Файл "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/commands/install.py", строка 311, в запуске     os.path.join(options.target_dir, item)   Файл "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", строка 292, в движении     raise Error ", путь назначения" % s "уже существует" % real_dst Ошибка: путь назначения '/MySQL_python-1.2.5-py2.7.egg-info/MySQL_python-1.2.5-py2.7.egg-info' уже существует

В конечном итоге я пишу свою следующую лямбда-функцию (отлично работает на моем Mac), которая:

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

То, что я продолжал делать, это перейти в /Library/Python/ 2.7/site-packages и скопировать файлы или файлы MySQLdb, которые были загружены, когда я сделал sudo pip install MySQL-python (без -t/) ( Я уверен, что я делаю что-то не так), в мой проект лямбда, а затем закрепил содержимое вместе с lambda_function.py и загрузил его в AWS Lambda.

Тогда я получаю:

Невозможно импортировать модуль lambda_function: нет модуля с именем MySQLdb

Благодарен за любую помощь и предложения!

ИЗМЕНИТЬ

Было возможно сделать sudo pip install MySQL-python -t/pathToProject (спасибо за помощь в комментариях), но теперь я получаю это при запуске лямбда-функции:

Невозможно импортировать модуль 'lambda_function':/var/task/_mysql.so: недопустимый заголовок ELF

Я знаю, что если я работаю в Linux-боксе, тогда он должен работать нормально (как это было предложено некоторыми людьми), но мне интересно, могу ли я заставить его работать из окна OS X.

4b9b3361

Ответ 1

Для использования в качестве Lambda вы будете намного счастливее, используя чистую реализацию python, например PyMySQL.

Это замена MySQLdb, которая следует за спецификацией Python Database API. Для большинства вещей, таких как вызванные события Lambda, это будет так же быстро.

Я использовал его в производстве много, и он отлично работает.

Ответ 2

Просто обновите ваш лямбда-слой, загрузив два пакета: - sqlalchemy - PyMySQL (драйвер, который нужно использовать вместо mysqlclient)

Теперь обновите URL вашего драйвера до "mysql + pymysql://...".

Это заставляет вас использовать драйвер pymysql, который совместим со средой Lambda для ваших существующих сред.

Не забудьте установить конечную точку VPC для RDS. Это держит производительность и безопасность под контролем.

Ответ 3

Вам нужно будет использовать экземпляр Amazon Linux для создания пакетов python, а затем включить их в свой пакет развертывания Lambda. Проверьте эту отличную статью о том, как это сделать. Пакеты, упомянутые в статье, отличаются от тех, которые вам нужны, но аналогичным образом это помогло мне построить psycopg2 и pymssql для моих лямбдов.

Ответ 4

AWS недавно выпустила отличное решение для проблемы драйверов баз данных и доступа к базам данных в Lambda: Aurora Data API. API данных туннелирует SQL через HTTP, используя стандартную аутентификацию AWS. Это позволяет обойти проблемы с компиляцией нативного кода и использованием традиционных моделей соединений с базами данных в Lambda.

В итоге я написал для него драйвер, совместимый с DB-API: aurora-data-api (и использующий его диалект SQLAlchemy):

import aurora_data_api

cluster_arn = "arn:aws:rds:us-east-1:123456789012:cluster:my-aurora-serverless-cluster"
secret_arn = "arn:aws:secretsmanager:us-east-1:123456789012:secret:MY_DB_CREDENTIALS"
with aurora_data_api.connect(aurora_cluster_arn=cluster_arn, secret_arn=secret_arn, database="my_db") as conn:
    with conn.cursor() as cursor:
        cursor.execute("select * from pg_catalog.pg_tables")
        print(cursor.fetchall())

Ответ 5

Я считаю, что ваша проблема в основном сводится к отсутствующим пакетам разработки. Я думаю, вам понадобится следующее:

sudo yum -y install mysql-devel

Ответ 6

Используя lambda-docker, вы можете настроить и протестировать свои лямбда-функции без доступа к подобной среде Linux.

Чтобы настроить лямбда, используйте lambda-docker для создания отдельного контейнера докеров и выполнения команд pip install <package> на контейнер. Затем экспортируйте контейнер, возьмите установленные пакеты под usr/lib и поместите их в свой пакет AWS Lambda.

Затем вы можете проверить совместимость, запустив лямбду на изображении лямбда-докера. Если это сработает, выйдите и загрузите в AWS Lambda с уверенностью.

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

Ответ 7

Проблема происходит аналогично в моем установщике Ubuntu, реальная проблема заключается в том, что она находится на пути к драйверу соединителя клиента mysql. Таким образом, решение устанавливает пакет клиента-dev Mysql, чтобы сделать MySQL-python счастливым (чтобы использовать клиентскую библиотеку).

# 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

Для 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

Вы можете получить аналогичный ответ здесь: Mac OS X - EnvironmentError: mysql_config не найден

Затем попробуйте установить pip.

Я не рекомендую никому использовать "sudo pip". Вы должны настроить Virtualenv и virtualwrapper для разработки вашего python, которые позволят вам пипеть без sudo. И проще изолировать и протестировать новое развертывание. (хотя он не исправляет проблему с библиотекой mysqlclient-dev)