首页
/ Serverless Framework Dashboard:Org 与成员模型详解,及其在 CLI 认证链路中的实现

Serverless Framework Dashboard:Org 与成员模型详解,及其在 CLI 认证链路中的实现

2026-09-05 23:31:01作者:滑思眉Philip

在 Serverless Framework V4 中,Org(组织)是 Dashboard 的核心租户单元:它决定了你使用哪一个 Access Key 或 License Key、部署记录归属到哪里、以及计费与用量数据如何归集。本文基于官方文档中的 Org 与成员概念(concepts.md),结合仓库中认证、配置存储与计费模块的源码实现,讲清楚 Org 的创建、角色分工、命名约束,以及 CLI 是如何在登录、部署、对账等环节自动解析出“当前 Org”的——读完后你能理解 org 字段的完整解析优先级,并能在多组织、多密钥场景下正确配置自己的项目。

什么是 Org:Dashboard 的租户单元

按官方文档的定义,Org 是 Serverless Framework Dashboard 中一个唯一的租户(tenant)

  • 当你注册 Serverless Framework Dashboard 账号时,系统会为你生成一个默认的 Org 名称,之后可以自行修改;
  • 一个用户可以创建任意数量的 Org;
  • 成员可以被加入某个 Org,而同一个成员可以同时属于多个 Org

这一“一人多组织”的设计不是抽象概念,而是直接体现在 CLI 的实现里。从 认证入口 的源码结构看,用户登录后会调用 sdk.orgs.list({ userName }) 拉取该用户所属的全部 Org 列表;如果列表为空,CLI 会直接抛出错误提示用户去 Dashboard 创建 Org:

// packages/sf-core/src/lib/auth/index.js(节选)
const orgs = await sdk.orgs.list({ userName: loginData.username })
if (!orgs.length || orgs.length === 0) {
  throw new Error(
    'You are not a member of any Serverless Framework Orgs. Please login to the Serverless Dashboard to create an Org, ...'
  )
}

也就是说,“成员属于多个 Org”在客户端被落实为:登录后先枚举所有 Org,再从中选定一个作为本次会话的目标 Org。

成员与角色:Owner 与 Contributor

文档说明 Dashboard 目前支持两种跨整个 Org 共享的基础角色:

角色 权限 约束
Owner 账号所有者,可以添加其他贡献者(Contributor),可以访问 Org Settings 每个账号只能有一个 Owner
Contributor 可以使用 Serverless Framework Dashboard 的全部功能 不能添加其他用户,也不能直接访问 Org Settings

这个“Owner 唯一”的规则与 CLI 侧的默认 Org 选择策略相互呼应。在 auth/index.js 中,当本地没有显式指定目标 Org、也没有保存过默认 Org 时,CLI 会按如下规则自动选择默认 Org:

  1. 优先筛选用户在其中拥有 role === 'owner' 的 Org;
  2. 如果没有任何 Owner 身份,则回退为全部 Org;
  3. 在候选 Org 中选取 createdAt 最早(最老)的一个;
  4. 将结果写入本地 rc 文件的 defaultOrgName 字段,后续命令直接复用。
// packages/sf-core/src/lib/auth/index.js(节选)
let reducedOrgs = orgs.filter((org) => org.role === 'owner')
// If there are no orgs where the role is owner, use all orgs
if (!reducedOrgs.length) {
  reducedOrgs = orgs
}
// Find the org that with the oldest createdAt date
const defaultOrg = reducedOrgs.reduce((prev, current) => {
  return prev.createdAt < current.createdAt ? prev : current
})

这里可以印证一个事实:Org 的成员关系确实携带角色(role)信息,并且 Owner 身份在自动选择逻辑中享有最高优先级——这符合“Owner 是账号唯一拥有者”的文档定义。

修改 Org 名称:全局唯一约束

文档指出:Org 名称可以在 Dashboard 的 Org Settings 区域修改,但 Org 名称需要在整个 Serverless 平台范围内全局唯一,因此你期望的名称可能已被占用。

