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
}
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
}