已在AWS Amplify部署React前端,如何用Lambda+RDS部署Node/Express/Sequelize后端?
解决方案:基于Lambda + Express + Sequelize + RDS PostgreSQL的后端部署
一、项目初始化与依赖配置
- 初始化Node项目:
npm init -y - 安装核心依赖:
npm install express sequelize pg pg-hstore serverless-http - 安装开发依赖:
npm install --save-dev serverless-offline dotenv
二、Express与Sequelize配置
- 创建
.env文件,存储数据库连接信息(生产环境需迁移到AWS Secrets Manager或Lambda环境变量):
DB_HOST=your-rds-endpoint DB_PORT=5432 DB_NAME=your-db-name DB_USER=your-db-user DB_PASSWORD=your-db-password
- 编写Sequelize连接配置(
db.js):
const { Sequelize } = require('sequelize'); require('dotenv').config(); const sequelize = new Sequelize( process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, { host: process.env.DB_HOST, port: process.env.DB_PORT, dialect: 'postgres', pool: { max: 5, min: 0, acquire: 30000, idle: 10000 } } ); // 测试连接 async function testConnection() { try { await sequelize.authenticate(); console.log('数据库连接成功'); } catch (error) { console.error('数据库连接失败:', error); } } testConnection(); module.exports = sequelize;
- 编写Express路由与Serverless适配(
app.js):
const express = require('express'); const serverless = require('serverless-http'); const sequelize = require('./db'); // 引入自定义模型,比如const User = require('./models/User'); const app = express(); app.use(express.json()); // 健康检查路由 app.get('/api/health', async (req, res) => { try { await sequelize.authenticate(); res.status(200).json({ status: 'ok', db: 'connected' }); } catch (err) { res.status(500).json({ status: 'error', db: 'disconnected', message: err.message }); } }); // 导出Serverless处理函数 module.exports.handler = serverless(app);
三、Serverless框架配置
创建serverless.yml文件,配置Lambda、IAM权限与VPC(RDS默认在VPC内,Lambda需加入同一VPC才能访问):
service: express-sequelize-lambda frameworkVersion: '3' provider: name: aws runtime: nodejs18.x region: us-east-1 # 替换为你的AWS区域 environment: DB_HOST: ${env:DB_HOST} DB_PORT: ${env:DB_PORT} DB_NAME: ${env:DB_NAME} DB_USER: ${env:DB_USER} DB_PASSWORD: ${env:DB_PASSWORD} vpc: securityGroupIds: - sg-xxxxxx # 替换为RDS安全组ID(需允许Lambda所在安全组访问5432端口) subnetIds: - subnet-xxxxxx # 替换为RDS所在私有子网ID(至少配置两个) iamRoleStatements: - Effect: Allow Action: - ec2:CreateNetworkInterface - ec2:DescribeNetworkInterfaces - ec2:DeleteNetworkInterface Resource: "*" functions: app: handler: app.handler events: - httpApi: '*' # 配置API Gateway HTTP API接收所有请求 plugins: - serverless-offline
四、本地测试
- 启动本地Serverless服务:
npx serverless offline - 访问
http://localhost:3000/api/health验证数据库连接状态
五、部署到AWS
- 确保本地已配置AWS CLI权限(执行
aws configure完成认证) - 执行部署命令:
npx serverless deploy - 部署完成后,复制返回的API Gateway URL,前端即可通过该地址调用后端接口
关键注意事项
- VPC配置:Lambda必须与RDS处于同一VPC的私有子网,同时RDS安全组要开放5432端口给Lambda所在安全组
- 敏感信息安全:生产环境禁止将数据库密码存于代码或本地配置文件,改用AWS Secrets Manager,通过Lambda SDK动态获取
- 连接池优化:Lambda是无状态服务,需合理设置Sequelize连接池大小,避免连接耗尽
- 冷启动优化:可启用Lambda预配置并发,或用
serverless-webpack打包减少依赖体积
内容的提问来源于stack exchange,提问作者Joshua Foxworth
相关产品推荐
相关产品推荐

