2015-11-13 2 views
3

Я пытаюсь подключиться к mysql из своего сценария AWS Lambda.
Я установил
pip install --allow-external mysql-connector-python mysql-connector-python -t <dir>
для установки mysql-connector-python в локальном каталоге.
Я закрепил файл и загрузил его в AWS Lambda, где исполняются мои файлы python.
Мои скрипты выполняются правильно до той точки, где я инициализирую соединение mysql.
я это
AWS Lambda Python с MySQL

log('about to set connection for db') 
connection = mysql.connector.connect(user=DB_USER, password=DB_PASSWORD, host=DB_HOST, database=DB_DATABASE) 
query = "SELECT * FROM customers WHERE customer_email LIKE '%s' LIMIT 1" 
log('set connection for DB') 

«о, чтобы установить соединение для БД» в настоящее время регистрируется, но «установить соединение для БД» никогда не регистрируется, и моя программа попадает тайм-аут и прекращает выполнение.

Что я могу делать неправильно?

EDIT: Это мой класс, я звоню из lambda_function.py

import mysql.connector 
import logging 
from mysql.connector import errorcode 

class MySql(object): 

    USER =None 
    PASSWORD=None 
    HOST =None 
    DATABASE=None 


    logger = logging.getLogger() 
    logger.setLevel(logging.INFO) 

    def __init__(self, user, password, host, database): 
     global USER, PASSWORD, HOST, DATABASE 
     USER  = user 
     PASSWORD = password 
     HOST  = host 
     DATABASE = database 

    def getId(self, customer_email): 
     email_exists = False 

     connection = mysql.connector.connect(user=USER, password=PASSWORD, host=HOST, database=DATABASE) 
     query = "SELECT * FROM customers WHERE customer_email LIKE '%s' LIMIT 1" 

     cursor = connection.cursor() 
     cursor.execute(query % customer_email) 
     data = cursor.fetchall() 
     id = None 
     for row in data : 
      id = row[1] 
      break 

     cursor.close() 
     connection.close() 
     return id 

    def insertCustomer(self, customer_email, id): 
     log('about to set connection for db') 
     connection = mysql.connector.connect(user=USER, password=PASSWORD, host=HOST, database=DATABASE) 
     log('set connection for DB') 
     cursor = connection.cursor() 
     try: 
      cursor.execute("INSERT INTO customers VALUES (%s,%s)",(customer_email, id)) 
      connection.commit() 
     except: 
      connection.rollback() 
      connection.close() 
    def log(logStr): 
     logger.info(logStr) 

def main(): 
    user = 'xxx' 
    password = 'xxx' 
    host = ' xxx' 
    database = 'xxx' 

    mysql = MySql(user, password, host, database) 

    id = mysql.getId('testing') 
    if id == None: 
     mysql.insertCustomer('blah','blahblah') 
    print id 

if __name__ == "__main__": 
    main() 

Когда я исполняю MySql.py локально мой код работает отлично.
Моя база данных обновляется, но ничего не происходит, когда я запускаю ее из AWS.

+0

Возможно, ваш 'значение host' неправильно, что может привести к сети тайм-аут. – 101

+0

Кроме того, что делает функция 'log', вы можете показать код для нее? Это может быть проблема. – 101

+0

Проверьте группы безопасности –

ответ

2

Является ли это экземпляром MySQL для AWS (RDS) или внутренней базы данных? Если RDS, проверьте входящие правила NACL vpc, связанные с вашим экземпляром базы данных. Входящие правила могут разрешать/запрещать использование определенных источников IP-адресов.

+0

Вот что я понял. Это aws rds. Мне пришлось переключиться на DynamoDB. – altoids

0

, когда вы создали файл zip-файла. Вы делали пипс в целевой каталог. Я приложил синтаксис ниже. Это копирует файлы в ваш целевой каталог на zip.

Возможно, это может быть причиной того, что вы можете выполнить его локально, но не в лямбда.

Это синтаксис

пункт установить имя-модуля -t/путь/к/PythonExampleDir

Смежные вопросы