技術雑記帳兼日記帳

AWS、Python、Terraformの使い方をコッソリ

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] }