按照本指南创建 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 资源名称。要配置非人类身份主体,请参阅服务账户。请按照模型、工具与数据控制和速率限制与支出中的说明,为项目添加护栏。