동적 블록을 사용하여 Terraform 구성에서 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
, provider
및 provisioner
블록 내부에서 지원됩니다. 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
}
}
}
}
키 포인트
A
dynamic
블록은 Terraform 구성 스크립트에서 DRY 원칙을 적용하는 좋은 방법입니다. 적절한 경우 dynamic
블록을 구현하면 DRY 원칙이 목표로 하는 것처럼 읽기, 유지 관리 및 재사용이 더 쉬운 구성으로 이어지는 반복 코드가 제거됩니다.
Reference
이 문제에 관하여(동적 블록을 사용하여 Terraform 구성에서 DRY 연습), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pdelcogliano/practice-dry-in-terraform-configurations-using-a-dynamic-block-52nm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)