使用NextJS开发时,AWS Amplify如何连接VPC内的私有RDS PostgreSQL?
如何让AWS Amplify部署的NextJS连接VPC内的私有RDS PostgreSQL实例
Amplify托管的NextJS默认不在你的自定义VPC范围内,无法直接访问私有RDS,以下是几种可行的解决方式:
方案1:通过配置VPC访问的Lambda函数中转数据库请求
这是最常用的实现方式,利用Lambda的VPC配置能力打通与私有RDS的连接,NextJS后端逻辑通过调用该Lambda完成数据库操作:
- 在Amplify项目中创建或修改用于数据库交互的Lambda函数(可通过
amplify add function命令快速创建) - 登录AWS控制台,找到目标Lambda函数,进入配置 > VPC页面:
- 选择RDS所在的VPC及子网(建议多选跨可用区子网提升可用性)
- 绑定安全组,确保该安全组被RDS的安全组允许访问5432端口(PostgreSQL默认端口)
- 确认Lambda执行角色拥有
ec2:CreateNetworkInterface、ec2:DescribeNetworkInterfaces等VPC相关权限,缺失可手动附加AWSLambdaVPCAccessExecutionRole托管策略
- Lambda内的数据库连接示例(基于
pg库):
const { Client } = require('pg'); exports.handler = async (event) => { const client = new Client({ host: 'your-rds-internal-endpoint', // 必须用RDS内网地址,禁止使用公网地址 port: 5432, user: 'your-db-username', password: 'your-db-password', database: 'your-db-name' }); try { await client.connect(); const res = await client.query('SELECT * FROM target_table'); return { statusCode: 200, body: JSON.stringify(res.rows) }; } catch (err) { console.error(err); return { statusCode: 500, body: JSON.stringify({ error: '数据库查询失败' }) }; } finally { await client.end(); } };
- 在NextJS的API路由中通过Amplify API客户端或直接调用Lambda的Invoke接口,触发数据库操作
方案2:配置VPC对等连接
将Amplify托管环境所在的VPC与你的RDS所在VPC建立对等连接,让NextJS后端直接访问RDS:
- 在AWS控制台找到Amplify应用对应的VPC(可通过Amplify应用设置 > 环境变量或关联的CloudFormation栈查询)
- 在VPC控制台创建对等连接,将Amplify的VPC与RDS所在VPC配对
- 配置双方VPC的路由表,添加指向对等连接的路由规则,目标地址为对方VPC的CIDR段
- 修改RDS的安全组,允许Amplify VPC的CIDR段访问5432端口
- 注意:Amplify的VPC可能随应用更新发生变动,该方式稳定性不如Lambda中转,适合架构长期固定的场景
方案3:用AWS Secrets Manager管理敏感凭证
无论采用哪种方案,都建议将数据库用户名、密码等敏感信息存入AWS Secrets Manager,而非硬编码或明文存储:
- 在Secrets Manager中创建包含RDS连接信息的密钥
- 给Lambda或NextJS执行角色添加访问该密钥的权限
- 在代码中通过Secrets Manager SDK获取凭证后再建立数据库连接
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

