このガイドでは、既存のプロジェクトのレート制限を管理し、月間支出アラートを作成します。レート制限は、プロジェクトの一定時間あたりのモデル使用量を制限します。支出アラートは、月間使用量がしきい値に達するとチームに通知しますが、API リクエストを停止したり、支出の上限を強制したりするものではありません。
主なワークフローを完了すると、次の操作を繰り返し実行できる構成が完成します。
- 既存のプロジェクトで利用可能なレート制限レコードを読み取ります。
- 1 つのモデルのリクエスト数とトークン数の上限を管理します。
- プロジェクトの月間支出がしきい値に達すると、メールでアラートを送信します。
事前準備
Terraform プロバイダーのセットアップを完了し、管理 API キーを OPENAI_ADMIN_KEY としてエクスポートしてください。次のものも必要です。
- 既存のプロジェクトの ID
- 支出アラートの送信先メールアドレス(1 件以上)
ワークフローを評価する際は、テスト用のプロジェクトを使用してください。次のセクションでは、テキストモデルのレート制限レコードを特定します。プロジェクトで利用可能なレート制限レコードは OpenAI が作成します。Terraform は新しいレコードを作成せず、既存のレコードを更新します。
プロジェクトのレート制限の確認
プロジェクトで利用可能なレート制限レコードを読み取ります。
data "openai_project_rate_limits" "current" {
project_id = "proj_123"
}
output "project_rate_limits" {
value = data.openai_project_rate_limits.current.rate_limits
}
このデータソースは、読み取り専用のリクエストを送信します。
project_idで、確認するプロジェクトを選択します。rate_limitsには、利用可能なモデルのレート制限ごとに 1 つのオブジェクトが含まれます。各オブジェクトには、id、model、適用される上限値が含まれます。- この出力により、
terraform planまたはterraform applyの実行後にレコードを確認できます。
model が制御対象のモデルと一致するレコードを使用してください。そのレコードの id をコピーします。次のリソースでは、この値を rate_limit_id として使用します。プロバイダーや API の変更によって別のレコードが選択されないよう、ID は明示的な入力値として保持してください。
既存のレート制限の管理
選択したテキストモデルのレコードについて、リクエスト数とトークン数の上限を管理します。
resource "openai_project_rate_limit" "application" {
project_id = "proj_123"
rate_limit_id = "rl-gpt-3.5-turbo"
max_requests_per_1_minute = 500
max_tokens_per_1_minute = 200000
}
各引数の役割は次のとおりです。
project_idは、レート制限を変更するプロジェクトを識別します。rate_limit_idは、既存のモデルのレート制限レコードを識別します。モデル ID ではありません。max_requests_per_1_minuteは、プロジェクトがそのモデルに送信できる 1 分あたりのリクエスト数を制限します。max_tokens_per_1_minuteは、プロジェクトがそのモデルで処理できる 1 分あたりのトークン数を制限します。
選択したレコードに適用されるフィールドのみを設定してください。他の種類のレコードでは、1 分あたりの画像数、1 分あたりの音声のメガバイト数、1 日あたりのリクエスト数、1 日あたりのバッチ入力トークン数の上限が提供される場合があります。設定値は、組織とプロジェクトで利用可能な上限を超えることはできません。
初回の Terraform プランでは、このリソースが追加として表示されますが、プロバイダーは既存のレート制限レコードを更新し、その後 Terraform の状態に保存します。構成内の上限値を変更すると、再度更新が送信されます。
構成から openai_project_rate_limit を削除すると、
レコードは Terraform の状態から削除されますが、リモートのレート制限はリセットも削除もされません。
別のワークフローでレコードを管理する場合は、
リソースを削除する前にリモートの値を必要な値に設定してください。
プロジェクトの支出アラートの設定
プロジェクトの月間支出アラートを作成します。
resource "openai_project_spend_alert" "monthly" {
project_id = "proj_123"
threshold_amount = 20000
currency = "USD"
interval = "month"
notification_channel_type = "email"
notification_channel_recipients = ["platform-alerts@example.com"]
notification_channel_subject_prefix = "OpenAI project spend"
}
アラート定義では、支出に関する条件と通知チャネルを組み合わせます。
project_idは、アラートの対象を 1 つのプロジェクトの支出に限定します。threshold_amountは、セント単位の月間しきい値です。20000は 200 米ドルを表します。currencyはUSDである必要があります。intervalはmonthである必要があります。notification_channel_typeはemailである必要があります。notification_channel_recipientsには、少なくとも 1 件の送信先を含める必要があります。notification_channel_subject_prefixは、アラートメールの件名に追加する任意のテキストです。
Terraform はアラートを作成し、生成された alert_id を保存します。しきい値または通知フィールドを変更すると、アラートが更新されます。リソースを削除すると、リモートのアラートも削除されます。
支出アラートは通知であり、強制的な上限ではありません。各しきい値に対してインシデント対応や管理上の対応を定め、リクエスト量はレート制限で別途制御してください。
組織の支出アラートの設定
組織全体の支出をしきい値の対象にする場合は、組織のアラートを使用します。
resource "openai_organization_spend_alert" "monthly" {
threshold_amount = 100000
currency = "USD"
interval = "month"
notification_channel_type = "email"
notification_channel_recipients = ["platform-alerts@example.com"]
}
このリソースは、プロジェクトのアラートと同じしきい値の単位、期間、通貨、通知フィールドを使用します。組織全体の支出を測定するため、project_id は受け取りません。この例では、組織の月間支出が 1,000 米ドルに達した後にメールを送信します。
プロジェクトと組織のアラートは、まとめて管理できます。それぞれの範囲で対応を担当するチームが異なる場合は、しきい値と送信先を個別に設定してください。
完全なサンプルの実行
ここまでの個別の例では、具体的な値を使って各リソースを説明しました。完全な構成では、環境固有の値を変数に置き換え、プロジェクトのレート制限の確認、1 件のレート制限の管理、1 件のプロジェクト支出アラートを組み合わせます。
次の構成を main.tf として保存してください。
terraform {
required_version = ">= 1.0"
required_providers {
openai = {
source = "openai/openai"
version = ">= 1.0.0"
}
}
}
provider "openai" {}
variable "project_id" {
type = string
}
variable "rate_limit_id" {
type = string
description = "Existing rate-limit record for the text model to manage."
}
variable "max_requests_per_minute" {
type = number
}
variable "max_tokens_per_minute" {
type = number
}
variable "project_spend_threshold_cents" {
type = number
description = "Monthly project spend threshold in cents."
validation {
condition = var.project_spend_threshold_cents > 0
error_message = "The project spend threshold must be greater than zero."
}
}
variable "alert_recipients" {
type = list(string)
validation {
condition = length(var.alert_recipients) > 0
error_message = "Provide at least one spend-alert recipient."
}
}
data "openai_project_rate_limits" "current" {
project_id = var.project_id
}
resource "openai_project_rate_limit" "application" {
project_id = var.project_id
rate_limit_id = var.rate_limit_id
max_requests_per_1_minute = var.max_requests_per_minute
max_tokens_per_1_minute = var.max_tokens_per_minute
}
resource "openai_project_spend_alert" "monthly" {
project_id = var.project_id
threshold_amount = var.project_spend_threshold_cents
currency = "USD"
interval = "month"
notification_channel_type = "email"
notification_channel_recipients = var.alert_recipients
notification_channel_subject_prefix = "OpenAI project spend"
}
output "available_rate_limits" {
value = data.openai_project_rate_limits.current.rate_limits
}
output "managed_rate_limit_model" {
value = openai_project_rate_limit.application.model
}
output "project_spend_alert_id" {
value = openai_project_spend_alert.monthly.alert_id
}
既存のプロジェクト ID、テキストモデルについて確認したレート制限レコードの ID、承認済みの上限値、セント単位のしきい値、アラートの送信先を指定して、terraform.tfvars を作成してください。
project_id = "proj_123"
rate_limit_id = "rl-gpt-3.5-turbo"
max_requests_per_minute = 500
max_tokens_per_minute = 200000
project_spend_threshold_cents = 20000
alert_recipients = ["platform-alerts@example.com"]
リクエスト数とトークン数には、プロジェクトで現在利用可能な上限を超えない値を選んでください。プランの available_rate_limits 出力には、比較用に現在のレコードと値が表示されます。
Terraform を初期化し、保存したプランを確認して適用します。
terraform init
terraform fmt
terraform validate
terraform plan -out=tfplan
terraform show tfplan
terraform apply tfplan
初回のプランには、追加するリソースが 2 件含まれるはずです。Terraform はレート制限リソースを状態への追加として表示しますが、適用すると既存の OpenAI レート制限レコードが更新されます。もう 1 件の追加によって、プロジェクトの支出アラートが作成されます。適用後に terraform output を実行すると、利用可能なレート制限、管理対象のレコードに関連付けられたモデル、アラート ID が表示されます。
terraform plan を再度実行して、この構成による追加の変更がないことを確認してください。ドリフトが表示された場合は、次の更新を適用する前に、別の管理者や自動化によってレート制限または支出アラートが変更されていないか確認してください。