For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
主导航

使用 Terraform 管理项目与访问权限

创建项目并配置基于角色和群组的访问权限。

按照本指南创建 OpenAI 项目,并建立可复用的访问控制。您将通过项目角色定义身份主体可执行的操作,将身份主体归入组织群组,并将群组关联到项目。

完成主要工作流程后,您将获得一份可重复使用的配置,用于:

  • 为应用创建 OpenAI 项目。
  • 定义最小权限项目角色。
  • 为需要访问权限的身份主体创建组织群组。
  • 通过角色授予群组对项目的访问权限。
  • 将现有组织用户添加到群组。

开始之前

完成 Terraform 提供程序设置,并将管理 API 密钥导出为 OPENAI_ADMIN_KEY。您还需要一个现有组织用户的 ID,以及获准用于该应用的权限标识符。评估此工作流程时,请使用测试组织。

销毁 openai_project 会将项目归档,而非永久删除。已归档的项目无法恢复。

建立项目边界

为应用创建项目:

resource "openai_project" "application" {
  name = "example-application-development"
}

项目为应用的 API 使用、服务账户、速率限制、支出提醒和项目设置划定边界。Terraform 通过 openai_project.application.project_id 提供生成的 ID。项目级资源可以引用该值,因此 Terraform 会先创建项目,再创建这些资源。

这个分步示例使用具体名称。后面的完整示例会将其替换为变量,以便您在不同环境中复用配置。

定义项目权限

创建项目角色,并为其配置获准用于该应用的权限:

resource "openai_project_role" "application" {
  project_id  = openai_project.application.project_id
  role_name   = "Application API access"
  description = "Permissions approved for this application"
  permissions = ["api.webhooks.read"]
}

openai_project_role 资源定义身份主体在项目内可执行的操作。此示例授予读取 Webhook 配置的权限。请将 api.webhooks.read 替换为获准用于您应用的权限标识符,并在开始时仅授予应用所需的权限。

更改 permissions 会更新角色。应用更改前,请运行 terraform plan,审查每一项新增或移除的权限。

创建或复用群组

如果需要由 Terraform 管理群组的生命周期,请创建组织群组:

resource "openai_group" "application_access" {
  name = "example-application-development-access"
}

群组存在于组织级别,可在多个项目中复用。名称以 -access 结尾,表明加入该群组即可获得访问权限,而不仅仅是标识一个团队。

如果现有群组由其他系统管理,请改为读取该群组:

data "openai_group" "application_access" {
  group_id = "group_123"
}

数据源会读取群组,但不会让此配置负责管理群组的生命周期。您可以读取由 SCIM 管理的群组,但成员变更仍应在负责管理这些群组的身份系统中进行。

授予群组项目访问权限

将群组关联到项目内的自定义角色:

resource "openai_project_group_role" "application_access" {
  project_id = openai_project.application.project_id
  group_id   = openai_group.application_access.group_id
  role_id    = openai_project_role.application.role_id
}

此示例使用由 Terraform 管理的群组。如果您通过数据源复用了现有群组,请将 group_id 表达式替换为 data.openai_group.application_access.group_id

此角色分配关联了三个对象:

  • project_id 标识群组获得访问权限的项目。
  • group_id 标识获得访问权限的身份主体集合。
  • role_id 标识群组获得的权限。

群组成员会继承此项目中的自定义角色。仅添加角色或群组并不会授予访问权限;角色分配才是两者之间的关联。

添加用户和其他身份主体

使用 openai_group_user 将身份主体添加到由 Terraform 管理的组织群组:

resource "openai_group_user" "application_developer" {
  group_id = openai_group.application_access.group_id
  user_id  = "user_123"
}

user_id 可以标识现有组织用户或服务账户。要添加服务账户,请使用 openai_project_service_account.application.id 作为 user_id。有关基于群组的服务账户访问权限、身份验证和凭据生命周期要求,请参阅服务账户

如果不适合使用基于群组的访问方式,请直接分配角色:

resource "openai_project_user_role" "application_developer" {
  project_id = openai_project.application.project_id
  user_id    = "user_123"
  role_id    = openai_project_role.application.role_id
}

