【问题标题】:AWS Lambda Python with MySQLAWS Lambda Python 与 MySQL
【发布时间】:2016-02-14 16:05:15
【问题描述】:

我正在尝试从我的 AWS Lambda 脚本连接到 mysql。
我做到了
pip install --allow-external mysql-connector-python mysql-connector-python -t <dir>
在本地目录中安装 mysql-connector-python。
我压缩了文件并将其上传到执行我的 python 文件的 AWS Lambda。
在我初始化 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')

正在记录“即将为 db 设置连接”,但从未记录过“为 DB 设置连接”,我的程序超时并停止执行。

我可能做错了什么?

编辑: 这是我从 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 运行它时没有任何反应。

【问题讨论】:

  • 可能您的host 值有误,可能导致网络超时。
  • 另外,log 函数是做什么的,你能给出它的代码吗?这可能是问题所在。
  • 检查安全组

标签: python mysql aws-lambda


【解决方案1】:

它是 AWS (RDS) 上的 MySQL 实例还是本地数据库上的 MySQL 实例?如果是 RDS,请检查与您的数据库实例关联的 vpc 的 NACL 入站规则。入站规则可以允许/拒绝来自特定 IP 源

【讨论】:

  • 这就是我想出来的。它是 aws rds。我不得不切换到 DynamoDB。
【解决方案2】:

当您创建 zip 文件时。您是否对目标目录进行了 pip。 我附上了下面的语法。这会将文件复制到您的目标目录以压缩。

这可能是您能够在本地执行它但不能在 lambda 中执行的原因。

这是语法

pip install module-name -t /path/to/PythonExampleDir

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 2021-05-23
    • 2021-04-13
    • 2022-06-16
    • 2019-10-13
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多