SST数据库集成:DynamoDB、RDS与Redis实战
【免费下载链接】sst Build modern full-stack applications on AWS 项目地址: https://gitcode.com/gh_mirrors/ss/sst
本文全面介绍了在SST框架中集成三种主要AWS数据库服务的实战方案。首先详细讲解了DynamoDB的无服务器配置,包括基础表设置、数据流处理、高级索引策略和数据访问模式。接着深入探讨了Aurora RDS关系型数据库的集成,涵盖核心特性、性能优化、安全实践和监控维护。最后重点阐述了Redis内存数据库的缓存方案,包括多引擎支持、环境切换、缓存策略和成本优化。文章还提供了数据库迁移与数据管理的完整解决方案,确保数据一致性和应用稳定性。
DynamoDB无服务器数据库配置
在现代无服务器架构中,DynamoDB作为AWS的完全托管NoSQL数据库服务,以其出色的性能和可扩展性成为首选。SST框架通过简洁的声明式配置,让开发者能够轻松集成DynamoDB,实现真正的无服务器数据库解决方案。
基础表配置
SST使用sst.aws.Dynamo组件来定义DynamoDB表,支持完整的表属性和索引配置:
const table = new sst.aws.Dynamo("MyTable", {
fields: {
id: "string",
name: "string",
email: "string",
createdAt: "number"
},
primaryIndex: {
hashKey: "id"
},
globalSecondaryIndexes: [
{
name: "EmailIndex",
hashKey: "email",
projection: "all"
}
],
stream: "new-and-old-images",
billingMode: "pay-per-request"
});
配置参数详解:
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
fields | Object | 表字段定义 | 必需 |
primaryIndex | Object | 主索引配置 | 必需 |
globalSecondaryIndexes | Array | 全局二级索引 | [] |
stream | String | 流配置 | "disabled" |
billingMode | String | 计费模式 | "pay-per-request" |
数据流与实时处理
DynamoDB Streams是SST集成的重要特性,支持实时数据处理:
启用流配置的示例:
const table = new sst.aws.Dynamo("UserTable", {
fields: { userId: "string", data: "string" },
primaryIndex: { hashKey: "userId" },
stream: "new-and-old-images" // 支持新旧镜像
});
// 订阅流事件
table.subscribe("UserStreamProcessor", "streamHandler.handler", {
filters: [
{
dynamodb: {
NewImage: {
status: { S: ["active"] }
}
}
}
]
});
高级索引策略
SST支持复杂的索引配置,满足不同查询需求:
const analyticsTable = new sst.aws.Dynamo("AnalyticsTable", {
fields: {
tenantId: "string",
eventType: "string",
timestamp: "number",
userId: "string",
payload: "string"
},
primaryIndex: {
hashKey: "tenantId",
rangeKey: "timestamp"
},
globalSecondaryIndexes: [
{
name: "UserEventsIndex",
hashKey: "userId",
rangeKey: "timestamp",
projection: "include",
nonKeyAttributes: ["eventType", "payload"]
},
{
name: "EventTypeIndex",
hashKey: "eventType",
rangeKey: "timestamp",
projection: "keys_only"
}
],
localSecondaryIndexes: [
{
name: "TenantEventTypeIndex",
hashKey: "tenantId",
rangeKey: "eventType",
projection: "all"
}
]
});
数据访问模式
在Lambda函数中访问DynamoDB表:
import { Resource } from "sst";
import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient();
export const handler = async (event) => {
// 查询操作
const result = await client.send(
new QueryCommand({
TableName: Resource.MyTable.name,
KeyConditionExpression: "id = :id",
ExpressionAttributeValues: {
":id": { S: event.pathParameters.id }
}
})
);
return {
statusCode: 200,
body: JSON.stringify(result.Items, null, 2)
};
};
过滤器配置
SST提供强大的事件过滤能力,精确控制流处理:
table.subscribe("FilteredProcessor", "handler.handler", {
filters: [
{
dynamodb: {
NewImage: {
category: { S: ["premium"] },
price: { N: [{ numeric: [">", 100] }] }
}
}
},
{
eventName: ["INSERT", "MODIFY"]
}
]
});
性能优化配置
针对高性能场景的优化配置:
const highPerfTable = new sst.aws.Dynamo("HighPerformanceTable", {
fields: {
pk: "string",
sk: "string",
data: "string"
},
primaryIndex: {
hashKey: "pk",
rangeKey: "sk"
},
// 性能相关配置
readCapacity: 100,
writeCapacity: 50,
autoScaling: {
read: {
min: 50,
max: 1000,
target: 70
},
write: {
min: 25,
max: 500,
target: 70
}
}
});
安全与权限
SST自动处理DynamoDB表的IAM权限,通过link属性简化权限管理:
const secureTable = new sst.aws.Dynamo("SecureDataTable", {
fields: { sensitiveData: "string" },
primaryIndex: { hashKey: "id" }
});
const processor = new sst.aws.Function("DataProcessor", {
handler: "processor.handler",
link: [secureTable], // 自动授予访问权限
environment: {
TABLE_NAME: secureTable.name
}
});
通过SST的声明式配置,开发者可以快速构建基于DynamoDB的无服务器数据层,享受自动化的部署、权限管理和监控能力,真正实现基础设施即代码的最佳实践。
Aurora RDS关系型数据库集成
Amazon Aurora是AWS提供的高性能、高可用的关系型数据库服务,与MySQL和PostgreSQL完全兼容。在SST框架中,Aurora组件提供了简单直观的方式来部署和管理Aurora数据库集群,支持Serverless v2自动扩缩容、读写分离、数据API等高级特性。
Aurora组件核心特性
SST的Aurora组件封装了AWS Aurora Serverless v2的强大功能,提供以下核心特性:
| 特性 | 描述 | 默认值 |
|---|---|---|
| 数据库引擎 | 支持PostgreSQL和MySQL | PostgreSQL |
| 版本管理 | 自动选择兼容版本 | PostgreSQL 16.4 / MySQL 3.08.0 |
| 自动扩缩容 | Serverless v2按需扩缩 | 0.5-4 ACU |
| 自动暂停 | 空闲时自动暂停节省成本 | 5分钟无连接后暂停 |
| 读写分离 | 支持最多15个只读副本 | 0个副本 |
| 数据API | HTTP端点访问,无需持久连接 | 禁用 |
| RDS代理 | 连接池管理,适合Serverless | 禁用 |
基础配置示例
在SST中配置Aurora数据库非常简单,以下是一个完整的PostgreSQL配置示例:
// sst.config.ts
import { Resource } from "sst";
const vpc = new sst.aws.Vpc("MyVpc", {
nat: "ec2",
bastion: true, // 启用堡垒机用于本地连接
});
const database = new sst.aws.Aurora("MyDatabase", {
engine: "postgres",
version: "16.4",
username: "admin",
database: "myapp",
vpc: vpc,
scaling: {
min: "0.5 ACU",
max: "8 ACU",
pauseAfter: "10 minutes"
},
replicas: 2,
dataApi: true
});
new sst.aws.Function("MyApp", {
handler: "src/lambda.handler",
link: [database],
url: true,
vpc: vpc,
});
数据库连接与操作
在Lambda函数中连接Aurora数据库的完整示例:
// src/lambda.ts
import postgres from "postgres";
import { Resource } from "sst";
// 初始化数据库连接
const sql = postgres({
username: Resource.MyDatabase.username,
password: Resource.MyDatabase.password,
database: Resource.MyDatabase.database,
host: Resource.MyDatabase.host,
port: Resource.MyDatabase.port,
ssl: process.env.NODE_ENV === "production" ? true : false
});
export async function handler(event: any) {
try {
// 创建用户表(如果不存在)
await sql`
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
name VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
)
`;
// 插入示例数据
const newUser = await sql`
INSERT INTO users (email, name)
VALUES (${event.email}, ${event.name})
RETURNING *
`;
// 查询所有用户
const users = await sql`SELECT * FROM users`;
return {
statusCode: 200,
body: JSON.stringify({
newUser: newUser[0],
totalUsers: users.length,
users: users
})
};
} catch (error) {
console.error("Database error:", error);
return {
statusCode: 500,
body: JSON.stringify({ error: "Internal server error" })
};
}
}
高级配置选项
1. 性能优化配置
const productionDB = new sst.aws.Aurora("ProductionDB", {
engine: "postgres",
version: "16.4",
scaling: {
min: "2 ACU", // 生产环境避免设置0 ACU
max: "32 ACU", // 根据负载调整
pauseAfter: undefined // 生产环境禁用自动暂停
},
replicas: 3, // 3个只读副本用于负载均衡
proxy: { // 启用RDS代理优化连接
credentials: [
{ username: "readonly_user", password: "readonly_pass" }
]
}
});
2. 成本优化配置(开发环境)
const devDB = new sst.aws.Aurora("DevDB", {
engine: "postgres",
scaling: {
min: "0 ACU", // 允许缩放到0节省成本
max: "2 ACU", // 开发环境不需要高性能
pauseAfter: "5 minutes" // 5分钟无活动后暂停
},
dataApi: true // 启用Data API方便本地开发
});
本地开发与调试
SST提供了完整的本地开发支持:
# 安装隧道工具(只需一次)
sudo npx sst tunnel install
# 启动开发环境
npx sst dev
# 本地连接数据库
psql postgres://username:password@localhost:5432/database
本地开发时的数据库连接流程:
监控与维护
Aurora组件自动集成AWS CloudWatch监控,提供以下关键指标:
| 监控指标 | 描述 | 告警阈值建议 |
|---|---|---|
| CPU利用率 | 数据库CPU使用率 | >80%持续5分钟 |
| 内存使用 | 内存消耗情况 | >90%持续5分钟 |
| 连接数 | 当前活跃连接数 | >最大连接数80% |
| 存储空间 | 磁盘使用情况 | >85% |
| 复制延迟 | 只读副本延迟 | >100ms |
安全最佳实践
- 网络隔离:始终在VPC内部部署数据库
- 访问控制:使用IAM角色进行身份验证
- 加密传输:强制使用SSL/TLS加密
- 密钥管理:使用Secrets Manager管理数据库密码
- 审计日志:启用数据库审计日志
// 安全配置示例
const secureDB = new sst.aws.Aurora("SecureDB", {
engine: "postgres",
vpc: vpc,
// 自动启用加密和备份
backup: {
retention: 7, // 7天备份保留
preferredWindow: "02:00-04:00" // 备份窗口
}
});
故障排除与常见问题
连接超时问题
// 增加连接超时设置
const sql = postgres({
// ...其他配置
connection: {
timeout: 30000, // 30秒超时
keepAlive: true
}
});
性能调优建议
- 适当增加
maxACU值应对流量高峰 - 使用只读副本分流读操作
- 启用RDS代理管理连接池
- 定期分析慢查询日志
Aurora RDS集成提供了企业级的关系型数据库解决方案,结合SST的简化配置和自动化管理,让开发者能够快速构建高性能、高可用的数据驱动应用。
Redis内存数据库缓存方案
在现代全栈应用开发中,Redis作为高性能的内存数据库,在缓存、会话存储和实时数据处理等场景中发挥着关键作用。SST框架通过其强大的Redis组件,为开发者提供了无缝集成Amazon ElastiCache Redis的能力,同时支持本地开发环境的灵活配置。
Redis组件核心特性
SST的Redis组件基于Amazon ElastiCache构建,提供了企业级的Redis集群管理能力:
多引擎支持:
- Redis开源版本:完全兼容开源Redis协议
- Valkey引擎:Redis兼容的高性能内存键值存储
- 默认版本:Redis 7.1 / Valkey 7.2
灵活的集群配置:
const redis = new sst.aws.Redis("MyRedis", {
engine: "redis", // 或 "valkey"
version: "7.1", // 指定版本
instance: "t4g.micro", // 实例类型
cluster: { nodes: 3 }, // 集群节点数
parameters: { // 自定义参数
"maxmemory-policy": "allkeys-lru"
},
vpc: myVpc // VPC网络配置
});
开发与生产环境无缝切换
SST的Redis组件支持开发和生产环境的智能切换,通过dev配置实现本地开发:
const redis = new sst.aws.Redis("MyRedis", {
vpc: myVpc,
dev: {
host: "localhost", // 本地Redis服务器
port: 6379, // 默认端口
username: "default", // 认证用户名
password: "secret" // 认证密码
}
});
这种配置允许开发者在本地使用Docker或其他方式运行Redis,而在部署时自动切换到ElastiCache集群。
资源链接与自动配置
SST的链接系统使得Redis集成变得极其简单:
// 在sst.config.ts中链接Redis
new sst.aws.Nextjs("MyWebApp", {
link: [redis], // 自动注入连接信息
vpc: myVpc
});
// 在应用代码中使用
import { Resource } from "sst";
import { Cluster } from "ioredis";
const redisClient = new Cluster(
[{
host: Resource.MyRedis.host,
port: Resource.MyRedis.port
}],
{
redisOptions: {
tls: { checkServerIdentity: () => undefined },
username: Resource.MyRedis.username,
password: Resource.MyRedis.password
}
}
);
缓存策略最佳实践
数据缓存模式:
async function getCachedData(key: string, ttl = 3600) {
const cached = await redisClient.get(key);
if (cached) return JSON.parse(cached);
// 缓存未命中,从数据库获取
const data = await fetchFromDatabase(key);
await redisClient.setex(key, ttl, JSON.stringify(data));
return data;
}
会话存储方案:
const sessionStore = {
async get(sessionId: string) {
return await redisClient.get(`session:${sessionId}`);
},
async set(sessionId: string, data: any, ttl: number) {
await redisClient.setex(`session:${sessionId}`, ttl, JSON.stringify(data));
},
async destroy(sessionId: string) {
await redisClient.del(`session:${sessionId}`);
}
};
性能优化配置
连接池管理:
const redisCluster = new Cluster(
[{ host: Resource.MyRedis.host, port: Resource.MyRedis.port }],
{
scaleReads: "slave",
retryDelayOnFailover: 100,
retryDelayOnClusterDown: 100,
retryDelayOnTryAgain: 100,
redisOptions: {
maxRetriesPerRequest: 3,
connectTimeout: 10000,
lazyConnect: true
}
}
);
内存优化策略:
监控与告警
SST集成了完善的监控体系,可以通过CloudWatch监控Redis性能指标:
| 指标名称 | 描述 | 告警阈值 |
|---|---|---|
| CPUUtilization | CPU使用率 | > 80% |
| DatabaseMemoryUsagePercentage | 内存使用率 | > 85% |
| CacheHits | 缓存命中次数 | < 1000/分钟 |
| CacheMisses | 缓存未命中次数 | > 500/分钟 |
| CurrConnections | 当前连接数 | > 1000 |
安全最佳实践
网络隔离:
const vpc = new sst.aws.Vpc("MyVpc", {
bastion: true, // 启用堡垒机
nat: "managed" // 托管NAT网关
});
const redis = new sst.aws.Redis("MyRedis", {
vpc,
transform: {
cluster: {
securityGroupIds: [customSecurityGroupId] // 自定义安全组
}
}
});
数据加密:
- 传输中加密:强制TLS连接
- 静态加密:启用ElastiCache加密
- 认证授权:使用IAM角色和Redis AUTH
成本优化策略
实例类型选择:
// 开发环境使用低成本实例
const devRedis = new sst.aws.Redis("DevRedis", {
instance: "t4g.micro", // $0.016/小时
vpc: devVpc
});
// 生产环境使用高性能实例
const prodRedis = new sst.aws.Redis("ProdRedis", {
instance: "m7g.xlarge", // 根据负载选择
cluster: { nodes: 3 }, // 多节点保障高可用
vpc: prodVpc
});
自动扩缩容: 通过CloudWatch警报和Auto Scaling策略,根据负载动态调整Redis集群规模,实现成本效益最大化。
故障恢复与备份
多可用区部署:
const redis = new sst.aws.Redis("MyRedis", {
vpc: multiAZVpc,
cluster: { nodes: 2 }, // 跨AZ部署
transform: {
cluster: {
automaticFailoverEnabled: true,
multiAzEnabled: true
}
}
});
备份策略:
- 自动每日快照
- 7天保留期
- 跨区域复制备份
SST的Redis集成方案为企业级应用提供了完整的缓存解决方案,从开发到生产,从性能到安全,每一个环节都经过精心设计和优化,确保开发者能够专注于业务逻辑而非基础设施管理。
数据库迁移与数据管理
在现代应用开发中,数据库迁移和数据管理是确保数据一致性和应用稳定性的关键环节。SST 提供了强大的工具链来简化数据库迁移过程,支持多种数据库类型,包括 PostgreSQL、MySQL 和 Redis。通过集成 Drizzle ORM 和自动化部署流程,开发者可以实现零停机迁移和版本控制的数据结构管理。
自动化迁移策略
SST 通过 Lambda 函数和 CI/CD 集成实现了数据库迁移的自动化。以下是一个典型的迁移工作流:
迁移函数的核心实现如下:
import { db } from "./drizzle";
import { migrate } from "drizzle-orm/postgres-js/migrator";
export const handler = async (event: any) => {
await migrate(db, {
migrationsFolder: "./migrations",
});
};
迁移文件管理
SST 项目中的迁移文件组织结构遵循标准化模式:
migrations/
├── meta/
│ ├── 0000_snapshot.json
│ └── _journal.json
├── 0000_lethal_justin_hammer.sql
└── (后续迁移文件)
每个迁移文件包含完整的 SQL 语句,确保数据库结构变更的可追溯性:
-- 示例迁移文件内容
CREATE TABLE IF NOT EXISTS todos (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
completed BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_todos_completed ON todos(completed);
环境感知的迁移执行
SST 支持根据环境自动执行迁移,避免在开发环境中不必要的迁移操作:
const migrator = new sst.aws.Function("DatabaseMigrator", {
handler: "src/migrator.handler",
link: [rds],
vpc,
copyFiles: [
{
from: "migrations",
to: "./migrations",
},
],
});
// 仅在非开发环境执行迁移
if (!$dev) {
new aws.lambda.Invocation("DatabaseMigratorInvocation", {
input: Date.now().toString(), // 使用时间戳确保每次部署都执行
functionName: migrator.name,
});
}
数据备份与恢复策略
对于生产环境的数据管理,SST 提供了完善的数据备份机制:
| 备份类型 | 频率 | 保留策略 | 恢复时间目标 |
|---|---|---|---|
| 自动快照 | 每日 | 30天 | < 15分钟 |
| 事务日志 | 连续 | 7天 | < 5分钟 |
| 跨区域复制 | 实时 | 主备同步 | < 1分钟 |
数据库连接管理
SST 通过 VPC 和安全组配置确保数据库连接的安全性:
const vpc = new sst.aws.Vpc("MyVpc", {
bastion: true,
nat: "ec2"
});
const rds = new sst.aws.Postgres("MyPostgres", {
vpc,
proxy: true // 启用连接池代理
});
迁移监控与告警
集成 CloudWatch 监控迁移执行状态:
// 迁移成功指标
new aws.cloudwatch.MetricAlarm("MigrationSuccessAlarm", {
comparisonOperator: "LessThanThreshold",
evaluationPeriods: 1,
metricName: "SuccessfulMigrations",
namespace: "Custom/Metrics",
period: 300,
statistic: "Sum",
threshold: 1,
alarmDescription: "警报:数据库迁移失败"
});
多环境数据同步
对于多环境(开发、测试、生产)的数据同步需求:
数据版本控制最佳实践
- 迁移文件命名规范:使用时间戳和描述性名称(如
0001_create_users_table.sql) - 回滚策略:每个迁移文件应包含对应的回滚操作
- 数据验证:迁移后执行数据完整性检查
- 性能监控:记录迁移执行时间和资源消耗
通过 SST 的数据库迁移和数据管理方案,团队可以实现安全、可靠且自动化的数据库变更管理,大大降低了人为错误的风险,提高了部署的可靠性。
总结
通过SST框架的声明式配置和自动化管理,开发者可以高效集成DynamoDB、Aurora RDS和Redis三种数据库服务,构建高性能、高可用的无服务器应用。SST提供了从开发到生产的完整解决方案,包括安全最佳实践、性能优化策略、成本控制方案和自动化迁移流程。这种基础设施即代码的方式大大简化了数据库管理复杂度,让开发者能够专注于业务逻辑实现,同时享受AWS全托管数据库服务的可靠性和扩展性。
【免费下载链接】sst Build modern full-stack applications on AWS 项目地址: https://gitcode.com/gh_mirrors/ss/sst
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



