OpenAI 在 2026 年 7 月 29 日发布了官方 Terraform Provider 1.0.0。它走的是 Administration API,把项目、成员、角色、服务账号、证书、速率限制这类控制面对象写进配置,而不是在控制台里点来点去。
Registry 里的 source 是 openai/openai,仓库是 openai/terraform-provider-openai。两个名字不要混。
本文资源行为对照过官方文档。权限字符串、角色 ID、模型 ID 上线前仍要以当前 API 文档和 Data Source 为准。
它能管什么,不能管什么
能管的是组织 / 项目控制面:项目与成员、邀请与用户组、服务账号、证书、模型与 Hosted Tool 权限、数据保留、支出提醒、项目级速率限制。Data Source 可以查出已有 ID,避免在配置里写死。
不能管的是模型推理。Admin API Key 不能拿去调 Chat Completions / Responses。反过来,普通项目 API Key 也调不了 Administration API。
1.0.0 升级时别只改版本号
稳定版 changelog 里有一条 breaking change:删掉了已弃用的聚合项目速率限制资源。现在用单项 openai_project_rate_limit,每个资源对应一个已有的 rate_limit_id。请求韧性和遥测也改过,但生产环境照旧:先 plan,看清范围再 apply。
前置条件和初始化
需要 Terraform CLI ≥ 1.0(import 块要 ≥ 1.5)、组织里能创建 Admin Key、以及加密的远程 State。
export OPENAI_ADMIN_KEY="<your-admin-api-key>"
# 可选:OPENAI_ORG_ID、OPENAI_PROJECT_ID
PowerShell:$env:OPENAI_ADMIN_KEY = "<your-admin-api-key>"
不要把管理密钥写进 .tf、变量默认值或 Git。CI 用 Secret 注入,并限制谁能读执行日志和 State。
terraform {
required_version = ">= 1.0"
required_providers {
openai = {
source = "openai/openai"
version = "~> 1.0"
}
}
}
provider "openai" {
# 默认读 OPENAI_ADMIN_KEY
}
terraform init 之后把 .terraform.lock.hcl 一并提交。
项目、成员、邀请
最小项目只要名字:
resource "openai_project" "production" {
name = "production-api"
}
output "production_project_id" {
value = openai_project.production.project_id
}
geography 是可选项,不要为了抄示例去改生产地域。先 terraform fmt、validate、plan -out=tfplan,确认计划后再 apply。
把已有组织用户加进项目:
resource "openai_project_user" "operator" {
project_id = openai_project.production.project_id
user_id = var.operator_user_id
role = "member"
}
内置项目角色也可用 openai_project_user_role 指定 role_id。更稳的是用 openai_project_roles Data Source 动态发现,少写死 ID。自定义角色要 project_id、role_name、permissions,权限字符串必须来自实际可用集合。
尚未入组的人用 openai_invite,可以顺带声明项目成员身份。对方接受后重新 plan,看远端状态和配置对不对得上。
服务账号不会吐出 API Key
resource "openai_project_service_account" "deploy" {
project_id = openai_project.production.project_id
name = "production-deploy"
}
官方文档写得很直:这个资源设了 create_service_account_only=true,只建账号,不分配角色,也不创建 API Key。角色用别的 Terraform 资源;Key 走公开 API、在 Terraform 外面管。模块 output 里不要假设会出现能直接用的密钥。
证书、模型权限、速率限制
组织证书可以从 PEM 读入。certificate 标了 sensitive,不等于不会进 State。远程 State 要加密,轮换时先看 plan 是不是 replace,新旧证书有效期留重叠。
模型权限用允许列表时,模型 ID 会随产品变。合并前核对当前可用模型,删旧许可前确认应用已经迁完。不要把某次文档里的示例模型名当成永远有效。
openai_project_rate_limit 管的是已有限制对象,必须带 project_id 和 rate_limit_id:
resource "openai_project_rate_limit" "primary_model" {
project_id = openai_project.production.project_id
rate_limit_id = "rate_limit_123"
max_requests_per_1_minute = 500
max_tokens_per_1_minute = 200000
}
还可以管每日请求、Batch 每日输入 token、每分钟图像数和音频 MB。Terraform 只能写 API 接受的值,配再大的数字也绕不过平台配额。这就是 1.0 不能「新建一条限制对象」的原因:资源是 reconcile 已有 ID,不是从零创建配额。
先 import,再用 plan 抓漂移
控制台里已经有的项目,不要再 apply 建一份。Terraform 1.5+ 用 import 块,ID 格式因资源而异(单 ID、project_id/resource_id、或更长的复合 ID),以各资源文档的 Import 小节为准:
import {
to = openai_project.production
id = "proj_123"
}
import {
to = openai_project_service_account.deploy
id = "proj_123/service_account_123"
}
import {
to = openai_project_rate_limit.primary_model
id = "proj_123/rate_limit_123"
}
导入后 terraform plan。如果马上出现大片 update,说明本地配置没对齐远端,先改配置,不要直接覆盖生产。
CI 里可用 terraform plan -detailed-exitcode:
0:无变更1:命令失败2:有变更或漂移,需要人看
退出码 2 不要自动 apply。可能是紧急手工改、权限回收,也可能是该把合理变更写回代码。
State 和审查
Admin Key 按高权限凭据处理:本地只短期注入、CI 专用身份、远程 State 加密加锁、plan 与 apply 分开审批、定期轮换密钥。删除项目、成员、角色、证书前盯 plan 里的 destroy / replace。prevent_destroy 是保险,替代不了审查和恢复方案。
接入时真正值钱的不是一条 apply,而是三件事:Admin Key 用对地方、已有资源先 import、把 plan 当成权限和配额变更的审查入口。