首页 > 解决方案 > 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

标签: pythonmysqlaws-lambdasqlalchemyamazon-rds

解决方案


推荐阅读