このガイドでは、OpenAI プロジェクトを作成し、再利用可能なアクセス制御を設定します。プロジェクトロールでアイデンティティが実行できる操作を定義し、組織のグループにアイデンティティをまとめ、そのグループをプロジェクトに関連付けます。
メインのワークフローを完了すると、次の操作を繰り返し実行できる構成が完成します。
- アプリケーション用の OpenAI プロジェクトの作成
- 最小権限のプロジェクトロールの定義
- アクセスを必要とするアイデンティティをまとめる組織グループの作成
- ロールを通じたグループへのプロジェクトアクセスの付与
- 組織の既存ユーザーのグループへの追加
事前準備
Terraform プロバイダーのセットアップを完了し、管理 API キーを OPENAI_ADMIN_KEY としてエクスポートしてください。組織の既存ユーザーの ID と、アプリケーション用に承認された権限の識別子も必要です。ワークフローを評価する際は、テスト用の組織を使用してください。
openai_project を破棄すると、プロジェクトは完全に削除されるのではなく、アーカイブされます。アーカイブしたプロジェクトは復元できません。
プロジェクトによる管理範囲の設定
アプリケーション用のプロジェクトを作成します。
resource "openai_project" "application" {
name = "example-application-development"
}
プロジェクトは、アプリケーションの API 使用量、サービスアカウント、レート制限、支出アラート、プロジェクト設定の管理範囲を区切ります。Terraform では、生成された ID を openai_project.application.project_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 に置き換えてください。
この割り当てにより、次の 3 つのオブジェクトが関連付けられます。
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 では、組織の既存ユーザーまたはサービスアカウントを指定できます。サービスアカウントを追加するには、user_id に openai_project_service_account.application.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
}
一意のプロジェクト名、組織の既存ユーザーの ID、承認された権限を指定して、terraform.tfvars を作成します。
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
最初のプランには、追加するリソースが 5 つ含まれているはずです。適用後、ユーザーはグループを通じてカスタムプロジェクトロールを継承し、terraform output でプロジェクト、グループ、プロジェクトロールの ID が出力されます。terraform plan を再度実行し、この構成によって追加の変更が発生しないことを確認してください。
人間のユーザーをさらに追加するには、ユーザーごとに一意の Terraform リソース名を指定して、同じグループメンバーシップの設定を繰り返します。人間以外のアイデンティティを設定するには、サービスアカウントを参照してください。プロジェクトにガードレールを追加するには、モデル、ツール、データの制御とレート制限と支出を参照してください。