본문 바로가기
DevOps

[T1014-이론] 3장 기본 사용법 (3)

by 서어켜엉 2024. 6. 20.
해당 내용은 cloudNet@ 팀의 가시다 님이 진행하는 테라폼 스터디 T101 4기에서 다룬 내용과 "테라폼으로 시작하는 IaC" (한빛미디어) 저서 내용을 정리한 것입니다.

 

6. 입력 변수 Variable

변수 선언 방식

  • 변수는 variable로 시작되는 블록으로 구성된다. 변수 블록 뒤의 이름 값은 동일 모듈 내 모든 변수 선언에서 고유해야 하며, 이 이름올 다른 코드 내에서 참조된다.
  • 테라폼 예약 변수 이름은 사용이 불가능하다.
    source, version, providers, count, for_each, lifecycle, depends_on, locals
# variable 블록 선언 예시
variable "<이름>" {
  <인수> = <값>
}

variable "image_id" {
  type = string
}
  • 변수 정의 시 사용 가능한 메타인수
    • default : 변수에 할당하는 기본값 정의
    • type : 변수에 허용되는 값 유형 정의
    • description : 입력 변수의 설명
    • validation : 변수 선언의 제약조건을 추가해 유효성 검사 규칙을 정의
    • sensitive : 민감한 변수 값임을 알리고 테라폼의 출력문에서 값 노출을 제한
    • nullable : 변수게 값이 없어도 됨을 지정

변수 유형

  • 기본 유형
    • string : 글자 유형
    • number : 숫자 유형
    • bool : true / false
    • any : 모든 유형이 허용됨
  • 집합 유형
    • list : 인덱스 기반 집합
    • map : 값 = 속성 기반 집합이며 키값 기준 정렬
    • set : 값 기반 집합이며 정렬 키값 기준 정렬
    • object : ({<인수 이름>=<유형>, …})
    • tuple : ([<유형>, …])
  • 변수 유형별 선언 예시
variable "string" {
  type = string
  description = "var string"
  default = "myString"
}

variable "number" {
  type = number
  default = 123
}

variable "boolean" {
  default = true
}

variable "list" {
  default = [
    "google",
    "vmware",
    "amazon",
    "microsoft"
  ]
}

variable "map" {
  default = {
    aws = "amazon",
    azure = "microsoft",
    gcp = "google"
  }
}

variable "set" {
  type = set(string)
  default = [
    "google",
    "vmware",
    "amazon",
    "microsoft"
  ]
}

variable "object" {
  type = object({ name = string, age = number })
  default = {
    name = "abc"
    age = 12
  }
}

variable "tuple" {
  type = tuple([string, number, bool])
  default = ["abc", 123, true]
}

# 변수 참조 output
output "list_index_0" {
  value = var.list.0
}

output "list_all" {
  value = [
    for name in var.list : upper(name)
  ]
}
  • 확인
terraform init && terraform plan && terraform apply -auto-approve
terraform state list

terraform output

 

유효성 검사

  • 테라폼 0.13.0 버젼부터 사용자 지정 유효성 검사가 가능하다.
  • 변수 블록 내에 validation 블록에서 조건인 condition이 지정되는 규칙이 true / false를 반환해야 하며, error_message는 condition 값의 결과가 false 인경우 출력되는 메세지를 정의한다.
  • regex 함수는 대상의 문자열에 정규식을 적용하고 일치하는 문자열을 반환하는데, 여기에 can 함수를 함께 사용하면 정규식에 일치하지 않는 경우의 오류를 검출한다
  • validation 블록은 중복으로 선언할 수 있다.
  • variable 유효성 검사 예시
variable "image_id" {
  type = string
  description = "The id of the machine image (AMI) to use for the server."
  
  validation {
    condition = length(var.image_id) > 4
    error_message = "The image_id value must exceed 4."
  }
  
  validation {
    condition = can(regex("^ami-". var.image_id)
    error_message = "The image_id value must start with \"ami-\"."
  }
}
terraform apply -auto-approve

 

변수 참조

variable은 코드 내에서 var.<이름> 으로 참조된다.

위 변수 유효성 검사 예시 코드에서 image_id 라는 이름의 variable(변수)를 아래 validation 블록에서 var.image_id 로 참조한 것을 보면 이해가 쉽다.

 

민감한 변수 취급

입력 변수의 민감 여부를 선언할 수 있다.

  • 민감한 변수 취급 코드 예시
variable "my_password" {
  default = "password"
  sensitive = true
}

resource "local_file "abc" {
  content = var.my_password
  filename = "{$path.module}/abc.txt"
}
terraform apply -auto-approve

my_password 라는 변수의 값을 민감한 변수 처리 했더니 출력할 때 실제 변수 값 대신에 (sensitive value)가 출력된다.

 

