dynamic block: リソース内の同名blockのループ †
- dynamic blocks
- リソース内で同じ名前のブロックが複数ある場合、for_eachでループできる。
- list(string)はfor_each = toset(var.name)で指定、.keyで参照する。項目が増減すると、リソースの生成/破棄が発生する。
- map(string)は、.key, .valueで参照できる
- 複雑なlist(map(string))は、.value.key2で参照できる
- 例: aws_security_group に使う。aws_security_group_rule の方が差分を確認できて良いかもしれない。
- メリット:
- 内部的にソートしているようで、記述の順序を気にして無く良い。
- デメリット:
- 一部だけ変えても、delete/new扱い。changeで表示されない。
- 一つでも必要な項目は、全変数に入れる必要がある。(パラメータが無かったら省略するという構文が無いように見える)
variable "sg_ssh_ingress" {
default = [
{
cidr_blocks = ["xxx.xxx.xxx.xxx/32"]
description = "ssh from AAA"
security_groups = []
self = false
},
{
cidr_blocks = ["xxx.xxx.xxx.xxx/32"]
description = "ssh from BBB"
security_groups = []
self = false
},
...
]
}
resource "aws_security_group" "bastion" {
...
dynamic "ingress" {
for_each = var.sg_ssh_ingress
content {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ingress.value.cidr_blocks
security_groups = ingress.value.security_groups
description = ingress.value.description
self = ingress.value.self
}
}
...
}