今回はdynamicブロックについてです。
■はじめに
dynamicブロックの公式ページは以下です。
Dynamic Blocks - Configuration Language | Terraform | HashiCorp Developer
■dynamicブロックで何ができるのか?
私がdynamicブロックについて調べている際、
「繰り返し処理ができます!」という内容はたくさん見ました。
ただ、私は
「countやfor_eachでもできるよ」
と思ってました。
※ count/for_eachメタ引数 と dynamicブロックの違いがよくわかっていなかったので。笑
「count/for_eachではresource単位での繰り返し」ができます。
for_eachについては下記の記事を参照ください。
では、"dynamicブロックを使う利点やユースケースは何なのか?"
答えは、
「dynamicはresourceの中のブロック単位で繰り返す」
ことができることです。
■本題に入る前に復習(for_each)
例えば、下記のコードの場合には、VPCが2つ作成できます。
これは前述の通り、「resource単位で繰り返し」をした結果、VPCが2つ作成されます。
■dynamicブロックを使わない場合
dynamicブロックの説明に入る前に一例ですが、SecurityGroupを作成する場合を考えてみます。
※ "aws_security_group"リソースを使う前提で記載しております。
インバウンドルールに80番、443番を指定する場合、以下のコードになります。
name , description , vpc_id はSecurityGroupを作成する上で1回のみ指定すればよいものです。
インバウンドルールは80番、443番で絞るため、ingress{}が複数存在することになります。
この際、ingressブロック内の値を動的に変更することができれば、ingressブロックの記載は一つですみます。
■dynamicブロックを使う場合
まずは、コードから。
dynamicブロックを使う場合、for_eachとcontentが必須です。
for_eachでループ処理を宣言し、contentの中でingressブロック内で必要となる引数を指定します。(=dynamicブロックを使わずにSecurityGroupを設定する際に指定するingressブロックの引数のことです。)
ingressブロック内で必要な引数は以下参照ください。
for_eachを使ってはいますが、each.key , each.valueのようなeachを使った記述ではなく、dynamicを宣言したブロック名(今回の場合は dynamic "ingress" {} なのでingress)を使います。
なので、ingress.key や ingress.value を使っております。
※locals変数がリスト形式のため、key , valueはどちらを指定しても同じ値となります。
以下は上記コードのterraform apply実行時のログ抜粋です。
また、AWSマネコンのSecurityGroup画面は以下です。
このような使い方ができるため、ブロック単位での繰り返し処理にてdynamicブロックを上手く使うことでコードの記述量を減らすことができます。
以上です。