python - AWS Lambda 连接到 RDS 上的 MySQL 数据库间歇性超时
问题描述
为了在 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
解决方案
推荐阅读
- highcharts - Highcharts:如何使范围属性起作用?
- python - Pandas to_json 没有正确格式化 json 文件?
- c - 尝试在 C 中实现 k-medoids
- reactjs - “TypeError:status.map 不是函数” - 使用 useState 和 Map 的 TypeScript
- oracle - Oracle 物化视图 - 重建查询
- python - 如何恢复传递给 multiprocessing.Process 的函数的返回值?
- oracle - 为模式设置 PLSQL_CCFLAGS
- javascript - Material UI React Theme 自定义不适用
- javascript - 如何解决 react bootstrap css 与自定义 css 冲突
- azure - 我们可以在同一个项目中拥有多个无服务器云吗?