跳到主要内容

腾讯云子账号模式

适用场景

给员工提供隔离的 AI 开发环境,每位员工一个腾讯云子账号,独立隔离,可登录腾讯云控制台。

参考实现模式

本文档描述的是一种参考实现模式。你可以通过以下方式实现子账号和资源分配:

  • 方式一:在一个环境下开发云函数 + 网页 + 认证,实现自动分配子账号
  • 方式二:手动或通过本地脚本下发子账号和资源

两种方式都是可行的参考实现,可根据实际需求选择。

本方案解决的核心问题:给企业员工分配独立隔离的云开发环境,员工可以用腾讯云子账号登录控制台人工查看和管理资源,适合对资源可见性和人工管控有需求的企业内部场景。

接入流程

子账号模式的接入分为两步:

第一步:开通和管理云开发环境

使用腾讯云 API 为员工创建子账号、分配云开发环境,并配置权限策略。

→ 详见 环境与资源管理 API

第二步:MCP / Skill 接入 Agent

将子账号的 API 密钥或 API Key 配置到员工 Agent 工具的 MCP 中,员工即可在 Agent 中直接操作自己的云开发环境。

→ 详见下方"配置 MCP 和 Skill"章节


方案概述

为企业提供统一的 AI 开发资源管理平台,为每位员工分配独立的云开发环境和 AI 助手服务器,实现:

  • 资源统一分配:企业管理员通过管理环境为员工创建独立的云开发环境和服务器
  • 资源完全隔离:每个员工拥有独立的云开发环境和服务器,互不干扰
  • 开箱即用的 AI 能力:每台服务器预装 OpenClaw AI 助手,集成云开发能力
  • 精细化权限控制:员工只能访问自己的资源,无法误操作他人环境
  • 统一管理视图:企业可查看所有资源使用情况,成本可控
  • 人工可管可查:员工可通过子账号登录腾讯云控制台,人工管理/检查云资源

整体架构


核心流程


配置权限策略

为每个子账号配置 CAM 权限策略,限制其只能访问自己的云开发环境。策略模板见下方,其中的 ${...} 为需要替换的占位符。

策略模板

以下是完整的策略模板,其中 ${...} 为需要替换的占位符:

点击查看完整策略模板 JSON
{
"statement": [
{
"action": [
"cam:CreateRole",
"cam:AttachRolePolicy",
"cam:ListAttachedRolePolicies",
"cam:UpdatePolicy",
"cam:CreateServiceLinkedRole",
"cam:DescribeServiceLinkedRole",
"cam:GetRole",
"cdn:TcbCheckResource",
"organization:DescribeCloudApplicationToMember",
"tcbr:DescribeArchitectureType",
"tcbr:DescribeUserServiceTermsRecord",
"lowcode:GetUserCertifyInfo",
"lowcode:DescribeUserCompositeGroupsList",
"lowcode:DescribeWedaWxBind",
"lowcode:GetMaxAppNum",
"lowcode:DescribeApps",
"tcb:CheckTcbService",
"tcb:DescribePackages",
"tcb:DescribeEnvLimit",
"tcb:DescribeBillingInfo",
"tcb:DescribeExtensionsInstalled",
"tcb:DescribeExtensions",
"tcb:DescribeCloudBaseRunAdvancedConfiguration",
"tcb:DescribePostPackage",
"tcb:DescribeICPResources",
"tcb:DescribeExtensionUpgrade",
"tcb:DescribeMonitorMetric",
"tcb:DescribeLowCodeUserQuotaUsage",
"tcb:DescribeEnvStatistics",
"tcb:DescribeLowCodeEnvQuotaUsage",
"tcb:CheckFeaturePermission",
"tcb:DescribeCommonBillingResources",
"tcb:DescribeCommonBillingPackages",
"tcb:DescribeExtraPackages",
"tcb:DescribeAgentList",
"tcb:DescribeTenant",
"tcb:GetCliTokenList",
"tcb:CreateCliToken",
"tcb:GetTemplateAPIsList",
"tcb:GetApisGroupAndList",
"tcb:GetUserKeyList",
"tcb:DescribeEnvBacklogs",
"tcb:DescribeEnvRestriction",
"tcb:DescribeUserPromotionalActivity",
"tcb:DescribeFeaturePermissions",
"tcb:RefreshAuthDomain",
"tcb:DescribeActivityInfo",
"tcb:DescribeTcbAccountInfo",
"tcb:DescribeAIModels",
"tcb:DescribeOperationAppTemplates",
"tcb:DescribeSolutionList",
"tcb:DescribeCloudBaseRunBaseImages",
"tcb:DescribeBuildServiceList",
"tcb:DeleteTable",
"tcb:CreateTable",
"tcb:DescribeTable",
"tcb:DescribeTables",
"tcb:ListTables",
"tcb:RunCommands",
"tcb:UpdateTable",
"tcb:UpdateItem",
"tcb:QueryRecords",
"tcb:PutItem",
"tcb:ModifyNameSpace",
"tcb:DeleteItem",
"tcb:CountRecords",
"tcb:DescribeRestoreTime",
"tcb:RestoreTCBTables",
"tcb:DescribeRestoreTask",
"tcb:DescribeRestoreTables",
"tcb:CreateFunction",
"tcb:UpdateFunctionCode",
"tcb:UpdateFunctionIncrementalCode",
"tcb:GetFunctionLogsStatus",
"tcb:GetFunctionLogDetail",
"tcb:GetFunctionLogs",
"ssl:DescribeCertificate",
"ssl:DescribeCertificateDetail",
"ssl:DescribeCertificates",
"cdn:PurgeUrlsCache",
"tcr:DescribeInstances",
"vpc:DescribeSubnets",
"vpc:DescribeVpcLimits",
"vpc:DescribeRouteTable",
"lowcode:DescribePackageLicenseInfo",
"tcb:CheckOnceOwnedEnvironment",
"tcb:DescribeCloudBaseProjectLatestVersionList",
"tcb:DescribeEnvDiscounts",
"tcb:DescribeCreditsPackageUsageDetail",
"tcb:DescribeICPResourcesInfo"
],
"effect": "allow",
"resource": ["*"]
},
{
"action": ["tcb:*"],
"effect": "allow",
"resource": ["qcs::tcb:${region}:uin/${uin}:env/${envId}"]
},
{
"action": ["tcbr:*"],
"effect": "allow",
"resource": ["qcs::tcbr:${region}:uin/${uin}:env/${envId}"]
},
{
"action": ["lowcode:*"],
"effect": "allow",
"resource": ["qcs::lowcode::uin/${uin}:env/${envId}"]
},
{
"action": ["scf:*"],
"effect": "allow",
"resource": [
"qcs::scf:${region}:uin/${uin}:namespace/${envId}",
"qcs::scf:${region}:uin/${uin}:namespace/${envId}/function/*",
"qcs::scf:${region}:uin/${uin}:namespace/${envId}/layer/*",
"qcs::cls:${region}:uin/${uin}:logset/${logsetId}",
"qcs::cls:${region}:uin/${uin}:topic/${topicId}"
]
},
{
"action": ["cls:*"],
"effect": "allow",
"resource": [
"qcs::cls:${region}:uin/${uin}:logset/${logsetId}",
"qcs::cls:${region}:uin/${uin}:topic/${topicId}"
]
},
{
"action": ["cos:*"],
"effect": "allow",
"resource": [
"qcs::cos:${region}:uid/${appId}:${cosBucketId}/*",
"qcs::cos:${region}:uid/${appId}:${staticBucketId}/*"
]
}
],
"version": "2.0"
}

