Search code examples
terraformterraform-provider-aws

create prefix lists through data in json file


I'm trying to create separate prefix lists using below json file with each prefix list should contain cidr values in the list. Please help on this

{
  "Rules": [
    {
      "Cidr": "192.168.1.0/32",
      "Description": "Test"
    },
    {
      "Cidr": "192.168.1.10/32",
      "Description": "Test1"
    }
  ],
  "Rules1": [
    {
      "Cidr": "192.168.2.0/32",
      "Description": "Test"
    },
    {
      "Cidr": "192.168.2.10/32",
      "Description": "Test1"
    }
  ]
}

Terraform code

resource "aws_ec2_managed_prefix_list" "pl-Rules" {
  name           = "pl-Rules"
  address_family = "IPv4"
  max_entries    = 7
}

resource "aws_ec2_managed_prefix_list" "pl-Rules1" {
  name           = "pl-Rules1"
  address_family = "IPv4"
  max_entries    = 7
}

resource "aws_ec2_managed_prefix_list_entry" "entry" {

  cidr           = <Rules.cidr>
  description    = <Rules.description>
  prefix_list_id = aws_ec2_managed_prefix_list.pl-Rules.id
}

Solution

  • You'll need to read in the json file and then you need to build a suitable map to hold the configuration.

    You can use (assuming your file is called config.json):

    locals {
      config      = jsondecode(file("config.json"))
      rules_names = keys(local.config)
      rules_config = tomap(merge([
        for rule, v in local.config : {
          for i, rule_config in v : "${rule}_${i}" => {
            rule_name   = rule
            cidr        = rule_config.Cidr
            description = rule_config.Description
          }
        }
      ]...))
    }
    
    resource "aws_ec2_managed_prefix_list" "pl-Rules" {
      for_each       = { for idx, rule_names in local.rules_names : rule_names => idx }
      name           = "pl-${each.key}"
      address_family = "IPv4"
      max_entries    = 7
    }
    
    resource "aws_ec2_managed_prefix_list_entry" "entry" {
      for_each       = local.rules_config
      cidr           = each.value.cidr
      description    = each.value.description
      prefix_list_id = aws_ec2_managed_prefix_list.pl-Rules["${each.value.rule_name}"].id
    }