0Pricing
Terraform Infrastructure as Code · レッスン

ネストした設定のためのDynamic Block

Dynamic Blockを使ってネストした設定ブロックをプログラムで繰り返し生成し、セキュリティグループルールなどのコピー&ペーストをなくします。

「ネストした設定のためのDynamic Block」はCoddyKit上の無料Terraform Infrastructure as Codeレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTerraform Infrastructure as Code学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Terraform Infrastructure as Codeコースには全4レッスンが含まれています。

繰り返しの問題

一部のリソースには、複数の ingress ルールを持つセキュリティグループのように、繰り返し現れるネストされたブロックがあります。各ブロックを手作業で記述すると冗長になり、DRY を保つのも困難です。Dynamic ブロックを使うと、コレクションからブロックを生成できます。

まずは静的ブロックから

これが手動で記述した場合の例です。ほぼ同じ ingress ブロックが 3 つあります。これを 12 個も保守する場合を想像してみてください。

resource "aws_security_group" "web" {
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Dynamic ブロックの構造

dynamic ブロックには、ネストされたブロック名に一致するラベル、for_each コレクション、そして生成する各インスタンスの内容を定義する content ブロックがあります。

dynamic "ingress" {
  for_each = var.rules
  content {
    from_port   = ingress.value.port
    to_port     = ingress.value.port
    protocol    = "tcp"
    cidr_blocks = ingress.value.cidrs
  }
}

イテレーターオブジェクト

content の内部では、ブロックラベルに基づく名前のオブジェクトを使って現在の要素を参照します。このオブジェクトには .value(要素)と .key(マップのキーまたはリストのインデックス)が含まれます。

入力変数の定義

型付き変数を使って Dynamic ブロックを動かします。オブジェクトのリストにすると、各ルールの内容を自己説明的に保てます。

variable "rules" {
  type = list(object({
    port  = number
    cidrs = list(string)
  }))
}

組み立て

これで、渡すルールの数に関係なく、リソースを簡潔に保てます。

resource "aws_security_group" "web" {
  name = "web-sg"
  dynamic "ingress" {
    for_each = var.rules
    content {
      from_port   = ingress.value.port
      to_port     = ingress.value.port
      protocol    = "tcp"
      cidr_blocks = ingress.value.cidrs
    }
  }
}

イテレーターの名前変更

iterator 引数を使うと、反復処理の変数名を変更できます。Dynamic ブロックをネストする場合に、混乱を避けるのに便利です。

dynamic "ingress" {
  for_each = var.rules
  iterator = rule
  content {
    from_port = rule.value.port
    to_port   = rule.value.port
  }
}

条件付きでブロックを省略する

空のコレクションを渡すと、ブロックは 0 個生成されます。for_each に三項演算子を使うことで、ブロックを任意にできます。

dynamic "logging" {
  for_each = var.enable_logging ? [1] : []
  content {
    target_bucket = var.log_bucket
  }
}

ネストした Dynamic ブロック

Dynamic ブロックはネストできます。異なるイテレーターを使うと、内側のブロックから両方の階層を曖昧さなく参照できます。

dynamic "setting" {
  for_each = var.settings
  iterator = s
  content {
    namespace = s.value.namespace
    name      = s.value.name
    value     = s.value.value
  }
}

Dynamic ブロックを使わない場合

Dynamic ブロックは間接性を増やし、可読性を損なうことがあります。静的ブロックが 1 つか 2 つだけなら、リテラルのまま記述してください。個数がデータによって決まる場合に Dynamic ブロックを使いましょう。

結果の確認

plan を実行して、生成されたブロックが想定どおりか確認します。Terraform はコレクションの各要素を、具体的なネストされたブロックに展開します。

terraform plan

理解度チェック

Dynamic ブロックについての知識を確認しましょう。

まとめ: DRY なネスト設定

Dynamic ブロックを使うと、データからネストされた設定を生成できます。

  • for_each が反復処理を制御し、content が各ブロックを定義します。
  • イテレーターから .value と .key を参照できます。
  • 空のコレクションによってブロックを任意にできます。
  • 設定の可読性を保つため、必要な場合に限って使います。

よくある質問

「ネストした設定のためのDynamic Block」レッスンは無料ですか?

はい。「ネストした設定のためのDynamic Block」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Terraform Infrastructure as Codeコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Terraform Infrastructure as Codeコースには全4レッスンが含まれています。

「ネストした設定のためのDynamic Block」で何を学びますか?

Dynamic Blockを使ってネストした設定ブロックをプログラムで繰り返し生成し、セキュリティグループルールなどのコピー&ペーストをなくします。 ブラウザで直接実行するハンズオンコードでTerraform Infrastructure as Codeを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Terraform Infrastructure as Codeを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTerraform Infrastructure as Codeは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「ネストした設定のためのDynamic Block」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTerraform Infrastructure as Codeレッスンでコードを書いて実行できますか?

はい。すべてのTerraform Infrastructure as Codeレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. `for_each` と `count` によるループ
  2. Terraform 組み込み関数
  3. 条件式と Splat 式
  4. ネストした設定のためのDynamic Block
← Terraform Infrastructure as Codeに戻る