跳到主要内容

多租户环境管理最佳实践

概述

对于 SaaS 平台、教育培训机构或企业服务商,可能需要为每个客户或租户提供独立的云开发环境。云开发提供了完整的编程化管理能力,让服务商可以通过代码自动化创建环境、配置资源、部署应用,实现「一个租户对应一个独立环境」的多租户架构。

本文档介绍如何使用三种本地工具完成环境的全生命周期管理:

工具方式适用场景核心能力
Manager Node SDKNode.js 后端服务完整的环境管理 API,代码集成度高
CLI 命令行工具本地开发与部署命令行操作,快速部署
MCP 工具AI 驱动的自动化自然语言操作,智能化管理

使用场景

典型场景

  1. SaaS 平台多租户隔离

    • 每个企业客户拥有独立的云开发环境
    • 数据完全隔离,互不影响
    • 可按客户需求动态创建和销毁环境
  2. 教育培训平台

    • 为每个学生或班级创建独立的实验环境
    • 课程结束后自动清理环境
    • 实现资源的弹性管理
  3. 项目管理平台

    • 为每个项目创建独立的开发环境
    • 项目归档后释放环境资源
    • 支持项目间的完全隔离

架构优势

  • 数据隔离:每个租户拥有独立的数据库、存储和函数资源
  • 安全可靠:租户间完全隔离,避免数据泄露风险
  • 灵活扩展:根据业务需求动态创建和释放环境
  • 统一管理:服务商通过统一接口管理所有租户环境
  • 成本优化:按需创建和销毁环境,优化资源使用

前提条件

在开始之前,请确保:

  1. 账户余额充足:创建云开发环境需要扣费,请确保腾讯云账户余额充足
  2. API 密钥:已获取腾讯云 API 密钥(SecretId 和 SecretKey),获取 API 密钥
  3. 权限配置:确保 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: 如何监控多个环境的资源使用情况?

可以通过以下方式监控:

  1. 使用 Manager Node SDK 定期查询环境信息
  2. 通过 云开发控制台 查看监控面板

相关资源