by shigemk2

当面は技術的なことしか書かない

aws_subnetsからcidr_blockを取得する

The following shows outputing all CIDR blocks for every subnet ID in a VPC.

4.53.0

aws_subnet_idsはsetなのでfor_eachが使えた

data "aws_subnet_ids" "example" {
  vpc_id = var.vpc_id
}

data "aws_subnet" "example" {
  for_each = data.aws_subnet_ids.example.ids
  id       = each.value
}

output "subnet_cidr_blocks" {
  value = [for s in data.aws_subnet.example : s.cidr_block]
}

https://registry.terraform.io/providers/hashicorp/aws/4.53.0/docs/data-sources/subnet_ids

5.23.1

OKパターン

data "aws_subnets" "example" {
  filter {
    name   = "vpc-id"
    values = [var.vpc_id]
  }
}

data "aws_subnet" "example" {
  for_each = toset(data.aws_subnets.example.ids) # ポイント
  id       = each.value
}

output "subnet_cidr_blocks" {
  value = [for s in data.aws_subnet.example : s.cidr_block]
}

NGパターン

The given "for_each" argument value is unsuitable: the "for_each" argument must be a map, or set of strings, and you have provided a value of type list of string.

terraform planで上記エラーで怒られるのは、data.aws_subnetsのidsの型がsetではなくlistだから。 ので、cidr_blockを取りたくてaws_subnet_idsではなくaws_subnetsからaws_subnetをリスト的に使いたいなら、for_eachにtosetで変換したsetを代入する小技が必要。

data "aws_subnets" "example" {
  filter {
    name   = "vpc-id"
    values = [var.vpc_id]
  }
}

data "aws_subnet" "example" {
  for_each = data.aws_subnets.example.ids # ポイント
  id       = each.value
}

output "subnet_cidr_blocks" {
  value = [for s in data.aws_subnet.example : s.cidr_block]
}

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/subnets