terraform要素の配列化
Terraformのモジュール化の勉強ついでに、Subnetの複数定義をsplitの使用から配列での実装に変更して見たので比較してみます。
参考:ベストプラクティス github.com
→下記以外にモジュールの実装でかなり勉強になりました。
split使用版
variable "cidrs" { default = "192.168.1.0/24,192.168.2.0/24"} variable "azs" { dedefault = "ap-northeast-1a,ap-northeast-1c"} resource "aws_subnet" "private_subnet" { vpc_id = var.vpc_id cidr_block = element(split(",", var.cidrs), count.index) availability_zone = element(split(",", var.azs), count.index) count = length(split(",", var.cidrs)) : : } output "subnet_ids" { value = join(",", aws_subnet.private_subnet.*.id) }
cidrやazをカンマ区切り文字列で渡している。
outputも同様にカンマ区切りで生成したサブネットのIDを返却する。
使う側はsplit(",", subnet_ids)して配列にしてあげれば良い。
split未使用版
variable "private_networks" { default = { "cidrs" = ["192.168.3.0/24", "192.168.4.0/24"] "azs" = ["ap-northeast-1a", "ap-northeast-1c"] } } resource "aws_subnet" "private_subnet" { vpc_id = var.vpc_id cidr_block = element(var.private_networks.cidrs, count.index) availability_zone = element(var.private_networks.azs, count.index) count = length(var.private_networks.cidrs) : : } output "subnet_ids" { value = [for sbunet in aws_subnet.private_subnet : sbunet.id] }
こっちはmapでcidersやaszを切って、その配列をelementで取り出してあげて、最後にforループでidを取り出してidも配列にしている。
splitをかまさない分利用する側はシンプルに「=」だけで実装できる。
見た目のシンプル差で後者が良さそうだなぁ。
ちなみに下記は利用する側で使えなかった。
output "subnet_ids" { value = [aws_subnet.private_subnet.*.id] }