infra/main.tf (274 lines of code) (raw):

data "azurerm_subscription" "current" {} data "azurerm_client_config" "current" {} data "http" "current_ip" { url = "http://ipv4.icanhazip.com" count = var.use_private_endpoints ? 1 : 0 } resource "random_id" "random" { byte_length = 8 } locals { allowed_ips = var.use_private_endpoints ? concat(var.allowed_ips, ["${chomp(data.http.current_ip[0].response_body)}"]) : var.allowed_ips sufix = var.use_random_suffix ? substr(lower(random_id.random.hex), 1, 5) : "" name_sufix = var.use_random_suffix ? "-${local.sufix}" : "" resource_group_name = "${var.resource_group_name}${local.name_sufix}" storage_account_name = "${var.storage_account_name}${local.sufix}" azopenai_name = "${var.azopenai_name}${local.name_sufix}" content_safety_name = "${var.content_safety_name}${local.name_sufix}" cognitive_services_name = "${var.cognitive_services_name}${local.name_sufix}" speech_name = "${var.speech_name}${local.name_sufix}" vision_name = "${var.vision_name}${local.name_sufix}" bing_name = "${var.bing_name}${local.name_sufix}" search_name = "${var.search_name}${local.name_sufix}" form_recognizer_name = "${var.form_recognizer_name}${local.name_sufix}" apim_name = "${var.apim_name}${local.name_sufix}" appi_name = "${var.appi_name}${local.name_sufix}" log_name = "${var.log_name}${local.name_sufix}" cae_name = "${var.cae_name}${local.name_sufix}" ca_chat_name = "${var.ca_chat_name}${local.name_sufix}" ca_prep_docs_name = "${var.ca_prep_docs_name}${local.name_sufix}" ca_aihub_name = "${var.ca_aihub_name}${local.name_sufix}" ai_services_name = "${var.ai_services_name}${local.name_sufix}" ai_foundry_name = "${var.ai_foundry_name}${local.name_sufix}" ai_foundry_project_name = "${var.ai_foundry_project_name}${local.name_sufix}" ai_foundry_kv_name = "${var.ai_foundry_kv_name}${local.name_sufix}" ai_foundry_st_name = "${var.ai_foundry_st_name}${local.sufix}" bing_account_name = "${var.bing_account_name}${local.name_sufix}" func_name = "plugin${local.sufix}" cv_name = "${var.cv_name}${local.name_sufix}" } resource "azurerm_resource_group" "rg" { name = local.resource_group_name location = var.location } module "vnet" { source = "./modules/vnet" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name virtual_network_name = var.virtual_network_name } module "nsg" { source = "./modules/nsg" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name nsg_apim_name = "nsg-apim" apim_subnet_id = module.vnet.apim_subnet_id nsg_cae_name = "nsg-cae" cae_subnet_id = module.vnet.cae_subnet_id nsg_pe_name = "nsg-pe" pe_subnet_id = module.vnet.pe_subnet_id } module "apim" { count = var.enable_apim ? 1 : 0 source = "./modules/apim" location = azurerm_resource_group.rg.location resource_group_id = azurerm_resource_group.rg.id resource_group_name = azurerm_resource_group.rg.name apim_name = local.apim_name apim_subnet_id = module.vnet.apim_subnet_id publisher_name = var.publisher_name publisher_email = var.publisher_email appi_resource_id = module.appi.appi_id appi_instrumentation_key = module.appi.appi_key openai_service_name = module.openai.openai_service_name openai_service_endpoint = module.openai.openai_endpoint tenant_id = data.azurerm_subscription.current.tenant_id use_private_endpoints = var.use_private_endpoints depends_on = [module.nsg] } module "mi" { source = "./modules/mi" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name managed_identity_name = var.managed_identity_name } resource "azurerm_role_assignment" "id_reader" { scope = azurerm_resource_group.rg.id role_definition_name = "Reader" principal_id = module.mi.principal_id } module "search" { source = "./modules/search" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name search_name = local.search_name principal_id = module.mi.principal_id allowed_ips = local.allowed_ips vnet_id = module.vnet.virtual_network_id private_endpoints_subnet_id = module.vnet.pe_subnet_id use_private_endpoints = var.use_private_endpoints } module "log" { source = "./modules/log" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name log_name = local.log_name } module "appi" { source = "./modules/appi" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name appi_name = local.appi_name log_id = module.log.log_id } module "st" { source = "./modules/st" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name storage_account_name = local.storage_account_name principal_id = module.mi.principal_id vnet_id = module.vnet.virtual_network_id private_endpoints_subnet_id = module.vnet.pe_subnet_id use_private_endpoints = var.use_private_endpoints allowed_ips = local.allowed_ips } module "openai" { source = "./modules/openai" location = var.location_azopenai resource_group_name = azurerm_resource_group.rg.name azopenai_name = local.azopenai_name principal_id = module.mi.principal_id allowed_ips = local.allowed_ips vnet_id = module.vnet.virtual_network_id vnet_location = azurerm_resource_group.rg.location private_endpoints_subnet_id = module.vnet.pe_subnet_id use_private_endpoints = var.use_private_endpoints } module "ai_foundry" { source = "./modules/ai-foundry" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name resource_group_id = azurerm_resource_group.rg.id ai_foundry_name = local.ai_foundry_name ai_services_name = local.ai_services_name ai_foundry_project_name = local.ai_foundry_project_name kv_name = local.ai_foundry_kv_name st_name = local.ai_foundry_st_name bing_account_name = local.bing_account_name subscription_id = data.azurerm_subscription.current.subscription_id tenant_id = data.azurerm_subscription.current.tenant_id current_principal_object_id = data.azurerm_client_config.current.object_id aihub_principal_id = module.mi.principal_id } module "cog" { source = "./modules/cog" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name resource_group_id = azurerm_resource_group.rg.id bing_name = local.bing_name cognitive_services_name = local.cognitive_services_name content_safety_name = local.content_safety_name form_recognizer_name = local.form_recognizer_name speech_name = local.speech_name vision_name = local.vision_name vision_location = var.location_azopenai content_safety_storage_resource_id = module.st.storage_account_id content_safety_location = var.location_content_safety allowed_ips = local.allowed_ips vnet_id = module.vnet.virtual_network_id private_endpoints_subnet_id = module.vnet.pe_subnet_id use_private_endpoints = var.use_private_endpoints } module "cae" { source = "./modules/cae" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name cae_name = local.cae_name cae_subnet_id = module.vnet.cae_subnet_id log_id = module.log.log_id appi_connection_string = module.appi.appi_connection_string } module "ca_chat" { source = "./modules/ca-chat" location = azurerm_resource_group.rg.location resource_group_id = azurerm_resource_group.rg.id ca_name = local.ca_chat_name cae_id = module.cae.cae_id cae_default_domain = module.cae.default_domain managed_identity_id = module.mi.mi_id chat_gpt_deployment = module.openai.gpt4_deployment_name chat_gpt_model = module.openai.gpt4_deployment_model_name embeddings_deployment = module.openai.embedding_deployment_name embeddings_model = module.openai.embedding_deployment_name storage_account_name = module.st.storage_account_name storage_container_name = module.st.storage_container_name search_service_name = module.search.search_service_name search_index_name = module.search.search_index_name openai_endpoint = var.enable_apim ? module.apim[0].gateway_url : module.openai.openai_endpoint tenant_id = data.azurerm_subscription.current.tenant_id managed_identity_client_id = module.mi.client_id enable_entra_id_authentication = var.enable_entra_id_authentication image_name = var.ca_chat_image } module "ca_prep_docs" { source = "./modules/ca-prep-docs" location = azurerm_resource_group.rg.location resource_group_id = azurerm_resource_group.rg.id ca_name = local.ca_prep_docs_name cae_id = module.cae.cae_id managed_identity_id = module.mi.mi_id storage_account_name = module.st.storage_account_name storage_account_key = module.st.key search_service_name = module.search.search_service_name tenant_id = data.azurerm_subscription.current.tenant_id managed_identity_client_id = module.mi.client_id openai_service_name = module.openai.openai_service_name resource_group_name = azurerm_resource_group.rg.name subscription_id = data.azurerm_subscription.current.subscription_id image_name = var.ca_prep_docs_image } module "ca_aihub" { source = "./modules/ca-aihub" location = azurerm_resource_group.rg.location resource_group_id = azurerm_resource_group.rg.id ca_name = local.ca_aihub_name cae_id = module.cae.cae_id cae_default_domain = module.cae.default_domain managed_identity_id = module.mi.mi_id chat_gpt4_deployment = module.openai.gpt4_deployment_name chat_gpt4_model = module.openai.gpt4_deployment_model_name chat_gpt4_vision_deployment = module.openai.gpt4_vision_deployment_name chat_gpt4_vision_model = module.openai.gpt4_vision_deployment_model_name chat_gpt4o_deployment = module.openai.gpt4o_deployment_name chat_gpt4o_model = module.openai.gpt4o_deployment_model_name embeddings_deployment = module.openai.embedding_deployment_name embeddings_model = module.openai.embedding_deployment_name storage_account_name = module.st.storage_account_name storage_account_key = module.st.key storage_container_name = module.st.storage_container_name search_service_name = module.search.search_service_name search_index_name = module.search.search_index_name openai_endpoint = var.enable_apim ? "${module.apim[0].gateway_url}/" : module.openai.openai_endpoint chat_fqdn = module.ca_chat.fqdn pbi_report_link = var.pbi_report_link content_safety_endpoint = module.cog.content_safety_endpoint content_safety_key = module.cog.content_safety_key cognitive_service_endpoint = module.cog.cognitive_service_endpoint cognitive_service_key = module.cog.cognitive_service_key speech_key = module.cog.speech_key vision_endpoint = module.cog.vision_endpoint vision_key = module.cog.vision_key storage_connection_string = module.st.connection_string ai_foundry_bing_connection_name = module.ai_foundry.bing_connection_name ai_foundry_deployment_name = module.ai_foundry.deployment_name ai_foundry_project_connection_string = module.ai_foundry.project_connection_string tenant_id = data.azurerm_subscription.current.tenant_id managed_identity_client_id = module.mi.client_id enable_entra_id_authentication = var.enable_entra_id_authentication image_name = var.ca_aihub_image } module "plugin" { count = var.enable_openai_plugin_call_transcript ? 1 : 0 source = "./modules/ca-plugin" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name resource_group_id = azurerm_resource_group.rg.id func_name = local.func_name image_name = var.ca_plugin_image cae_id = module.cae.cae_id cae_default_domain = module.cae.default_domain appi_instrumentation_key = module.appi.appi_key openai_key = module.openai.openai_key openai_model = module.openai.gpt4_deployment_name openai_endpoint = module.openai.openai_endpoint }