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

Aurora密码轮换后postgres用户出现密码认证失败问题求助

Aurora密码轮换后postgres用户出现密码认证失败问题求助

看起来你遇到了Aurora密码轮换后Lambda连接数据库的典型问题,我来帮你梳理几个最可能的原因和对应的解决思路:

1. Lambda执行环境重用导致旧引擎缓存

Lambda会复用执行环境(容器),如果你的数据库引擎实例是在handler函数外部初始化的(比如全局作用域调用create_db_engines()),那么当密码轮换后,复用的容器会继续使用之前创建的旧引擎——这个引擎还是用旧密码建立的连接池,自然会触发认证失败。

解决办法:
把create_db_engines()的调用移到Lambda的handler函数内部,确保每次请求都重新拉取最新的密码并创建新的数据库引擎实例。

2. 数据库连接池未更新密码

不管是同步还是异步引擎,默认的连接池会保留已创建的连接。当密码轮换后,连接池里的旧连接仍然使用旧密码,导致后续请求失败。

解决办法:
在创建引擎时添加pool_pre_ping=True参数,让连接池在使用连接前自动检查连接有效性,无效则重新创建连接(自动使用新密码):

engine = create_engine(
    f"postgresql://{username}:{password}@{os.environ['db_endpoint']}/postgres",
    pool_pre_ping=True
)

engine_async = create_async_engine(
    f"postgresql+asyncpg://{username}:{password}@{os.environ['db_endpoint']}/postgres",
    pool_pre_ping=True
)

3. 密码中的特殊字符未转义

如果你的数据库密码包含@、:、/这类URL特殊字符,直接拼接连接字符串会导致解析错误——虽然pgadmin可能自动处理了转义,但Python里直接拼接会破坏URL结构,实际传递的密码和你看到的不一致。

解决办法:
用urllib.parse.quote_plus转义用户名和密码后再拼接:

import urllib.parse

# 转义特殊字符
username_escaped = urllib.parse.quote_plus(username)
password_escaped = urllib.parse.quote_plus(password)

# 用转义后的字符串创建引擎
engine = create_engine(
    f"postgresql://{username_escaped}:{password_escaped}@{os.environ['db_endpoint']}/postgres",
    pool_pre_ping=True
)

engine_async = create_async_engine(
    f"postgresql+asyncpg://{username_escaped}:{password_escaped}@{os.environ['db_endpoint']}/postgres",
    pool_pre_ping=True
)

额外检查点

  • 确认你的Secrets Manager调用确实获取到了最新版本的密码:你的代码里没指定VersionStage,默认是AWSCURRENT,这没问题,但可以在日志里打印get_secret_value_response['VersionId'],对比Secrets Manager后台的最新版本ID,确保一致性。
  • 检查Lambda的IAM权限:确保密码轮换后,Lambda仍然有权限访问Secrets Manager和对应的KMS密钥(不过你说第一次轮换后能正常工作,这个可能性较低,但可以排除)。

备注:内容来源于stack exchange,提问作者Rony Tesler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:19:37