[Terraform] 모듈과 지역 변수

업데이트:     Updated:

카테고리:

태그:

🎯모듈과 지역 변수

입력 변수를 사용하여 모듈의 입력을 정의하는 것도 좋지만 중간에 계산을 수행하거나 코드가 중복되지 않게끔 모듈에서 변수를 정의하는 방법이 필요합니다. 하지만 해당 변수를 입력으로 노출하지 않으려면 어떻게 해야 할까요?

locals 블록

예를 들어, modules/services/webserver-cluster/main.tf의 webserver-cluster 모듈에 있는 로드 밸런서는 HTTP의 기본 포트인 80 포트로 리스닝합니다. 이 포트 번호는 현재 로드 밸런서 리스너를 포함하여 여러 곳에 하드 코딩되어 있습니다.

resource "aws_lb_listener" "http" {
  load_balancer_arn = aws_lb.example.arn
  port              = 80
  protocol          = "HTTP"

  default_action {
    type = "fixed-response"

    fixed response {
      content_type = "text/plain"
      message_body = "404: page not found"
      status_code  = 404
    }
  }
}

resource "aws_security_group" "alb" {
  name = "${var.cluster_name}-alb"

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

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

aws_security_group 리소스에는 CIDR 블록과 포트, 프로토콜을 의미하는 값이 모두 하드 코딩되어 있습니다. 이러한 값을 여러 곳에 하드 코딩하여 적용하면 코드를 읽고 유지하기가 어려워집니다. 입력 변수로 값을 추출할 수도 있지만 이 경우에는 locals 블록에서 로컬 값으로 정의하면 됩니다.

locals {
  http_port    = 80
  any_port     = 0
  any_protocol = "-1"
  tcp_protocol = "tcp"
  all_ips      = ["0.0.0.0/0"]
}

로컬 값은 모듈 전체에서 해당 이름으로 사용할 수 있습니다. 이러한 이름은 모듈 내에서만 표시되므로 다른 모듈에는 영향을 미치지 않으며, 모듈 외부에서 이 값을 재정의할 수 없습니다. 로컬 값을 읽으려면 다음 구문으로 된 로컬 참조를 사용해야 합니다.

local.<NAME>

이 구문을 사용하여 로드 밸런서의 리스너와 보안 그룹을 업데이트하면 다음과 같습니다.

resource "aws_lb_listener" "http" {
  load_balancer_arn = aws_lb.example.arn
  port              = local.http_port
  protocol          = "HTTP"

  default_action {
    type = "fixed-response"

    fixed response {
      content_type = "text/plain"
      message_body = "404: page not found"
      status_code  = 404
    }
  }
}

resource "aws_security_group" "alb" {
  name = "${var.cluster_name}-alb"

  ingress {
    from_port   = local.http_port
    to_port     = local.http_port
    protocol    = local.tcp.protocol
    cidr_blocks = local.all_ips
  }

  egress {
    from_port   = local.any_port
    to_port     = local.any_port
    protocol    = local.any_protocol
    cidr_blocks = local.all_ips
  }
}

📌출처

Terraform Up & Running


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

terraform 카테고리 내 다른 글 보러가기

댓글남기기