6.Compute.Cluster/container.app.tf (120 lines of code) (raw):

############################################################################## # Container Apps (https://learn.microsoft.com/azure/container-apps/overview) # ############################################################################## variable containerAppEnvironments { type = list(object({ enable = bool name = string workloadProfiles = list(object({ name = string type = string scaleUnit = object({ minCount = number maxCount = number }) })) network = object({ subnetName = string internalOnly = object({ enable = bool }) locationExtended = object({ enable = bool }) }) registry = object({ host = string login = object({ userName = string userPassword = string }) }) apps = list(object({ enable = bool name = string container = object({ name = string image = string memory = string cpu = number }) revisionMode = object({ type = string }) })) zoneRedundancy = object({ enable = bool }) })) } locals { containerAppEnvironments = [ for appEnvironment in var.containerAppEnvironments : merge(appEnvironment, { network = merge(appEnvironment.network, { subnetId = "${appEnvironment.network.locationExtended.enable ? data.azurerm_virtual_network.studio_extended[0].id : data.azurerm_virtual_network.studio.id}/subnets/${appEnvironment.network.subnetName}" }) }) if appEnvironment.enable ] containerApps = flatten([ for appEnvironment in local.containerAppEnvironments : [ for containerApp in appEnvironment.apps : merge(containerApp, { key = "${appEnvironment.name}-${containerApp.name}" environmentName = appEnvironment.name containerRegistry = appEnvironment.registry }) if containerApp.enable ] ]) } resource azurerm_container_app_environment studio { for_each = { for appEnvironment in local.containerAppEnvironments : appEnvironment.name => appEnvironment } name = each.value.name resource_group_name = azurerm_resource_group.cluster_container_app[0].name location = azurerm_resource_group.cluster_container_app[0].location log_analytics_workspace_id = data.terraform_remote_state.core.outputs.monitor.logAnalytics.id dapr_application_insights_connection_string = data.azurerm_application_insights.studio.connection_string internal_load_balancer_enabled = each.value.network.internalOnly.enable infrastructure_subnet_id = each.value.network.subnetId zone_redundancy_enabled = each.value.zoneRedundancy.enable infrastructure_resource_group_name = length(each.value.workloadProfiles) > 0 ? "${azurerm_resource_group.cluster_container_app[0].name}.${each.value.network.subnetName}" : null dynamic workload_profile { for_each = each.value.workloadProfiles content { name = workload_profile.value["name"] workload_profile_type = workload_profile.value["type"] minimum_count = workload_profile.value["scaleUnit"]["minCount"] > 0 ? workload_profile.value["scaleUnit"]["minCount"] : null maximum_count = workload_profile.value["scaleUnit"]["maxCount"] > 0 ? workload_profile.value["scaleUnit"]["maxCount"] : null } } } resource azurerm_container_app studio { for_each = { for containerApp in local.containerApps : containerApp.key => containerApp } name = each.value.name resource_group_name = azurerm_resource_group.cluster_container_app[0].name container_app_environment_id = azurerm_container_app_environment.studio[each.value.environmentName].id revision_mode = each.value.revisionMode.type identity { type = "UserAssigned" identity_ids = [ data.azurerm_user_assigned_identity.studio.id ] } registry { server = each.value.containerRegistry.host identity = each.value.containerRegistry.login.userName == "" ? data.azurerm_user_assigned_identity.studio.id : null username = each.value.containerRegistry.login.userName != "" ? each.value.containerRegistry.login.userName : null password_secret_name = each.value.containerRegistry.login.userPassword != "" ? each.value.containerRegistry.login.userPassword : null } template { container { name = each.value.container.name image = each.value.container.image memory = each.value.container.memory cpu = each.value.container.cpu } } depends_on = [ time_sleep.container_registry_rbac, azurerm_container_app_environment.studio ] }