占位符说明

占位符含义获取方式
${region}环境所在地域DescribeEnvs 返回的 EnvList[0].Region
${uin}主账号 UIN使用主账号密钥调用 GetUserAppId 返回的 Uin
${appId}主账号 AppIdDescribeEnvs 返回的 EnvList[0].AppId,或从存储桶名称末段提取
${envId}云开发环境 IDDescribeEnvs 返回的 EnvList[0].EnvId
${topicId}CLS 日志主题 IDDescribeEnvs 返回的 EnvList[0].LogServices[0].TopicId
${logsetId}CLS 日志集 IDDescribeEnvs 返回的 EnvList[0].LogServices[0].LogsetId
${cosBucketId}云存储桶名称DescribeEnvs 返回的 EnvList[0].Storages[0].Bucket
${staticBucketId}静态托管存储桶名称DescribeEnvs 返回的 EnvList[0].StaticStorages[0].Bucket
点击查看 Node.js 自动生成策略代码示例
// 安装依赖:npm install tencentcloud-sdk-nodejs
// 使用说明:
// 1. 将上方「策略模板」章节的 JSON 内容保存为 policy-template.json
// 2. 设置环境变量:TENCENTCLOUD_SECRETID, TENCENTCLOUD_SECRETKEY, CLOUDBASE_ENV_ID
// 3. 运行:node script.js

const tencentcloud = require("tencentcloud-sdk-nodejs");
const fs = require("fs");
const path = require("path");

const TcbClient = tencentcloud.tcb.v20180608.Client;
const AccountClient = tencentcloud.account.v20190119.Client;

const POLICY_TEMPLATE = fs.readFileSync(
path.join(__dirname, "policy-template.json"),
"utf8"
);

const clientConfig = {
credential: {
secretId: process.env.TENCENTCLOUD_SECRETID,
secretKey: process.env.TENCENTCLOUD_SECRETKEY,
},
region: "ap-shanghai",
};

function getRequiredEnv(name) {
const value = process.env[name];
if (!value) {
throw new Error(`请先设置环境变量 ${name}`);
}
return value;
}

