본문으로 바로가기

[Terraform] local, variable, output, data 차이

category IT/AWS 2022. 2. 6. 22:27
반응형

Intro

Terraform에는 다양한 변수 개념이 존재합니다. 그것이 오늘 주인공인 local, variable, output, data 입니다. 오늘은 이 4가지 개념에 대해 설명하고 그 차이점을 알아 보도록 하겠습니다.

우선 제목은 local, variable, output, data 라고 표현하였는데, 좀 더 자세히 설명드리자면 변수(Variables)에는 크게 local, input, output이 있고 data 변수라기 보다는 resource에 가깝습니다. (여기서 resource는 실제로 인프라를 구성하는 ec2와 같은 것을 의미합니다.)

각각 설명 아래 테라폼 공식 URL을 적어두었으니 더욱더 자세한 설명을 확인하고 싶으신분들은 클릭하여 확인해보시기 바랍니다.

local variables

local 변수는 현재 실행 파일에서 사용되는 지역 변수 입니다. 주로 특정 값들을 연산하여 하나의 변수로 만들어야 할때 사용 됩니다. 아래와 같이 merge, concat, max 와 같은 함수를 사용하여 변수를 만들 수 있습니다.

  • main.tf 에 정의된 local 변수들 예시
locals {
    tags = merge(
            var.tags1,
            var.tags2,
              )

    instance_ids = concat(aws_instance.blue.*.id, aws_instance.green.*.id)

    max_subnet_length = max(
    length(var.public_subnets),
    length(var.private_subnets)
    )
}

참고 : https://www.terraform.io/language/values/locals

input variables

input 변수는 사용자의 입력을 받을 수 있는 변수 입니다. input 변수를 정의 할때 default 필드가 존재하지 않는 경우, 사용자에게 직접 입력을 받는 프롬프트를 발생시켜서 값을 받을 수 있습니다. 예를 들어 string 타입의 변수를 사용자에게 입력받아야 하는 경우, 다음과 같이 variable을 정의할 수 있습니다.

variable "image_id" {
  type = string
}

참고 : https://www.terraform.io/language/values/variables

output variables

output 변수는 terraform 수행 후 결과를 사용자에게 출력 해주는 변수 입니다. output 변수로 정의한 값은 외부로 노출 시켜주어 모듈간 리소스를 참고할 수 있도록 해줍니다.

output "instance_ip_addr" {
  value = aws_instance.server.private_ip
}

모듈A에서 만든 aws_vpc 정보를 모듈B에서 사용해야할때 모듈A에 output을 정의하면 해당 output 값이 state 파일에 기록이 되며 모듈B에서는 다음과 같이 값을 사용할 수 있습니다. moodule.<MODULE NAME>.<OUTPUT NAME>

https://www.terraform.io/language/values/outputs

Data source

Data source는 이미 생성되어있는 리소스를 가져와서 변수로 저장할때 사용됩니다. 예를들어 아래 예시와 같이 원하는 filter값을 설정하여 ami정보를 가져올 수 있습니다.

# Find the latest available AMI that is tagged with Component = web
data "aws_ami" "web" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:Component"
    values = ["web"]
  }

  most_recent = true
}

data 사용은 data.<TYPE>.<NAME>.<ATTRIBUTE> 과 같이 사용할 수 있습니다.

resource "aws_instance" "web" {
  ami           = data.aws_ami.web.id
  instance_type = "t1.micro"
}

https://www.terraform.io/language/data-sources

반응형