为了弄清楚在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