The for_each
meta argument can be used to remove redundancies from code blocks.
You can apply for_each
on a data structure such as a
- set
- list
- map
It is an alternative for the count
meta argument and is mutually exclusive with count
.
for_each
on Sets
You can iterate over a set of values with the for_each
meta argument as shown below.
resource "aws_subnet" "subnet_data2" { for_each = toset(local.cidrs) vpc_id = aws_vpc.main.id map_public_ip_on_launch = false cidr_block = each.key availability_zone = "eu-central-1b" }
for_each
on Lists
A more sophisticated way of using for_each
is by defining a block with additional values.
This is especially useful since resource
blocks do not allow you to define locals are some other kind of re-usable variables.
You can do that in the for_each
block instead like shown with the idx
value.
locals { cidrs = ["10.0.0.0/24", "10.0.1.0/24", "10.0.2.0/24"] } resource "aws_subnet" "subnet_data" { for_each = { for c in local.cidrs : c => { idx = index(local.cidrs, c) } } vpc_id = aws_vpc.main.id map_public_ip_on_launch = false cidr_block = each.key availability_zone = element(var.availability_zones, each.value.idx) tags = { Name = "${var.vpc_name}-subnet-data-${each.value.idx}" Environment = var.environment } }
for_each
on Maps
You can use the keys
or values
function for a for_each
block.
resource "aws_subnet" "subnet_data" { for_each = toset(local.cidrs.keys) vpc_id = aws_vpc.main.id map_public_ip_on_launch = false }
Top comments (0)