对于组织范围的权限,请创建组织角色,并直接分配该角色或通过群组分配:

variable "organization_role_permissions" {
  type = list(string)
}

resource "openai_role" "platform_operator" {
  role_name   = "Platform operator"
  description = "Organization permissions for the platform team"
  permissions = var.organization_role_permissions
}

resource "openai_user_role" "platform_operator" {
  user_id = "user_123"
  role_id = openai_role.platform_operator.role_id
}

organization_role_permissions 设置为已获批准的组织级权限标识符。请将组织权限与项目权限分开管理,确保每项角色分配的范围都限制在必要的最小范围内。

检查当前角色分配

更改访问权限前,请读取已分配给身份主体的组织角色和项目角色:

data "openai_user_roles" "current" {
  user_id = "user_123"
}

data "openai_project_user_roles" "current" {
  project_id = openai_project.application.project_id
  user_id    = "user_123"
}

output "organization_roles" {
  value = data.openai_user_roles.current.roles
}

output "project_roles" {
  value = data.openai_project_user_roles.current.roles
}

数据源会报告当前角色分配,但不会让 Terraform 负责管理这些分配。

移除角色分配

如果 Terraform 已在管理某项角色分配,移除其资源块后,下次计划就会提出删除远程角色分配。请审查计划,并验证所需的访问权限仍可通过其他途径获得。

对于预先存在的角色分配,请先声明匹配的资源,并使用文档中说明的复合 ID 将其导入。确认首次计划不包含任何更改后,再将其从配置中移除并应用删除操作。

Terraform 只能移除其状态中记录的角色分配。要移除现有的默认角色分配,请先将其导入相应的 Terraform 资源。然后从配置中移除该资源,并应用由此生成的销毁计划。如果您的组织不允许这种先导入再销毁的工作流程,请通过获准的控制台或管理 API 流程移除该角色分配。

有关导入格式以及安全接管资源的步骤,请参阅导入与状态协调

运行完整示例

分步示例使用具体值,以清晰展示各项关联。完整配置将重复出现的环境特定值替换为变量,让您无需修改资源定义即可复用配置。

将以下配置保存为 main.tf

terraform {
  required_version = ">= 1.0"

  required_providers {
    openai = {
      source  = "openai/openai"
      version = ">= 1.0.0"
    }
  }
}

provider "openai" {}

variable "project_name" {
  type = string
}

variable "project_role_permissions" {
  type = list(string)
}

variable "user_id" {
  type = string
}

resource "openai_project" "application" {
  name = var.project_name
}

resource "openai_project_role" "application" {
  project_id  = openai_project.application.project_id
  role_name   = "Application API access"
  description = "Permissions approved for this application"
  permissions = var.project_role_permissions
}

resource "openai_group" "application_access" {
  name = "${var.project_name}-access"
}

resource "openai_project_group_role" "application_access" {
  project_id = openai_project.application.project_id
  group_id   = openai_group.application_access.group_id
  role_id    = openai_project_role.application.role_id
}

resource "openai_group_user" "application_developer" {
  group_id = openai_group.application_access.group_id
  user_id  = var.user_id
}

output "project_id" {
  value = openai_project.application.project_id
}

output "group_id" {
  value = openai_group.application_access.group_id
}

output "project_role_id" {
  value = openai_project_role.application.role_id
}

创建 terraform.tfvars,并填入唯一的项目名称、现有组织用户的 ID 和已获批准的权限:

project_name = "example-application-development"
user_id      = "user_123"

project_role_permissions = [
  "api.webhooks.read",
]

初始化 Terraform,然后审查并应用已保存的计划:

terraform init
terraform fmt
terraform validate
terraform plan -out=tfplan
terraform show tfplan
terraform apply tfplan

首次计划应包含五个待添加的资源。应用计划后,用户会通过群组继承自定义项目角色,terraform output 会输出项目、群组和项目角色的 ID。再次运行 terraform plan,确认配置不会产生进一步更改。

要添加更多人类用户,请重复使用群组成员配置方式,并为每位用户指定唯一的 Terraform 资源名称。要配置非人类身份主体,请参阅服务账户。请按照模型、工具与数据控制速率限制与支出中的说明,为项目添加护栏。