terraform で map 型の値を key 順にソートした上で value のリストを取得する

terraform で map 型の値を key 順にソートした上で value のリストを取得する

terraform で map 型を for で整形した際に key を昇順にソートして並べてくれます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> {for k, v in {"a":3, "c":2, "d":1}: v => k}

{
"1" = "d"
"2" = "c"
"3" = "a"
}

> values({for k, v in {"a":3, "c":2, "d":1}: v => k})

[
"d",
"c",
"a",
]

これを利用し、data リソースで取得した Subnet ID を AZ 順 (a → c → d) に list で取得してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
data "aws_subnets" "public" {
filter {
name = "vpc-id"
values = ["xxxxx"]
}
filter {
name = "tag:Name"
values = ["public-*"]
}
}

data "aws_subnet" "public" {
for_each = toset(data.aws_subnets.public.ids)

id = each.value
}

values({ for id, s in data.aws_subnet.public : s.availability_zone => id })
# [
# "subnet-xxx", # ap-northeast-1a
# "subnet-yyy", # ap-northeast-1c
# "subnet-zzz", # ap-northeast-1d
# ]

以下の様に EC2 インスタンスを 10 台起動するときに Subnet の AZ を a, c, d と順々に振り分けたい場合などに便利です。

1
2
3
4
5
6
7
8
9
locals {
az_count = length(data.aws_availability_zones.available.names)
}

resource "aws_instance" "app" {
count = 10

# NOTE: map 型にすることで key の昇順で並ぶことを利用し AZ を a → c → d と並べている
subnet_id = values({ for id, s in data.aws_subnet.public : s.availability_zone => id })[count.index % local.az_count]

以上、参考になれば幸いです。

terraform で map 型の値を key 順にソートした上で value のリストを取得する

https://kenzo0107.github.io/2022/10/25/2022-10-26-terraform-sort-map/

Author

Kenzo Tanaka

Posted on

2022-10-26

Licensed under

コメント