infra/modules/openai/main.tf (106 lines of code) (raw):
resource "azurerm_cognitive_account" "openai" {
name = var.azopenai_name
kind = "OpenAI"
sku_name = "S0"
location = var.location
resource_group_name = var.resource_group_name
public_network_access_enabled = true
custom_subdomain_name = var.azopenai_name
dynamic "network_acls" { # Only set network rules if private endpoints are used, adding allowed IPs to access the service
for_each = var.use_private_endpoints ? [1] : []
content {
default_action = "Deny"
ip_rules = var.allowed_ips
}
}
}
# Deploy models into Azure OpenAI
resource "azurerm_cognitive_deployment" "embedding" {
name = "text-embedding-ada-002"
cognitive_account_id = azurerm_cognitive_account.openai.id
rai_policy_name = "Microsoft.Default"
model {
format = "OpenAI"
name = "text-embedding-ada-002"
version = "2"
}
sku {
name = "Standard"
capacity = 40
}
}
resource "azurerm_cognitive_deployment" "gpt_4" {
name = "gpt-4"
cognitive_account_id = azurerm_cognitive_account.openai.id
rai_policy_name = "Microsoft.Default"
model {
format = "OpenAI"
name = "gpt-4"
version = "1106-Preview"
}
sku {
name = "Standard"
capacity = 20
}
}
resource "azurerm_cognitive_deployment" "gpt4_vision" {
name = "gpt4-vision"
cognitive_account_id = azurerm_cognitive_account.openai.id
rai_policy_name = "Microsoft.Default"
model {
format = "OpenAI"
name = "gpt-4"
version = "vision-preview"
}
sku {
name = "Standard"
capacity = 10
}
}
resource "azurerm_cognitive_deployment" "gpt4o" {
name = "gpt4o"
cognitive_account_id = azurerm_cognitive_account.openai.id
rai_policy_name = "Microsoft.Default"
model {
format = "OpenAI"
name = "gpt-4o"
version = "2024-05-13"
}
sku {
name = "Standard"
capacity = 30
}
}
# Set role assignment for OpenAI
resource "azurerm_role_assignment" "openai_user" {
scope = azurerm_cognitive_account.openai.id
role_definition_name = "Cognitive Services OpenAI User"
principal_id = var.principal_id
}
# Private endpoint
resource "azurerm_private_dns_zone" "private_dns_zone_openai" {
count = var.use_private_endpoints ? 1 : 0
name = "privatelink.openai.azure.com"
resource_group_name = var.resource_group_name
}
resource "azurerm_private_endpoint" "pep_openai" {
count = var.use_private_endpoints ? 1 : 0
name = "pep-${var.azopenai_name}"
location = var.vnet_location
resource_group_name = var.resource_group_name
subnet_id = var.private_endpoints_subnet_id
private_service_connection {
name = "${var.azopenai_name}-privateserviceconnection"
private_connection_resource_id = azurerm_cognitive_account.openai.id
is_manual_connection = false
subresource_names = ["account"]
}
private_dns_zone_group {
name = "${var.azopenai_name}-privatelink"
private_dns_zone_ids = [azurerm_private_dns_zone.private_dns_zone_openai[0].id]
}
}
resource "azurerm_private_dns_zone_virtual_network_link" "private_dns_zone_link_openai" {
count = var.use_private_endpoints ? 1 : 0
name = var.azopenai_name
resource_group_name = var.resource_group_name
private_dns_zone_name = azurerm_private_dns_zone.private_dns_zone_openai[0].name
virtual_network_id = var.vnet_id
}