腾讯云子账号模式
适用场景
给员工提供隔离的 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} | 主账号 AppId | DescribeEnvs 返回的 EnvList[0].AppId |