연재 시리즈

테라폼 t102 스터디 - dynamic block

악분 2023. 7. 15. 22:55
반응형

안녕하세요. 이 글은 테라폼 t102스터디 2주차에 공부했던 내용을 정리했습니다.

 

1. dynamic block이란?

dynamic block은 block 인자(argument)를 반복 생성합니다.

 

count/for_each와 차이점은 반복 대상입니다. count/for_each는 block이 대상이지만, dynamic block은 block 인자가 대상입니다.

 

 

2. 사용방법

사용방법은 block 인자를 dynamic block으로 변경하면 됩니다.

 

dynamic block body는 테라폼 변수(variable) 또는 local을 사용합니다. 아래 예제는 변수를 사용했습니다.

      반복할 argument 값을 local 또는 variable로 정의(꼭 collection타입)

      argument를 dynamic block으로 수정

      for_each에 ①에서 정의한 값을 참조

      content에 내용을 반복 설정

 

content에서 값을 접근할 때, dynamic block label을 사용합니다.

 

3. 예제

3.1 목표

예제 목표는 aws security group resource block의 반복되는 ingress인자를 dynamic block으로 변경해야 합니다. 예제 코드는 git repo에 공개되어 있습니다. 

예제 목표

 

3.2 코드 작성

먼저 ingress 값들을 테라폼 변수로 설정합니다.

variable "security_group_ingress" {
  type = map(object({
    description = string
    protocol    = string
    from_port   = string
    to_port     = string
    cidr_blocks = list(string)
  }))
}

 

테라폼 변수 초기화 값은 terraform.tfvars를 사용합니다. 기존 resource block ingress 인자 값을 사용했습니다.

security_group_ingress = {
  http = {
    description = "http"
    protocol    = "tcp"
    from_port   = "80"
    to_port     = "80"
    cidr_blocks = ["0.0.0.0/0"]
  },
  https = {
    description = "https"
    protocol    = "tcp"
    from_port   = "443"
    to_port     = "443"
    cidr_blocks = ["0.0.0.0/0"]
  },
  ssh = {
    description = "ssh"
    protocol    = "tcp"
    from_port   = "22"
    to_port     = "22"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

 

ingress 인자를 dynamic block으로 변경합니다. block label은 ingress라고 설정합니다. for_each에는 정의한 변수를 사용하고, content에는 ingress label을 참조하여 변수 값에 접근합니다.

resource "aws_security_group" "main" {
  name        = "terraform-dynamicblock-test"
  description = "terraform-dynamicblock-test"
  vpc_id      = aws_vpc.main.id

  dynamic "ingress" {
    for_each = var.security_group_ingress
    content {
      description = ingress.value["description"]
      protocol    = ingress.value["protocol"]
      from_port   = ingress.value["from_port"]
      to_port     = ingress.value["to_port"]
      cidr_blocks = ingress.value["cidr_blocks"]
    }
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "terraform-dynamicblock-test"
  }
}

 

3.3 코드 실행

terraform apply명령어를 실행하여 테라폼 코드를 aws에 반영합니다.

terraform apply

 

aws 콘솔에서 security group이 의도한대로 생성되었는지 확인합니다.

 

3.4 예제 삭제

예제를 확인하고 terraform destroy명령어를 실행하여 생성한 aws리소스를 삭제합니다.

terraform destroy
반응형