변수 입력 방식과 우선순위

  • variable의 목적은 코드 내용을 수정하지 않고 테라폼의 모듈적 특성을 통해 입력되는 변수로 재사용성을 높이는 데 있다.
  • 입력 변수라는 명칭에 맞게 사용자는 프로비저닝 실행 시에 원하는 값으로 변수에 정의할 수 있다.
  • 선언되는 방식에 따라 변수의 우선순위가 있으므로, 이를 적절히 사용해 로컬 환경과 서버 환경에서의 정의를 다르게 하거나, 프로비저닝 파이프라인을 구성하는 경우 외부 값을 변수에 지정할 수 있다.
  • 변수 우선 순위 코드 예시
    [우선순위 수준]의 숫자가 작을수록 우선순위도 낮다.

코드 변경 후 아래 방식으로 확인

terraform apply -auto-approve

terraform state show loacl_file.abc
cat abc.txt ; echo

 

[우선순위 수준 1] 실행 후 입력

variable "my_var" {}

resource "local_file" "abc" {
  content = var.my_var
  filename = "${path.module}/abc.txt"
}

 

[우선순위 수준 2] variable 블록의 default 값

variable "my_var" {
  default = "smlim"
}

resource "local_file" "abc" {
  content = var.my_var
  filename = "${path.module}/abc.txt"
}

 

[우선순위 수준 3] 환경 변수 (TF_VAR 변수 이름)

export TF_VAR_my_var=limsm
echo $TF_VAR_my_var

terraform apply -auto-approve

cat abc.txt ; echo

main.tf 코드 내에서 my_var 이란 변수의 default 값은 smlim 이다. 그리고 환경 변수 TF_VAR_my_var 에는 limsm 으로 지정했다. abc.txt 파일에는 우선순위가 높은 환경 변수의 값이 파일 content 로 들어가 있는 것을 확인할 수 있다.

 

[우선순위 수준 4] terraform.tfvars에 정의된 변수 선언

  • 루트 모듈의 main.tf 파일과 같은 위치에 terraform.tfvars 파일을 생성해 변수에 대한 값을 추가하고 앞서 선언한 변수 선언과 비교해 우선순위를 확인
echo 'my_var="smlim4"' > terraform.tfvars
cat terraform.tfvars

terraform apply -auto-approve

cat abc.txt ; echo

 

[우선순위 수준 5] *.auto.tfvars에 정의된 변수 선언

  • 파일명의 정렬에 따라 우선순위가 적용된다.
    뒤에 오는 순서의 파일이 우선순위가 높다.
    a.auto.tfvars 에 my_vars = "smlim5_a" 선언
    b.auto.tfvars 에 my_vars = "smlim5_b" 선언
    이 때 terraform apply 를 하면 abc.txt 파일에는 순서 상 뒤에 위치하는 b.auto.tfvars 안에 선언된 변수가 우선 적용되어 smlim_b 내용이 써진다.
# a.auto.tfvars 파일 생성
echo 'my_var="smlim5_a"' > a.auto.tfvars
ls *.tfvars

terraform apply -auto-approve

cat abc.txt ; echo


# b.auto.tfvars 파일 생성
echo 'my_var="smlim5_b"' > b.auto.tfvars
ls *.tfvars

terraform apply -auto-approve

cat abc.txt ; echo

 

[우선순위 수준 6] *.auto.tfvars.json에 정의된 변수 선언

  • *.auto.tfvars와 같이 파일명의 정렬에 따라 우선 순위가 적용된다.
# a.auto.tfvars.json 파일 생성
cat <<EOF > a.auto.tfvars.json
{
  "my_var" : "smlim_a"
}
EOF
ls *.tfvars ; ls *.json

terraform apply -auto-approve

cat abc.txt ; echo


# c.auto.tfvars.json 파일 생성
cat <<EOF > c.auto.tfvars.json
{
  "my_var" : "smlim_c"
}
EOF
ls *.tfvars ; ls *.json

terraform apply -auto-approve

cat abc.txt ; echo

 

[우선순위 수준 7] CLI 실행 시 -var 인수에 지정 또는 -var-file로 파일 지정

  • 여러 인수가 선언되는 경우 나중에 선언된 변수가 우선순위가 높다.
#
terraform apply -auto-approve -var=my_var=smlim7
cat abc.txt ; echo

#
terraform apply -auto-approve -var=my_var=smlim7 -var=my_var=smlim8
cat abc.txt ; echo
  • *.tfvars와 같은 형식의 내용의 파일이라면 -var-file로 지정할 수 있다.
# myvar.txt 파일 생성
echo 'my_var="smlim9"' > myvar.txt

#
terraform apply -auto-approve -var=my_var=smlim7 -var-file="myvar.txt"
cat abc.txt ; echo

myvar.txt 파일에 선언된 변수가 뒤에 지정되었으므로 우선순위가 높다.