動的なブロックの作成
- Terraform 0.12からfor_eachを使用して動的にブロックを定義できるようになり、ブロックの数を変更する場合の修正が容易になった
- ここではAWSのWAFに設定するIPアドレスを例に紹介する
バージョン
- Terraform 0.12.12
- AWSプロバイダ 2.35.0
AWSのWAF
- WAFを作成するには以下3つのリソースが必要になる
- IP addresses
- IPアドレスの集合
- Rules
- 上記のIP addressesと組み合わせ、「そのIPアドレスにマッチした場合」、「マッチしない場合」などのルールを決める
- Web ACLs
- 上記のRulesと組み合わせ、そのルールに合致した場合の許可・拒否の設定、また合致しない場合の許可・拒否の設定ができる
- IP addresses
IP addressesの記載(for_eachを使用しない場合)
- IPアドレスの設定方法は下記の通り
resource "aws_waf_ipset" "ipset" {
name = "tfIPSet"
ip_set_descriptor {
type = "IPV4"
value = "192.0.7.0/24"
}
ip_set_descriptor {
type = "IPV4"
value = "10.16.16.0/16"
}
}
- このように、IPアドレスの数だけip_set_descriptorのブロックを記載する必要があり、IPアドレスの数が変わったときにこの部分も修正する必要がある
IP addressesの記載(for_eachを使用した場合)
- IPアドレスの設定方法は下記の通り
variable "ipset" {
type = list(string)
default = ["192.0.7.0/24", "10.16.16.0/16"]
}
resource "aws_waf_ipset" "ipset" {
name = "tfIPSet"
dynamic "ip_set_descriptors" {
for_each = var.ipset
content {
type = "IPV4"
value = ip_set_descriptors.value
}
}
}
- このように、複数のIPアドレスを変数にリストとして定義し、動的なブロックとして定義した"ip_set_descriptors"の中で
for_each
にその変数を記載する。 - ループの中で繰り返し設定する値は、contentブロックの中で指定する。ここでip_set_descriptorsに設定する必要があるtypeとvalueの記載をしている。リストの要素の受け取りには
Dynamicブロック名.value
を記載する。type="IPV4"
は各IPアドレスで共通なので変数化していない。 -
Dynamicブロック名.key
でリストの要素番号(0スタート)を取得できる。 - 変数にはリストではなくマップを指定することも可能。
- 変数の記載をvariables.tfにまとめておけば、登録するIPアドレスの数が変わった場合でもそのファイルだけを更新すればよい。