多租户环境管理最佳实践
概述
对于 SaaS 平台、教育培训机构或企业服务商,可能需要为每个客户或租户提供独立的云开发环境。云开发提供了完整的编程化管理能力,让服务商可以通过代码自动化创建环境、配置资源、部署应用,实现「一个租户对应一个独立环境」的多租户架构。
本文档介绍如何使用三种本地工具完成环境的全生命周期管理:
| 工具方式 | 适用场景 | 核心能力 |
|---|---|---|
| Manager Node SDK | Node.js 后端服务 | 完整的环境管理 API,代码集成度高 |
| CLI 命令行工具 | 本地开发与部署 | 命令行操作,快速部署 |
| MCP 工具 | AI 驱动的自动化 | 自然语言操作,智能化管理 |
使用场景
典型场景
SaaS 平台多租户隔离
- 每个企业客户拥有独立的云开发环境
- 数据完全隔离,互不影响
- 可按客户需求动态创建和销毁环境
教育培训平台
- 为每个学生或班级创建独立的实验环境
- 课程结束后自动清理环境
- 实现资源的弹性管理
项目管理平台
- 为每个项目创建独立的开发环境
- 项目归档后释放环境资源
- 支持项目间的完全隔离
架构优势
- 数据隔离:每个租户拥有独立的数据库、存储和函数资源
- 安全可靠:租户间完全隔离,避免数据泄露风险
- 灵活扩展:根据业务需求动态创建和释放环境
- 统一管理:服务商通过统一接口管理所有租户环境
- 成本优化:按需创建和销毁环境,优化资源使用
前提条件
在开始之前,请确保:
- 账户余额充足:创建云开发环境需要扣费,请确保腾讯云账户余额充足
- API 密钥:已获取腾讯云 API 密钥(SecretId 和 SecretKey),获取 API 密钥
- 权限配置:确保 API 密钥拥有云开发环境管理权限
核心管理能力
服务商可以通过本地工具完成以下环境管理操作:
环境管理
| 操作 | 说明 | 支持方式 |
|---|---|---|
| 创建环境 | 为租户创建新的云开发环境 | SDK |
| 查询环境 | 获取环境列表和详细信息 | SDK / CLI / MCP |
| 修改配置 | 更新环境名称、套餐等配置 | SDK / CLI |
| 销毁环境 | 删除不再使用的环境 | SDK |
| 域名管理 | 添加/删除安全域名白名单 | SDK / CLI / MCP |
详细文档:
数据库管理
| 操作 | 说明 | 支持方式 |
|---|---|---|
| 创建集合 | 创建文档型数据库集合 | SDK / CLI / MCP |
| 创建表 | 创建 MySQL 数据库表 | SDK / MCP |
| 数据导入 | 批量导入初始数据 | SDK |
| 索引管理 | 创建和管理数据库索引 | SDK / MCP |
| 权限配置 | 设置数据库安全规则 | SDK |
详细文档:
云函数部署
| 操作 | 说明 | 支持方式 |
|---|---|---|
| 创建函数 | 创建新的云函数 | SDK / CLI / MCP |
| 更新代码 | 更新函数代码和配置 | SDK / CLI / MCP |
| 查询函数 | 获取函数列表和详细信息 | SDK / CLI / MCP |
| 触发器管理 | 配置定时触发器等 | SDK / CLI |
| 查看日志 | 查询函数运行日志 | SDK / CLI / MCP |
详细文档:
云托管部署
| 操作 | 说明 | 支持方式 |
|---|---|---|
| 创建服务 | 创建 CloudRun 容器服务 | SDK / CLI / MCP |
| 部署版本 | 部署新版本镜像 | SDK / CLI / MCP |
| 配置管理 | 更新服务配置和环境变量 | SDK / CLI / MCP |
| 查询状态 | 获取服务运行状态 | SDK / CLI / MCP |
| 查看日志 | 查询服务日志 | SDK / CLI / MCP |
详细文档:
云存储管理
| 操作 | 说明 | 支持方式 |
|---|---|---|
| 上传文件 | 上传本地文件到云存储 | SDK / CLI / MCP |
| 下载文件 | 下载云存储文件到本地 | SDK / CLI / MCP |
| 删除文件 | 删除云存储中的文件 | SDK / CLI / MCP |
| 目录管理 | 创建和管理存储目录 | SDK / CLI / MCP |
| 权限设置 | 配置文件访问权限 | SDK / CLI |
详细文档:
方案选择
根据您的技术栈和使用场景,选择合适的管理方式:
Manager Node SDK
适用场景:Node.js 后端服务,需要深度集成环境管理能力
优势:
- 完整的 TypeScript 类型支持
- 代码集成度高,易于维护
- 丰富的 API 封装
- 完善的错误处理
快速开始:
npm install @cloudbase/manager-node
import CloudBase from '@cloudbase/manager-node'
const manager = new CloudBase({
secretId: 'Your SecretId',
secretKey: 'Your SecretKey'
})
// 创建环境
const result = await manager.env.createEnv({
alias: '租户A专属环境'
})
完整文档:Manager Node SDK 文档
CLI 命令行工具
适用场景:本地开发与部署,需要快速执行管理操作
优势:
- 命令行操作,简单直观
- 快速部署和管理资源
- 适合本地开发环境
- 无需编写代码
快速开始:
# 安装 CLI
npm i -g @cloudbase/cli
# 登录
tcb login
# 查看环境列表
tcb env list
# 创建数据库集合
tcb db list
# 部署云函数
tcb fn deploy
# 部署云托管服务
tcb cloudrun deploy
完整文档:CloudBase CLI 文档
MCP 工具
适用场景:AI 驱动的自动化管理,快速原型开发
优势:
- 自然语言操作,无需编码
- 快速实现自动化流程
- 适合与 AI 助手集成
- 降低开发门槛
快速开始:
安装 CloudBase AI Toolkit 后,通过自然语言与 AI 助手交互:
用户:为租户 A 创建一个新环境
AI:正在创建环境...
用户:为这个环境创建一个名为 users 的数据库集合
AI:已创建集合 users
用户:部署云函数 login 到这个环境
AI:正在部署云函数...
完整文档:CloudBase MCP 工具文档
完整示例:多租户管理系统
以下是一个完整的多租户管理系统示例,展示如何使用 Manager Node SDK 管理租户环境:
import CloudBase from '@cloudbase/manager-node'
class TenantManager {
constructor(secretId, secretKey) {
this.secretId = secretId
this.secretKey = secretKey
this.tenantEnvMap = new Map()
}
// 获取管理器实例
getManager(envId) {
return new CloudBase({
secretId: this.secretId,
secretKey: this.secretKey,
envId: envId
})
}
// 为租户创建环境
async createTenantEnv(tenantId, config) {
try {
const manager = new CloudBase({
secretId: this.secretId,
secretKey: this.secretKey
})
// 创建环境
const result = await manager.env.createEnv({
alias: config.alias || `${tenantId}-env`,
payMode: 'postpay'
})
const envId = result.EnvId
this.tenantEnvMap.set(tenantId, envId)
console.log(`租户 ${tenantId} 环境创建成功: ${envId}`)
return envId
} catch (error) {
console.error(`创建环境失败:`, error)
throw error
}
}
// 初始化租户环境
async setupTenantEnv(tenantId, config) {
const envId = this.tenantEnvMap.get(tenantId)
if (!envId) throw new Error(`租户 ${tenantId} 未绑定环境`)
const manager = this.getManager(envId)
// 1. 配置安全域名
if (config.domains) {
await manager.env.createEnvDomain(config.domains)
}
// 2. 创建数据库集合
if (config.collections) {
for (const collection of config.collections) {
await manager.database.createCollection(collection)
}
}
// 3. 部署云函数
if (config.functions) {
for (const func of config.functions) {
await manager.functions.createFunction({
functionName: func.name,
functionRootPath: func.path
})
}
}
// 4. 上传初始文件
if (config.files) {
for (const file of config.files) {
await manager.storage.uploadFile({
localPath: file.localPath,
cloudPath: file.cloudPath
})
}
}
console.log(`租户 ${tenantId} 环境配置完成`)
}
// 查询租户环境信息
async getTenantEnvInfo(tenantId) {
const envId = this.tenantEnvMap.get(tenantId)
if (!envId) throw new Error(`租户 ${tenantId} 未绑定环境`)
const manager = this.getManager(envId)
const envInfo = await manager.env.getEnvInfo()
return {
tenantId,
envId,
envInfo: envInfo.EnvInfo
}
}
// 销毁租户环境
async destroyTenantEnv(tenantId) {
const envId = this.tenantEnvMap.get(tenantId)
if (!envId) throw new Error(`租户 ${tenantId} 未绑定环境`)
const manager = this.getManager(envId)
// 销毁环境
await manager.env.destroyEnv()
this.tenantEnvMap.delete(tenantId)
console.log(`租户 ${tenantId} 环境已销毁`)
}
}
// 使用示例
async function example() {
const tenantManager = new TenantManager(
'Your SecretId',
'Your SecretKey'
)
// 1. 为租户 A 创建环境
const envId = await tenantManager.createTenantEnv('tenant-a', {
alias: '租户A专属环境'
})
// 2. 初始化环境
await tenantManager.setupTenantEnv('tenant-a', {
domains: ['tenant-a.example.com'],
collections: ['users', 'orders'],
functions: [
{ name: 'login', path: './functions/login' },
{ name: 'getUserInfo', path: './functions/getUserInfo' }
],
files: [
{ localPath: './assets/logo.png', cloudPath: '/assets/logo.png' }
]
})
// 3. 查询环境信息
const info = await tenantManager.getTenantEnvInfo('tenant-a')
console.log('租户环境信息:', info)
}
常见问题
Q: 是否支持通过 API 创建环境?
支持。可以通过以下三种方式创建环境:
- Manager Node SDK:
manager.env.createEnv() - MCP 工具: 通过 AI 助手自然语言创建
Q: 如何销毁不再使用的环境?
可以通过以下方式销毁环境:
- Manager Node SDK:
manager.env.destroyEnv() - MCP 工具: 通过 AI 助手自然语言销毁
在销毁前请确保已备份重要数据。
Q: 一个账户最多可以创建多少个环境?
云开发账户的环境数量上限为50个
Q: 如何监控多个环境的资源使用情况?
可以通过以下方式监控:
- 使用 Manager Node SDK 定期查询环境信息
- 通过 云开发控制台 查看监控面板