You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda连接PostgreSQL报错:pg_hba.conf条目缺失问题排查

解决AWS Lambda连接PostgreSQL时的OperationalError: FATAL: no pg_hba.conf entry... no encryption错误

这个错误的核心是你的PostgreSQL实例(大概率是RDS)要求加密连接,但当前Lambda的数据库请求未启用加密,或者pg_hba.conf配置不允许无加密连接来自Lambda的IP。以下是针对性的解决步骤:

1. 修改Lambda连接代码,强制启用加密连接

在psycopg2.connect中添加sslmode='require'参数,强制使用加密连接,这是解决「no encryption」提示的直接手段:

conn = psycopg2.connect(
    host=db_host, 
    dbname=db_name, 
    user=db_user, 
    password=db_password,
    sslmode='require'  # 新增此行
)

如果你的RDS实例配置了自定义SSL证书,还可以添加sslrootcert参数指定证书路径(Lambda层中需包含对应证书文件)。

2. 检查RDS PostgreSQL的加密强制配置

登录AWS控制台,进入RDS实例的「参数组」配置:

  • 确认rds.force_ssl参数是否设置为1:如果是,所有连接必须使用SSL,这时候Lambda必须用加密连接才能成功。
  • 如果不需要强制加密,可以将rds.force_ssl改为0,但生产环境不建议这么做,优先保留加密连接要求。

3. 验证RDS的连接安全配置

RDS的pg_hba.conf无法直接编辑,但可以通过以下配置间接控制:

  • 核对RDS安全组:确保允许Lambda所在VPC的安全组访问5432端口(你提到已配置,建议再确认一次端口和安全组规则)。
  • 检查「公有可访问性」:如果Lambda在VPC内,建议设置为「否」,仅允许VPC内访问,RDS会自动配置pg_hba.conf允许VPC内IP段的加密连接。

4. 完善代码的错误处理

你的代码注释掉了异常捕获逻辑,建议恢复并补充,方便排查连接过程中的问题:

def lambda_handler(event, context):
    db_host = os.environ['DB_HOST']
    db_name = os.environ['DB_NAME']
    db_user = os.environ['USER_NAME']
    db_password = os.environ['PASSWORD']
    
    conn = None
    cursor = None
    try:
        conn = psycopg2.connect(
            host=db_host, 
            dbname=db_name, 
            user=db_user, 
            password=db_password,
            sslmode='require'
        )
        cursor = conn.cursor()  

        user_id = event['user']
        occurrence_datetime = event['datetime']
        geolocation_data = create_line_string(event['data'])
        
        print('iniciando inserção')
        cursor.execute("""INSERT INTO geolocation (user_id, occurrence_datetime, geolocation_data) VALUES(%s, %s, %s);""", 
                      (user_id, occurrence_datetime, geolocation_data))
        conn.commit()
        print('inserção concluída')
    except Exception as e:
        print(f"Erro: {str(e)}")
        if conn:
            conn.rollback()
        raise e
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()

内容的提问来源于stack exchange,提问作者JanaBS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:21:07