Terraform으로 비율 한도와 지출 관리하기
Terraform으로 비율 한도와 지출 관리하기 (Rate limits and spend with Terraform)
출처: 문서
이 가이드로 기존 프로젝트의 비율 한도(rate limit)를 관리하고 월간 지출 알림(spend alert)을 만들어요. 비율 한도는 시간에 따른 프로젝트의 모델 사용량을 제한해요. 지출 알림은 월간 사용량이 임계값에 도달하면 팀에 알리지만, API 요청을 중단하거나 지출 상한을 강제하지는 않아요.
메인 워크플로를 완료하면 다음과 같은 반복 가능한 구성을 갖게 돼요:
- 기존 프로젝트에서 사용 가능한 비율 한도 레코드를 읽어요.
- 한 모델의 요청 및 토큰 한도를 관리해요.
- 프로젝트의 월간 지출이 임계값에 도달하면 이메일 알림을 보내요.
시작하기 전에
Terraform 프로바이더 설정을 완료하고 Admin API 키를 OPENAI_ADMIN_KEY로 export해요. 다음도 필요해요:
- 기존 프로젝트의 ID.
- 지출 알림을 받을 이메일 주소 하나 이상.
워크플로를 평가할 때는 테스트 프로젝트를 사용해요. 다음 섹션에서 텍스트 모델의 비율 한도 레코드를 식별할 거예요. 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에는 사용 가능한 각 모델 비율 한도의 객체가 하나씩 포함되며, 각각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는 프로젝트가 해당 모델에 대해 매분 보낼 수 있는 요청 수를 제한해요.max_tokens_per_1_minute는 프로젝트가 해당 모델에 대해 매분 처리할 수 있는 토큰 수를 제한해요.
선택한 레코드에 적용되는 필드만 설정해요. 다른 레코드 유형은 분당 이미지, 분당 오디오 메가바이트, 일일 요청, 일일 Batch 입력 토큰 등에 대한 한도를 노출할 수 있어요. 구성된 값은 조직과 프로젝트에서 사용 가능한 한도를 초과할 수 없어요.
첫 번째 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 = ["[email protected]"]
notification_channel_subject_prefix = "OpenAI project spend"
}
알림 정의는 지출 조건과 알림 채널을 결합해요:
project_id는 알림을 한 프로젝트의 지출로 제한해요.threshold_amount는 센트 단위의 월간 임계값이에요.20000은 USD 200을 나타내요.currency는USD여야 해요.interval은month여야 해요.notification_channel_type은email이어야 해요.notification_channel_recipients는 수신자를 최소 한 명 포함해야 해요.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 = ["[email protected]"]
}
이 리소스는 프로젝트 알림과 동일한 임계값 단위, 간격, 통화, 알림 필드를 사용해요. project_id를 받지 않는 이유는 조직 전체의 지출을 측정하기 때문이에요. 이 예시는 월간 조직 지출이 USD 1,000에 도달한 후 이메일을 보내요.
프로젝트 알림과 조직 알림을 함께 관리할 수 있어요. 각 범위에서 다른 팀이 대응을 담당할 때는 서로 다른 임계값과 수신자를 사용해요.
완전한 예시 실행하기
집중된 예시들은 각 리소스를 설명하기 위해 구체적인 값을 사용해요. 완전한 구성은 환경별 값을 변수로 대체하고 프로젝트 비율 한도 발견, 관리되는 비율 한도 하나, 프로젝트 지출 알림 하나를 결합해요.
다음 구성을 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 = ["[email protected]"]
프로젝트에서 현재 사용 가능한 한도를 초과하지 않는 요청 및 토큰 값을 선택해요. 계획의 available_rate_limits 출력에 현재 레코드와 값이 비교용으로 표시돼요.
Terraform을 초기화한 다음 저장된 계획을 검토하고 적용해요:
terraform init
terraform fmt
terraform validate
terraform plan -out=tfplan
terraform show tfplan
terraform apply tfplan
첫 번째 계획에는 추가할 리소스 두 개가 포함되어야 해요. Terraform은 비율 한도 리소스를 상태에 대한 추가로 설명하지만, 적용하면 기존 OpenAI 비율 한도 레코드를 업데이트해요. 다른 추가는 프로젝트 지출 알림을 만들어요. Apply 후 terraform output이 사용 가능한 비율 한도, 관리되는 레코드와 연관된 모델, 알림 ID를 출력해요.
terraform plan을 다시 실행해서 구성이 더 이상 변경을 생성하지 않는지 확인해요. 드리프트가 표시되면 다른 업데이트를 적용하기 전에 다른 관리자나 자동화가 비율 한도나 지출 알림을 변경했는지 판단해요.