scenarios/aca-internal/terraform/modules/02-spoke/main.tf (181 lines of code) (raw):
resource "random_string" "random" {
length = 5
special = false
lower = true
}
module "naming" {
source = "../../../../shared/terraform/modules/naming"
uniqueId = random_string.random.result
environment = var.environment
workloadName = var.workloadName
location = var.location
}
resource "azurerm_resource_group" "spokeResourceGroup" {
name = var.spokeResourceGroupName != "" ? var.spokeResourceGroupName : module.naming.resourceNames["rgSpokeName"]
location = var.location
tags = var.tags
}
module "vnet" {
source = "../../../../shared/terraform/modules/networking/vnet"
networkName = module.naming.resourceNames["vnetSpoke"]
location = var.location
resourceGroupName = azurerm_resource_group.spokeResourceGroup.name
addressSpace = var.vnetAddressPrefixes
tags = var.tags
subnets = local.spokeSubnets
subnetDelegations = local.subnetDelegations
}
module "nsgContainerAppsEnvironmentNsg" {
source = "../../../../shared/terraform/modules/networking/nsg"
nsgName = module.naming.resourceNames["containerAppsEnvironmentNsg"]
location = var.location
resourceGroupName = azurerm_resource_group.spokeResourceGroup.name
securityRules = var.containerAppsSecurityRules
tags = var.tags
}
resource "azurerm_subnet_network_security_group_association" "infraSecurityGroupAssociation" {
subnet_id = data.azurerm_subnet.infraSubnet.id
network_security_group_id = module.nsgContainerAppsEnvironmentNsg.nsgId
}
module "nsgPrivateEndpoints" {
source = "../../../../shared/terraform/modules/networking/nsg"
nsgName = module.naming.resourceNames["privateEndpointsNsg"]
location = var.location
resourceGroupName = azurerm_resource_group.spokeResourceGroup.name
tags = var.tags
}
resource "azurerm_subnet_network_security_group_association" "privateEndpointSecurityGroupAssociation" {
subnet_id = data.azurerm_subnet.privateEndpointsSubnet.id
network_security_group_id = module.nsgPrivateEndpoints.nsgId
}
module "nsgAppGateway" {
source = "../../../../shared/terraform/modules/networking/nsg"
nsgName = module.naming.resourceNames["applicationGatewayNsg"]
location = var.location
resourceGroupName = azurerm_resource_group.spokeResourceGroup.name
securityRules = var.appGatewaySecurityRules
tags = var.tags
}
resource "azurerm_subnet_network_security_group_association" "agwSecurityGroupAssociation" {
count = var.applicationGatewaySubnetAddressPrefix != "" ? 1 : 0
subnet_id = data.azurerm_subnet.appGatewaySubnet[0].id
network_security_group_id = module.nsgAppGateway.nsgId
}
module "nsgJumpbox" {
source = "../../../../shared/terraform/modules/networking/nsg"
nsgName = module.naming.resourceNames["vmJumpBoxNsg"]
location = var.location
resourceGroupName = azurerm_resource_group.spokeResourceGroup.name
tags = var.tags
}
resource "azurerm_subnet_network_security_group_association" "jumpBoxSecurityGroupAssociation" {
count = var.jumpboxSubnetAddressPrefix != "" ? 1 : 0
subnet_id = data.azurerm_subnet.jumpboxSubnet[0].id
network_security_group_id = module.nsgJumpbox.nsgId
}
module "peeringSpokeToHub" {
source = "../../../../shared/terraform/modules/networking/peering"
localVnetName = module.vnet.vnetName
remoteVnetId = var.hubVnetId
remoteVnetName = local.hubVnetName
remoteRgName = azurerm_resource_group.spokeResourceGroup.name
}
module "peeringHubToSpoke" {
source = "../../../../shared/terraform/modules/networking/peering"
localVnetName = local.hubVnetName
remoteVnetId = module.vnet.vnetId
remoteVnetName = local.hubVnetName
remoteRgName = local.hubVnetResourceGroup
}
module "vm" {
source = "../../../../shared/terraform/modules/vms"
osType = "Linux"
location = var.location
tags = var.tags
nicName = module.naming.resourceNames["vmJumpBoxNic"]
vmName = module.naming.resourceNames["vmJumpBox"]
adminUsername = var.vmAdminUsername
adminPassword = var.vmAdminPassword
sshAuthorizedKeys = var.vmLinuxSshAuthorizedKeys
authenticationType = var.vmLinuxAuthenticationType
resourceGroupName = azurerm_resource_group.spokeResourceGroup.name
size = var.vmSize
vnetResourceGroupName = azurerm_resource_group.spokeResourceGroup.name
subnetId = data.azurerm_subnet.jumpboxSubnet[0].id
}
module "logAnalyticsWorkspace" {
source = "../../../../shared/terraform/modules/monitoring/log-analytics"
resourceGroupName = azurerm_resource_group.spokeResourceGroup.name
location = var.location
workspaceName = module.naming.resourceNames["logAnalyticsWorkspace"]
tags = var.tags
}
module "diagnostics" {
source = "../../../../shared/terraform/modules/diagnostics"
logAnalyticsWorkspaceId = module.logAnalyticsWorkspace.workspaceId
resources = [
{
type = "vnet-spoke"
id = module.vnet.vnetId
},
{
type = "vm-jumpbox"
id = module.vm.vmId
}
]
}
data "azurerm_subnet" "infraSubnet" {
depends_on = [
module.vnet
]
name = var.infraSubnetName
resource_group_name = azurerm_resource_group.spokeResourceGroup.name
virtual_network_name = module.vnet.vnetName
}
data "azurerm_subnet" "privateEndpointsSubnet" {
depends_on = [
module.vnet
]
name = var.privateEndpointsSubnetName
resource_group_name = azurerm_resource_group.spokeResourceGroup.name
virtual_network_name = module.vnet.vnetName
}
data "azurerm_subnet" "appGatewaySubnet" {
count = var.applicationGatewaySubnetAddressPrefix != "" ? 1 : 0
depends_on = [
module.vnet
]
name = var.applicationGatewaySubnetName
resource_group_name = azurerm_resource_group.spokeResourceGroup.name
virtual_network_name = module.vnet.vnetName
}
data "azurerm_subnet" "jumpboxSubnet" {
count = var.jumpboxSubnetAddressPrefix != "" ? 1 : 0
depends_on = [
module.vnet
]
name = var.jumpboxSubnetName
resource_group_name = azurerm_resource_group.spokeResourceGroup.name
virtual_network_name = module.vnet.vnetName
}
module "routeTable" {
source = "../../../../shared/terraform/modules/networking/route-table"
routeTableName = module.naming.resourceNames["routeTable"]
location = var.location
resourceGroupName = azurerm_resource_group.spokeResourceGroup.name
subnetId = data.azurerm_subnet.infraSubnet.id
tags = var.tags
routes = concat(
[{
name = "defaultEgressLockdown"
addressPrefix = "0.0.0.0/0"
nextHopType = "VirtualAppliance"
nextHopIpAddress = var.firewallPrivateIp
},
var.routeSpokeTrafficInternally ? [for i, prefix in var.vnetAddressPrefixes : {
name = "spokeInternalTraffic-${i}"
addressPrefix = prefix
nextHopType = "VnetLocal"
}] : []
])
}