这个“全局唯一”约束在多个实现细节中留下了痕迹:

  • Dashboard 路由依赖 Org 名称Observability 集成模块 构造前端地址时直接使用 ${dashboardFrontend}/${context.org.orgName}/settings 的形式——Org 名称直接作为 URL 路径段,如果允许重名,这类路由就无法唯一寻址;
  • AWS Provider 集成携带 OrgUid:在 onboarding 流程 中,AWS Provider 的 CloudFormation 模板 URL 携带了 param_OrgUid=${orgId} 参数,说明平台侧用 orgId 做权威标识、orgName 做人类可读标识,两者成对出现。

对使用者而言,修改 Org 名称前需要注意:如果 CI/CD 环境中有通过 SERVERLESS_ORG_NAME 环境变量或配置文件 org 字段硬编码了旧名称的引用,改名后需要同步更新,否则 CLI 会因“密钥与目标 Org 不匹配”而报错。

CLI 如何确定“当前 Org”:解析优先级与本地存储

文档“Using Serverless Dashboard Orgs”一节说明:如果你已有一个现有 Org,登录 Dashboard 后会自动开始使用该 Org;成为某 Org 的成员后,你的账号会自动与该 Org 关联。落到 CLI 层面,这个“自动选择”有一套明确的优先级链。

org 的解析优先级

auth/index.js 的 authenticate() 方法 定义了目标 Org 名称的取值顺序:

orgName:
  options?.org ||                    // 1. CLI 参数 --org
  serviceConfigFile?.org ||          // 2. serverless.yml 中的 org 字段
  process.env.SERVERLESS_ORG_NAME || // 3. 环境变量
  composeOrgName ||                  // 4. Compose 父文件中的 org
  null                               // 5. 都无,则走默认 Org 选择策略

即:命令行参数 > 服务配置文件 > 环境变量 > Compose 配置 > 本地默认 Org。这与文档“登录后自动使用现有 Org”的描述一致——当你什么都不配置时,CLI 使用 rc 文件里记录的默认 Org(即上文 Owner 优先 + 最老 Org 策略选出的那个)。

.serverlessrc 中的 Org 数据结构

所有 Org 相关的凭据都持久化在用户的 ~/.serverlessrc 文件中。rc 工具模块 定义了该文件的默认结构:

{
  "userId": null,
  "frameworkId": "...",
  "users": {},
  "accessKeys": {
    "orgs": {},
    "defaultOrgName": null
  }
}

其中两个字段与 Org 模型直接对应:

  • accessKeys.orgs:一个 Org 名称 → License Key 的映射,支持同时保存多个 Org 的 License Key(对应“一个用户可属于多个 Org”);
  • accessKeys.defaultOrgName:默认 Org 名称。

当存在多个 Org 的 License Key 且未指定目标时,认证流程 的行为是:若只有一个 Org 则直接选中并设为默认;若有多个 Org,交互环境下提示用户选择,非交互环境(如 CI)下则直接报错,要求你在 serverless.yml 中显式提供 org 或在 rc 文件中设置 defaultOrgName——这是多 Org 使用者在 CI 中必须知道的前提。

另外,rc 文件的读取逻辑(getRcConfig)会合并本地 ./.serverlessrc 与全局 ~/.serverlessrc~/.config/.serverlessrc),本地配置覆盖全局配置,允许在特定项目目录使用独立的 Org 配置。

Org 与两类凭据:Access Key 与 License Key

文档中的 Org 概念建立在“账号—成员—Org”三层结构上;而 CLI 实际使用的是绑定到具体凭据的 Org 身份。V4 支持两类凭据,二者的 Org 语义不同:

1. Access Key V1(用户级,Dashboard 登录获得)

  • 登录成功后,CLI 会为每个目标 Org 单独创建一个 Access Key 并存入 rc 文件(getNewAccessKeyV1AndSave),键名格式类似 serverless_framework_MMDDYYYY
  • 每次使用时都会校验密钥所属 Org 与目标 Org 是否一致,不一致则报错:“The provided Access Key is not for the Org ..."(校验逻辑)。这意味着一个 Access Key 只能服务于它所属的那个 Org,跨 Org 使用时必须切换凭据;
  • 只有 Access Key 用户才能使用 Dashboard 功能(Observability、State 等)。如果服务配置了 app 属性却使用了 License Key,CLI 会直接报错,要求移除 app 及相关 Dashboard 功能(相关分支)。

