名称 'conn' 未定义:NameError

Mah*_*bub 1 postgresql amazon-web-services python-3.x aws-lambda

我想将我的 aws iot mqtt 消息存储到我的 postgresql 中。为此,我已经将本地 posrtgresql 连接到亚马逊 RDS 实例。现在,我需要在 amazon lambda calculus 之间创建一个连接,然后将数据发送到 postgresql 数据库。但是每当我测试我的 lambda 演算时,它都会给我“名称'conn'未定义:NameError”错误。这是我在 aws lambda 中的 python 代码。我还在我的项目中包含了 psycopg2 库。

import sys
import logging
import rds_config
import psycopg2
#rds settings
rds_host  = "myhost"
name = "username"
password = "username_password"
db_name = "dbname"

logger = logging.getLogger()
logger.setLevel(logging.INFO)

try:
    conn = psycopg2.connect(host=rds_host, user=name, password=password, 
           dbname=db_name, connect_timeout=5)
except:
     logger.error("ERROR: Unexpected error: Could not connect to postgreSQL 
          instance.")

logger.info("SUCCESS: Connection to RDS postgreSQL instance succeeded")
def handler(event, context):
"""
This function fetches content from postgreSQL RDS instance
"""
item_count = 0
with conn.cursor() as cur: 
    cur.execute('insert into awsiotdata (serialnumber, dateandtime, clicktype, batteryvoltage) values(serialNumber, datetime.datetime.utcnow(), clickType, batteryVoltage)')
    conn.commit()
    cur.execute("select * from awsiotdata")
    for row in cur:
        item_count += 1
        logger.info(row)
        #print(row)


return "Added %d items from RDS PostgreSQL table" %(item_count)
Run Code Online (Sandbox Code Playgroud)

Ova*_*Ova 5

您正在隐藏真正的错误消息。Python 的异常处理模式如下所示

try:
    conn = psycopg2.connect(host=rds_host,
                            user=name,
                            password=password,
                            database=db_name)
except Exception as e:
    print(e)
Run Code Online (Sandbox Code Playgroud)

这样你就会看到真正的错误信息:

无效的 dsn:无效的连接选项“passwd”

编辑#1:

“超时”表示由于 RDS 实例的“安全组规则”,lambda 无法连接。请记住,即使默认情况下公共 RDS 实例也有 IP 入站限制(即可以从 PC 连接,但不可能从 AWS Lambda 连接)。

RDS 向导 RDS 实例选项