AWS Lambda函数Python脚本任务超时错误



我试图使用Lambda函数连接到RDS postgresql数据库。Lambda函数返回超时错误。这是源代码。

postgres_test.py:

import sys
import logging
import psycopg2
from db_util import make_conn, fetch_data
def lambda_handler(event, context):
query_cmd = "SELECT COUNT(*) FROM users"
# print query_cmd
# get a connection, if a connect cannot be made an exception will be raised here
conn = make_conn()
result = fetch_data(conn, query_cmd)
conn.close()
return result

db_util.py:

import psycopg2
db_host = "db_host"
db_port = 5432
db_name = "db_name"
db_user = "db_user"
db_pass = "db_pass"
db_table = "db_table"

def make_conn():
conn = None
try:
conn = psycopg2.connect("dbname='%s' user='%s' host='%s' password='%s'" % (db_name, db_user, db_host, db_pass))
except:
print ("I am unable to connect to the database")
return conn

def fetch_data(conn, query):
result = []
print ("Now executing: " + query)
cursor = conn.cursor()
cursor.execute(query)
raw = cursor.fetchall()
for line in raw:
result.append(line)
return result

下面是执行结果:

Test Event Name
triggers3event
Response
{
"errorMessage": "2021-10-19T22:55:12.543Z 207db48f-eb82-4bbd-afd5-1836b63874cf Task timed out after 3.00 seconds"
}
Function Logs
START RequestId: 207db48f-eb82-4bbd-afd5-1836b63874cf Version: $LATEST
END RequestId: 207db48f-eb82-4bbd-afd5-1836b63874cf
REPORT RequestId: 207db48f-eb82-4bbd-afd5-1836b63874cf  Duration: 3003.71 ms    Billed     Duration: 3000 ms    Memory Size: 128 MB Max Memory Used: 12 MB  
2021-10-19T22:55:12.543Z 207db48f-eb82-4bbd-afd5-1836b63874cf Task timed out after 3.00 seconds
Request ID
207db48f-eb82-4bbd-afd5-1836b63874cf

请帮我解决以下问题。我不确定上面的代码有什么问题。

通常Lambda函数超时的原因是由于安全组的配置。

为了纠正,请遵循以下建议:

  1. 检查Lambda和对应的db服务是否在同一个VPC中

  2. 检查安全组是否允许连接

  3. 如果您是通过internet连接db,请检查连接。(如果你在VPC中,看到你通过NAT和IG路由)

再次重申,很多时候,超时问题是由于网络允许/拒绝,所以在Lambda的情况下,一个安全组问题。

连接和检索数据的时间可能超过3秒,因此Lambda函数会超时。默认设置为3秒,正如您在CloudWatch日志中看到的那样):

任务在3.00秒后超时

为Lambda增加超时和配置的RAM大小(这将为Lambda函数提供按比例更多的CPU并使其运行得更快)并重试。

如果这也失败了,那么问题可能是Lambda函数没有到RDS数据库的网络路由。没有路由会导致DB连接尝试挂起,Lambda函数超时。

从您在下面的评论中提供的信息来看,看起来RDS数据库实际上运行在不同的AWS帐户中,但可以公开访问。这表明您的Lambda函数可能配置不正确。如果你不需要在VPC中运行Lambda函数,那么不要将其配置为在VPC中运行-请参阅Lambda函数VPC配置选项并删除子网分配。

最新更新