Terraform0.12のdynamic構文の使い方

AWS, Terraform, Programming10 November 2020

Terraformのバージョン0.12から追加された、『dynamic』の使い方を解説します!

うまく使用するとかなりtfファイルがスッキリ書けますのでぜひ参考にしてみてください!

dynamicとは

dynamic構文とは、Terraform0.12から追加された機能の一つで同一名のブロックをループで処理することができます。

こう書いてもよく意味がわからないと思うので、具体例を記載します。

具体例

例えば以下のような時に使用します。

『aws_iam_policy_document』内で「statement」ブロックをループ処理で記載したい。

『aws_security_group』内で「ingress」ブロックをループ処理で記載したい。

などなど。

基本的に、resourceないしdata内のブロックを複数記載する時に繰り返し処理によって書きたい場合に使用します。

使い方

実際の使い方(tfファイル内の書き方)について説明します。

今回は例として、上記で記載した『aws_iam_policy_document』を使用します!

構文の形式

まず、構文の形式としては次のようになります。

dynamic "繰り返ししたいブロック名" {
    for_each = ループで使用するリスト

    content {
        ブロック内で記載する属性値
    }
}

作成手順

1. リストを定義

dynamic構文ではループによって処理を行うので、ループ時に使用するリストを定義します。

(今回はstatementブロック内のeffect属性をリストで定義します)

# ループで使用するリストを定義(今回は、statement内で使用するeffectをリスト化)
locals {
  policy_document_effects = ["Allow", "Deny", "Allow"]
}

2. dynamic構文を記載

上記のリストを用いてdynamic構文を記載します。

便宜上「actions」と「resources」は記載していませんが、実際にはお使いの環境に併せて記載してください!

# dynamic構文を記載(actionsとresourcesは便宜上記載していません。)
data "aws_iam_policy_document" "dynamic_test_document" {
  dynamic "statement" {
    for_each = local.policy_document_effects

    content {
      sid       = statement.key + 1
      effect    = statement.value
      actions   = [

      ]
      resources = [

      ]
    }
  }
}

statement.key

dynamicで指定したブロック名(今回はstatement)に「.key」を付けるとループのインデックスを取得することができます。(0始まり)

statement.value

dynamicで指定したブロック名(今回はstatement)に「.value」を付けるとリストの値を取得することができます。

dynamicを使用しないで書くとどうなるか

上記をdynamicを使用しないで書くと次のようになります。

# dynamicを使わない場合
data "aws_iam_policy_document" "dynamic_test_document" {
  statement {
    sid = "1"

    effect = "Allow"
    actions = [

    ]
    resources = [

    ]
  }
  statement {
    sid = "2"

    effect = "Deny"
    actions = [

    ]
    resources = [

    ]
  }
  statement {
    sid = "3"

    effect = "Allow"
    actions = [

    ]
    resources = [

    ]
  }
}

だいぶ冗長な書き方になりますよね。

こんな感じで、ループで処理できるところはdynamicを使用するとかなりスッキリ書けます!