使用AWS CDK部署后,Lambda访问RDS PostgreSQL遇pg_hba.conf加密错误排查
问题排查与修复
1. Lambda未部署在VPC内
当前代码创建了Lambda的安全组createProjectFunctionSG,但Lambda函数本身未配置vpc和securityGroups参数,导致Lambda运行在VPC外的公共网络,无法通过VPC内的安全组规则访问RDS,同时触发PostgreSQL的加密连接限制。
修复步骤:创建Lambda时指定VPC、子网和安全组:
const createProjectFunction = new lambda.Function(this, 'CreateProject', { // 保留原有配置 vpc: vpc, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS // 推荐使用私有子网,提升安全性 }, securityGroups: [createProjectFunctionSG], });
2. PostgreSQL连接未启用SSL
错误信息中的no encryption表明Lambda连接时未使用SSL,而AWS RDS PostgreSQL默认强制要求SSL连接(尤其是部署在公有子网的实例)。
修复步骤:在Lambda的psycopg2连接中添加SSL参数:
conn = psycopg2.connect( user='postgres', host=postgres_db_endpoint, database=postgres_db_name, password=password, port=5432, sslmode='require' # 启用强制SSL连接 )
3. 安全组规则优化(可选但推荐)
当前Postgres安全组添加了Peer.anyIpv4()的入站规则,允许所有公网IP访问,存在安全风险。既然Lambda部署在VPC内,应限制仅允许Lambda的安全组或VPC内部流量访问:
// 替换原有anyIpv4规则,仅允许Lambda安全组访问 postgresSecurityGroup.addIngressRule(createProjectFunctionSG, Port.tcp(5432));
4. 确认RDS强制SSL配置(可选)
可以在CDK中显式配置RDS的rds.force_ssl参数,确保强制启用SSL:
const postgresDb = new rds.DatabaseInstance(this, 'postgresDb', { // 保留原有配置 parameters: { 'rds.force_ssl': '1' } });
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

