AWS Lambda与RDS上的MySQL DB的连接间歇性超时

时间:2020-07-01 14:01:46

标签: python mysql aws-lambda sqlalchemy amazon-rds

为了弄清楚在AWS上部署Lambda函数,我写了一个我认为很简单的东西:计算当前时间并将其写入RDS中的表。单独的过程每5分钟触发一次lambda。可以正常工作几个小时,但是一段时间后,连接开始挂起。然后,几个小时后,它将再次神奇地工作。错误消息是

(pymysql.err.OperationalError) (2003, \"Can't connect to MySQL server on '<server info redacted>' (timed out)\")
(Background on this error at: http://sqlalche.me/e/e3q8)

问题不在VPC上,否则lambda根本无法运行。我尝试过在lambda处理程序外部(如许多建议所示)在处理程序内部定义连接,每次运行后都关闭连接;现在,我的主要代码在lambda处理程序调用的单独的辅助函数中运行。在try / except块中创建,使用,关闭甚至显式删除了连接。但是,间歇性连接问题仍然存在。在这一点上,我不确定还有什么尝试。任何帮助,将不胜感激;谢谢!代码如下:

import pandas as pd
import sqlalchemy
from sqlalchemy import event as eventSA

# This function is something I added to fix an issue with writing floats
def add_own_encoders(conn, cursor, query, *args):
    cursor.connection.encoders[np.float64] = lambda value, encoders: float(value)
def writeTestRecord(event):
    try:
        connStr = "mysql+pymysql://user:pwd@server.host:3306/db"
        engine = sqlalchemy.create_engine(connStr)
        eventSA.listen(engine, "before_cursor_execute", add_own_encoders)
        conn = engine.connect()
        
        timeRecorded = pd.Timestamp.now().tz_localize("GMT").tz_convert("US/Eastern").tz_localize(None)
        s = pd.Series([timeRecorded,])
        s=s.rename("timeRecorded")
        s.to_sql('lambdastest',conn,if_exists='append',index=False,dtype={'timeRecorded':sqlalchemy.types.DateTime()})
        
        conn.close()
        del conn
        del engine
        
        return {
            'success' : 'true',
            'dateTimeRecorded' : timeRecorded.strftime("%Y-%m-%d %H:%M:%S")
        }
    except:
        conn.close()
        del conn
        del engine
        return {
            'success' : 'false'
        }

def lambda_handler(event, context):
    toReturn = writeTestRecord(event)
    return toReturn

0 个答案:

没有答案