Search code examples
amazon-web-servicesterraformterraform-provider-aws

Adding Extra Routes to route table using terraform module


I am adding routes to route table using module. Below is my code. It runs successfully but routes don't get added.

module.tf: (This checks if the publicRoute & privateRoute has more than one item, it will add that many routes to route table)

resource "aws_route" "public_routes" {
  count   = length(var.ExtraRoutes.publicRoute) > 1 ? length(var.ExtraRoutes.publicRoute) : 0
  route_table_id            = aws_route_table.VPCPublicSubnetRouteTable[0].id
  destination_cidr_block    = length(regexall("^[0-9].*.[0-9].*",var.ExtraRoutes.publicRoute[count.index].destination)) != 0 ? var.ExtraRoutes.publicRoute[count.index].destination : null
  gateway_id = length(regexall("^igw-.*",var.ExtraRoutes.publicRoute[count.index].target)) != 0 ? var.ExtraRoutes.publicRoute[count.index].target : null
}
resource "aws_route" "private_routes" {
  count   = length(var.ExtraRoutes.privateRoute) > 1 ? length(var.ExtraRoutes.privateRoute) : 0
  route_table_id            = aws_route_table.VPCPrivateSubnetRouteTable[0].id  
  destination_cidr_block    = length(regexall("^[0-9].*.[0-9].*",var.ExtraRoutes.privateRoute[count.index].destination)) != 0 ? var.ExtraRoutes.privateRoute[count.index].destination : null  
  gateway_id = length(regexall("^igw-.*",var.ExtraRoutes.privateRoute[count.index].target)) != 0 ? var.ExtraRoutes.privateRoute[count.index].target : null
}

module_var.tf (I am keeping it only a map)

variable "ExtraRoutes" {
  type = map
  default = {
    publicRoute  = []
  privateRoute = []
  }
}

main.tf (As I need the first item in ExtraRoutes for something else I want from count.index + 1)

module "ExtraVPCs" {
  source = "./modules/VPC"
  count  =  length(var.ExtraRoutes)
  ExtraRoutes = {
    publicRoute = var.ExtraRoutes[count.index + 1].publicRoute
    privateRoute = var.ExtraRoutes[count.index + 1].privateRoute
  }  
}

main_var.tf

variable "ExtraRoutes" {
  type = list(object({
    publicRoute            = list(object({
        destination = string
        target = string
  })
  )
  privateRoute = list(object({
    destination = string
        target = string
  }))
  }))
}

init.tfvars (There are 2 items in ExtraRoutes. It should add the 2nd item in Route table but it's not working as expected.

ExtraRoutes = [
  {
  publicRoute = [
      {
        destination = "10.0.0.0/32"
        target =  "igw-092aba6c187183f48"
      }
      ]
  privateRoute = [
      {
        destination = "10.0.0.0/32"
        target =  "igw-092aba6c187183f48"
      }
      ]
},
 {
  publicRoute = [
      {
        destination = "10.0.0.0/32"
        target =  "igw-0acf4f7ac1e7eba47"
      }
      ]
  privateRoute = [
      {
        destination = "10.0.0.0/32"
        target =  "igw-0acf4f7ac1e7eba47"
      }
      ]
}
]

Solution

  • You check the length of a list using >0, not >1:

     count   = length(var.ExtraRoutes.publicRoute) > 0 ? length(var.ExtraRoutes.publicRoute) : 0
    

    TF counts items from 0. When you use >1, in your case you end up with count = 0.