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