동적 블록을 사용하여 Terraform 구성에서 DRY 연습

10067 단어 terraformiacdevops
소프트웨어 개발의 Do n't Repeat Yourself(DRY) 원칙에 따르면 코드는 한 번만 작성하고 반복해서는 안 됩니다. DRY 원칙의 중요한 목표는 코드의 유지 관리성을 향상시키는 것입니다.

어떻게 할 수 있는지 확인하십시오keep your configuration DRY with Terragrunt on Spacelift .

일부 Terraform 리소스에는 인수에 반복 가능한 중첩 블록이 포함되어 있습니다. 이러한 중첩된 블록은 포함하는 리소스와 관련된 별도의 리소스를 나타냅니다. 예를 들어 Azure VNet에는 VNet 내의 각 서브넷에 대해 반복되는 서브넷 블록 특성이 포함되어 있습니다. 이로 인해 Terraform 스크립트에서 DRY 원칙을 위반하는 구성 블록이 반복될 수 있습니다.

동적 블록은 terraform 구성 스크립트에서 DRY를 적용하기 위한 솔루션입니다.

동적 블록 사용 방법



Terraform은 리소스 내에서 반복 가능한 중첩 블록을 생성하는 블록dynamic을 제공합니다. dynamic 블록은 for 식과 유사합니다. 여기서 for는 VNet과 같은 반복 가능한 최상위 리소스를 생성하고, dynamic는 VNet 내의 서브넷과 같은 최상위 리소스 내에 중첩된 블록을 생성합니다. dynamic 블록은 하위 리소스를 반복하고 해당 리소스의 각 요소에 대해 중첩된 블록을 생성합니다.

예시



다음 코드는 Azure VNet 및 4개의 서브넷 구성을 보여줍니다. 이 예에서 서브넷 블록은 명시적으로 작성되어 반복되는 코드를 생성합니다.

resource "azurerm_virtual_network" "dynamic_block" {
  name                = "vnet-dynamicblock-example-centralus"
  resource_group_name = azurerm_resource_group.dynamic_block.name
  location            = azurerm_resource_group.dynamic_block.location
  address_space       = ["10.10.0.0/16"]

  subnet {
    name           = "snet1"
    address_prefix = "10.10.1.0/24"
  }

  subnet {
    name           = "snet2"
    address_prefix = "10.10.2.0/24"
  }

  subnet {
    name           = "snet3"
    address_prefix = "10.10.3.0/24"
  }

  subnet {
    name           = "snet4"
    address_prefix = "10.10.4.0/24"
  }
}

dynamic 블록을 사용하는 동일한 구성이 아래에 나와 있습니다. 4개의 subnet 블록을 dynamic 블록으로 교체하면 반복되는 속성이 제거되어 유지 관리가 더 쉬운 깔끔한 코드가 됩니다.

resource "azurerm_virtual_network" "dynamic_block" {
  name                = "vnet-dynamicblock-example-centralus"
  resource_group_name = azurerm_resource_group.dynamic_block.name
  location            = azurerm_resource_group.dynamic_block.location
  address_space       = ["10.10.0.0/16"]

  dynamic "subnet" {
    for_each = var.subnets
    iterator = item   #optional
    content {
      name           = item.value.name
      address_prefix = item.value.address_prefix
    }
  }
}


다음은 가변 서브넷의 정의입니다.

variable "subnets" {
  description = "list of values to assign to subnets"
  type = list(object({
    name           = string
    address_prefix = string
  }))
}


subnets 변수의 값은 tfvars 파일에 정의됩니다. 샘플 값은 다음과 같습니다.

subnets = [
  { name = "snet1", address_prefix = "10.10.1.0/24" },
  { name = "snet2", address_prefix = "10.10.2.0/24" },
  { name = "snet3", address_prefix = "10.10.3.0/24" },
  { name = "snet4", address_prefix = "10.10.4.0/24" }
]


동적 블록 구성요소


dynamic 블록은 resource , data , providerprovisioner 블록 내부에서 지원됩니다. dynamic 블록은 다음 구성 요소로 구성됩니다.


요소
설명


상표
생성할 중첩 블록의 종류를 지정합니다. 위의 예에서 레이블은 "서브넷"입니다. var.subnets 변수의 각 요소에 대해 서브넷 리소스가 생성됩니다.

각각
반복할 복소수 값입니다.

반복자
(선택 사항) 현재 요소를 나타내는 임시 변수의 이름을 설정합니다. 제공되지 않은 경우 변수 이름은 기본적으로 동적 블록의 레이블로 지정됩니다. 반복자에는 키와 값이라는 두 가지 속성이 있습니다. 키는 요소 인덱스입니다. 값은 요소 값입니다.

콘텐츠
생성된 각 블록의 본문을 정의합니다.

dynamic 블록은 생성 중인 리소스 유형에 속하는 속성만 생성할 수 있습니다. lifecycle 와 같은 메타 인수 블록을 생성하는 것은 불가능합니다. 일부 리소스 유형에는 여러 수준의 중첩이 있는 블록이 있습니다. 다중 수준 중첩 블록으로 작업할 때 각 블록의 반복자가 중요합니다. 선택적 구성요소iterator를 사용하여 구성의 각 레벨을 명확하게 정의하고 상위 블록과 이름이 같은 속성으로 인해 발생하는 모호성을 제거하는 것이 좋습니다. 아래 목록은 각 블록에 대해 명확하게 정의된 반복기가 있는 중첩 블록 예제를 보여줍니다.

  dynamic "origin_group" {
    for_each = var.load_balancer_origin_groups
    iterator = outer_block
    content {
      name = outer_block.key

      dynamic "origin" {
        for_each = outer_block.value.origins
        iterator = inner_block
        content {
          hostname = inner_block.value.hostname
        }
      }
    }
  }


키 포인트



Adynamic 블록은 Terraform 구성 스크립트에서 DRY 원칙을 적용하는 좋은 방법입니다. 적절한 경우 dynamic 블록을 구현하면 DRY 원칙이 목표로 하는 것처럼 읽기, 유지 관리 및 재사용이 더 쉬운 구성으로 이어지는 반복 코드가 제거됩니다.

좋은 웹페이지 즐겨찾기