async function generatePolicy() {
const accountClient = new AccountClient(clientConfig);
const tcbClient = new TcbClient(clientConfig);

// 使用主账号密钥执行脚本时,Uin 即策略里要填写的主账号 UIN。
const { Uin } = await accountClient.GetUserAppId({});

const { EnvList } = await tcbClient.DescribeEnvs({
EnvId: getRequiredEnv("CLOUDBASE_ENV_ID"),
});
const env = EnvList[0];
if (!env) {
throw new Error("未查询到云开发环境,请检查 CLOUDBASE_ENV_ID");
}

const policyJson = POLICY_TEMPLATE
.replace(/\$\{region\}/g, env.Region)
.replace(/\$\{uin\}/g, Uin)
.replace(/\$\{appId\}/g, String(env.AppId))
.replace(/\$\{envId\}/g, env.EnvId)
.replace(/\$\{logsetId\}/g, env.LogServices?.[0]?.LogsetId || "")
.replace(/\$\{topicId\}/g, env.LogServices?.[0]?.TopicId || "")
.replace(/\$\{cosBucketId\}/g, env.Storages?.[0]?.Bucket || "")
.replace(/\$\{staticBucketId\}/g, env.StaticStorages?.[0]?.Bucket || "");

return JSON.parse(policyJson);
}

async function main() {
const policy = await generatePolicy();
console.log(JSON.stringify(policy, null, 2));

// 可选:直接创建 CAM 策略
// const camClient = new tencentcloud.cam.v20190119.Client(clientConfig);
// await camClient.CreatePolicy({
// PolicyName: `cloudbase-env-${process.env.CLOUDBASE_ENV_ID}`,
// PolicyDocument: JSON.stringify(policy),
// });
}

main().catch(console.error);

相关 API 参考

API用途文档
GetUserAppId获取主账号 UIN 和 AppId账号相关接口
DescribeEnvs查询云开发环境详情(地域、存储桶、日志主题等)云开发 API 概览
GetFederationTokenSTS 签发临时凭证(策略内联传入,无需创建子账号)STS 接口 GetFederationToken
CreatePolicy通过 API 创建 CAM 策略CAM 接口 CreatePolicy
AttachUserPolicy将策略关联到子账号CAM 接口 AttachUserPolicy

手动配置策略

如果不使用自动生成工具,也可以手动在 CAM 控制台配置:

  1. 登录 CAM 控制台 → 策略 → 新建自定义策略
  2. 选择「按策略语法创建」→ 空白模板
  3. 将上方策略模板中的占位符替换为实际值后粘贴
  4. 创建策略并关联到目标子账号

登录控制台

子账号模式的独特优势:员工可以直接用腾讯云子账号登录云开发控制台,管理自己的云开发环境——查看数据库、调试云函数、检查存储等。权限策略会自动限制子账号只能看到和操作自己的环境。


配置 MCP 和 Skill

子账号模式下支持两种 MCP 连接方式,配置完成后 MCP 和 Skill 即可使用:

员工无需手动配置任何密钥。MCP 启动后自动发起设备码授权,在浏览器中完成登录。登录后能访问的环境由 CAM 权限策略控制——子账号只能看到策略允许的环境。

Client

配置你的 AI 工具以连接 CloudBase 能力 支持本地与托管两种连接方式,详见 连接方式

步骤 1:安装 / 配置 CloudBase

使用项目模板(推荐) - 模板已内置 MCP 配置和 AI 规则查看模板

一键安装:

Add to Cursor

或手动配置:

将以下配置添加到项目目录下的 .cursor/mcp.json:

json
1{
2 "mcpServers": {
3 "cloudbase": {
4 "command": "npx",
5 "args": ["@cloudbase/cloudbase-mcp@latest"],
6 "env": {
7 "INTEGRATION_IDE": "Cursor"
8 }
9 }
10 }
11}
需要帮助?查看 Cursor 文档

步骤 2:和 AI 对话

在 AI 对话中依次输入以下内容:

prompt
安装 CloudBase Skills:命令 npx skills add tencentcloudbase/cloudbase-skills -y
使用 CloudBase Skills: 帮我设计一个现代化的用户界面,用于 CloudBase 应用

成本估算

项目单价数量小计
管理环境(云开发个人版)¥19.9/月1¥19.9
员工环境(云开发个人版,含 OpenClaw 服务器)¥19.9/月N¥19.9 × N

示例

  • 10 名员工:¥19.9 × (1 + 10) = ¥439/月
  • 50 名员工:¥19.9 × (1 + 50) = ¥2,035/月

各方职责

角色职责
企业内部系统员工身份认证、为员工创建 CAM 子账号和云开发环境、创建轻量服务器并通过 TAT 安装云开发 Skill/MCP、配置 CAM 权限策略
OpenClaw作为员工操作入口,提供 AI 助手能力,通过云开发 Skill/MCP 操作云资源
腾讯云 CAM提供子账号创建、API 密钥生成、权限策略管理等能力
腾讯云云开发提供环境创建、数据库、云函数、存储等云资源能力

验证隔离效果

配置完成后,验证隔离是否生效:

  1. 使用子账号密钥调用 DescribeEnvs,确认只能看到自己的环境
  2. 尝试访问其他环境的资源,应返回权限不足错误
  3. 在 MCP 中操作云资源,确认只能操作自己环境内的资源