SST数据库集成:DynamoDB、RDS与Redis实战

SST数据库集成:DynamoDB、RDS与Redis实战

【免费下载链接】sst Build modern full-stack applications on AWS 【免费下载链接】sst 项目地址: 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"
});

配置参数详解:

参数类型说明默认值
fieldsObject表字段定义必需
primaryIndexObject主索引配置必需
globalSecondaryIndexesArray全局二级索引[]
streamString流配置"disabled"
billingModeString计费模式"pay-per-request"

数据流与实时处理

DynamoDB Streams是SST集成的重要特性,支持实时数据处理:

mermaid

启用流配置的示例:

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和MySQLPostgreSQL
版本管理自动选择兼容版本PostgreSQL 16.4 / MySQL 3.08.0
自动扩缩容Serverless v2按需扩缩0.5-4 ACU
自动暂停空闲时自动暂停节省成本5分钟无连接后暂停
读写分离支持最多15个只读副本0个副本
数据APIHTTP端点访问,无需持久连接禁用
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

本地开发时的数据库连接流程:

mermaid

监控与维护

Aurora组件自动集成AWS CloudWatch监控,提供以下关键指标:

监控指标描述告警阈值建议
CPU利用率数据库CPU使用率>80%持续5分钟
内存使用内存消耗情况>90%持续5分钟
连接数当前活跃连接数>最大连接数80%
存储空间磁盘使用情况>85%
复制延迟只读副本延迟>100ms

安全最佳实践

  1. 网络隔离:始终在VPC内部部署数据库
  2. 访问控制:使用IAM角色进行身份验证
  3. 加密传输:强制使用SSL/TLS加密
  4. 密钥管理:使用Secrets Manager管理数据库密码
  5. 审计日志:启用数据库审计日志
// 安全配置示例
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
  }
});
性能调优建议
  • 适当增加max ACU值应对流量高峰
  • 使用只读副本分流读操作
  • 启用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
    }
  }
);

内存优化策略mermaid

监控与告警

SST集成了完善的监控体系,可以通过CloudWatch监控Redis性能指标:

指标名称描述告警阈值
CPUUtilizationCPU使用率> 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 集成实现了数据库迁移的自动化。以下是一个典型的迁移工作流:

mermaid

迁移函数的核心实现如下:

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: "警报:数据库迁移失败"
});

多环境数据同步

对于多环境(开发、测试、生产)的数据同步需求:

mermaid

数据版本控制最佳实践

  1. 迁移文件命名规范:使用时间戳和描述性名称(如 0001_create_users_table.sql
  2. 回滚策略:每个迁移文件应包含对应的回滚操作
  3. 数据验证:迁移后执行数据完整性检查
  4. 性能监控:记录迁移执行时间和资源消耗

通过 SST 的数据库迁移和数据管理方案,团队可以实现安全、可靠且自动化的数据库变更管理,大大降低了人为错误的风险,提高了部署的可靠性。

总结

通过SST框架的声明式配置和自动化管理,开发者可以高效集成DynamoDB、Aurora RDS和Redis三种数据库服务,构建高性能、高可用的无服务器应用。SST提供了从开发到生产的完整解决方案,包括安全最佳实践、性能优化策略、成本控制方案和自动化迁移流程。这种基础设施即代码的方式大大简化了数据库管理复杂度,让开发者能够专注于业务逻辑实现,同时享受AWS全托管数据库服务的可靠性和扩展性。

【免费下载链接】sst Build modern full-stack applications on AWS 【免费下载链接】sst 项目地址: https://gitcode.com/gh_mirrors/ss/sst

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值