본문 바로가기
DevOps

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

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

 

7. local 지역 값

코드 내에서 사용자가 지정한 값 또는 속성 값을 가공해 참조 가능한 local (지역값)은 외부에서 입력되지 않고, 코드 내에서만 가공되어 동작하는 값을 선언한다. 'local'은 입력 변수와 달리 선언된 모듈 내에서만 접근 가능하고, 변수처럼 실행 시에 입력받을 수 있다.

 

local 선언

  • 로컬이 선언되는 블록은 locals로 시작한다. 선언되는 인수에 표현되는 값은 상수만이 아닌 리소스의 속성, 변수의 값들도 조합해 정의할 수 있다.
  • 동일한 tf 파일 내에서 여러번 선언이 가능하고, 여러 파일에 걸쳐 만드는 것도 가능하다.
  • locals에 선언한 로컬 변수 이름은 전체 루트 모듈 내에서 유일해야 한다.
  • 정의되는 속성 값은 지정된 값의 형태에 따라 다양한 유형으로 정의할 수 있다.
  • 코드 예시
variable "prefix" {
  default = "hello"
}

locals {
  name = "terraform"
  content = "${var.prefix} ${local.name}"
  my_info = {
    age = 20
    region = "KR"
  }
  my_nums = [1, 2, 3, 4, 5]
}

locals {
  content = "content2"  # 중복 선언이므로 오류 발생
}
terraform init && terraform plan && terraform apply -auto-approve​

 

local 참조

  • 선언된 local 값은 local.<이름>으로 참조할 수 있다. 
  • 서로 다른 파일에 선언이 되어 있더라도 다른 파일에서 참조가 가능하다.
  • 코드 예시
# main.tf

variable "prefix" {
  default = "hello"
}

locals {
  name = "terraform"
}

resource "local_file" "abc" {
  content = local.content
  filename = "${path.module}/abc.txt"
}
# sub.tf
locals {
  content = "${var.prefix} ${local.name}"
}

main.tf 에서는 sub.tf에서 선언된 local.content를 참조.
sub.tf 에서는 main.tf 에서 선언된 local.name을 참조 하고 있다.

 

8. 출력 (output)

출력 값은 주로 테라폼 코드의 프로비저닝 수행 후의 결과 속성 값을 확인하는 용도로 사용된다.

또한 프로그래밍 언어에서 코드 내 요소 간에 제한된 노출을 지원하듯, 테라폼 모듈 간, 워크스페이스 간 데이터 접근 요소로도 활용할 수 있다.

 

output 선언

  • 모듈 내에서 선언되는 속성값들은 output 블록에 정의된다.
output "instance_ip_addr" {
  value = "http://${aws_instance.server.private_ip}"
}
  • 주의할 점은 output 결과에서 리소스 생성 후 결정되는 속성 값은 프로비저닝이 완료되어야 최종적으로 결과를 확인할 수 있고 terraform plan 단계에서는 적용될 값이 출력하지 않는다는 것이다.
  • 변수 정의 시 사용 가능한 메타인수는 다음과 같다.
    • description : 출력 값 설명
    • sensitive : 민감한 출력 값임을 알리고 테라폼의 출력문에서 값 노출을 제한
    • depends_on : value에 담길 값이 특정 구성에 종속성이 있는 경우 생성되는 순서를 임의로 조정
    • precondition : 출력 전에 지정된 조건을 검증
  • 예제 코드
resource "local_file" "t1014" {
  content  = "t1014-example"
  filename = "${path.module}/t1014.txt"
}

output "file_id" {
  value = local_file.t1014.id
}

output "file_abspath" {
  value = abspath(local_file.t1014.filename)
}
terraform init && terraform plan

plan 실행 시, 이미 정해진 속성은 출력을 예측하지만 아직 생성되지 않은 file_id 값은 값의 경우는 예측을 할 수 없다.

terraform apply -auto-approve

 

 

9. 반복문

list 형태의 값 목록이나 Key-Value 형태의 문자열 집합인 데이터가 있는 경우 동일한 내용에 대해 테라폼 구성 정의를 반복적으로 하지 않고 관리할 수 있다.

 

count

  • 리소스 또는 모듈 블록에 count 값이 정수인 인수가 포함된 경우 선언된 정수 값만큼 리소스나 모듈을 생성하게 된다.
  • count에서 생성되는 참조값은 count.index이며, 반복하는 경우 0부터 1씩 증가해 인덱스가 부여된다.
  • 코드 예시
resource "local_file" "t1014" {
  count    = 5
  content  = "t1014"
  filename = "${path.module}/t1014.txt"
}

output "filecontent" {
  value = local_file.t1014.*.content
}

output "fileid" {
  value = local_file.t1014.*.id
}

output "filename" {
  value = local_file.t1014.*.filename
}
terraform init && terraform plan
terraform apply -auto-approve

로컬 파일 생성이 5번 실행된 것을 확인할 수 있다.
파일명이 모두 똑같아서 t1014.txt 파일 하나만 생성되었다.

 

  • main.tf 파일 내용 수정 -> count 숫자 만큼 파일이 생성될 수 있도록 파일 이름 뒤에 count.index를 참조
resource "local_file" "t1014" {
  count    = 5
  content  = "t1014"
  filename = "${path.module}/t1014_${count.index}.txt"
}

output "filecontent" {
  value = local_file.t1014.*.content
}

output "fileid" {
  value = local_file.t1014.*.id
}

output "filename" {
  value = local_file.t1014.*.filename
}
terraform apply -auto-approve

 

count.index 참조값에 따라 0~4 숫자가 붙은 파일이 총 5개 생성된 것을 확인할 수 있다.

  • 때때로 여러 리소스나 모듈의 count로 지정되는 수량이 동일해야 하는 상황이 있다. 이 경우 count에 부여되는 정수 값을 외부 변수에 식별되도록 구성할 수 있다.
  • main.tf 파일 내용 수정 -> list 형태의 배열을 사용한 반복문 동작 구성
variable "names" {
  type    = list(string)
  default = ["a", "b", "c"]
}

resource "local_file" "t1014" {
  count   = length(var.names)  # variable names 길이
  content = "t1014"
  # 변수 인덱스에 직접 접근
  filename = "${path.module}/t1014-${var.names[count.index]}.txt"
}

resource "local_file" "t1015" {
  count   = length(var.names)  # variable names 길이
  content = local_file.t1014[count.index].content
  # element function 활용
  filename = "${path.module}/t1015-${element(var.names, count.index)}.txt"
}
terraform apply -auto-approve

names 변수에 담긴 리스트의 요소들이 하나씩 파일 이름 뒤에 붙어서 생성된 것을 확인할 수 있다.

  • 단, 모듈 내에 count 적용이 불가능한 선언이 있으므로 주의해야 한다.
    • provider 블록 선언부가 포함되어 있는 경우에는 count 적용이 불가능하다 → provider 분리
    • 또한 외부 변수가 list 타입인 경우 중간에 값이 삭제되면 인덱스가 줄어들어 의도했던 중간 값에 대한 리소스만 삭제되는 것이 아니라 이후의 정의된 리소스들도 삭제되고 재생성된다.