2. License Key V2(Org 级,用于不使用 Dashboard 的团队)

  • License Key 按 Org 维度签发,可以按需创建多把分发给不同团队(详见 license-keys.md);
  • 使用 License Key 会禁用 Dashboard 访问,除校验密钥与遥测外不再产生对 Dashboard 的远程请求;
  • License Key 同样可以在 serverless.yml 中通过 licenseKey 字段(支持 ${ssm:...} 等变量解析器)或 SERVERLESS_LICENSE_KEY 环境变量提供,也可以放在 AWS SSM 的 /serverless-framework/license-key 参数中由 CLI 自动读取(SSM 回退逻辑)。

两类凭据的 Org 解析共用同一套优先级链(见上一节),因此“属于多个 Org 的成员”在本地同时持有多个 Org 的凭据时,必须通过 org 字段、--org 参数或环境变量明确目标。

Org 在计费与用量对账中的作用

Org 不只是一个身份容器,也是计费与用量数据的归属单位。从 usage 模块reconcile 模块 的源码结构看:

  • 用量与账单 API 的路径形如 /api/billing/orgs/{orgId},即以 Org ID 为主键查询计费信息;
  • 对账(sf reconcile)时,orgId 优先取 serverless.yml 中声明的值,若不可用则回退到默认 Org 的 ID(源码注释原话:“The orgId is from the serverless.yml file if not available, we fallback to the default orgId”);
  • 对账输出会明确展示“正在为 Org 名 在 AWS 账户 账号 ID 中对账 N 个实例”,即 Org × AWS 账户 构成用量归集的两个维度。

这解释了为什么多 Org 团队要谨慎管理 org 字段:部署时选错了 Org,用量实例就会被归集到错误的组织账目下。

首次部署时的 Org 落盘行为

值得一提的是,当 CLI 完成认证并确认目标 Org 后,onboarding 流程会把 org 字段自动写入服务配置文件顶部ensureOrgInConfigFile),并根据当前使用的凭据类型写入不同的注释:

# "org" ensures this Service is used with the correct Serverless Framework Access Key.
org: my-org-name
service: my-service

如果文件里已经存在 org: 行则不会重复写入。这个行为让“配置文件中的 org 字段”成为 Org 解析优先级中的第二顺位来源,也是团队在 CI 中锁定目标 Org 的标准做法。对于使用 License Key 的场景,注释会替换为 "ensures this Service is used with the correct Serverless Framework License Key"。

实践要点小结

  1. 一个账号可以有多个 Org,一个成员可以属于多个 Org;本地通过 ~/.serverlessrcaccessKeys.orgsdefaultOrgName 管理多 Org 凭据与默认选择。
  2. Owner 每账号唯一;Contributor 可用全部功能但不能加人、不能进 Org Settings。CLI 默认 Org 自动选择时 Owner 身份优先,其次按 Org 创建时间取最老者。
  3. Org 名称全局唯一,且直接出现在 Dashboard 的 URL 路径与 AWS Provider 集成参数中;改名后需同步更新 CI 中的 SERVERLESS_ORG_NAME 与配置文件中硬编码的 org 值。
  4. Org 解析优先级--org > serverless.yml 的 org > SERVERLESS_ORG_NAME > Compose 的 org > 本地默认 Org;非交互环境多 Org 且未指定目标时必须显式配置,否则 CLI 报错。
  5. Access Key V1 按 Org 单独签发,跨 Org 使用会触发“not for the Org”校验失败;License Key V2 按 Org 签发且禁用 Dashboard 功能,适合只需 CLI、不想依赖 Dashboard 的团队。
  6. 计费与对账以 orgId 为主键sf reconcile 优先读取 serverless.yml 中的 org 声明——部署时选错 Org 会导致用量归集错误。
登录后查看全文
热门项目推荐
相关项目推荐