본문 바로가기
  • lakescript
스터디 이야기/Terraform

[T101] 2-3. Terraform - local & output

by lakescript 2024. 6. 18.

 

더보기

이 스터디는 CloudNet@에서 진행하는 T101 스터디를 참여하면서 공부하는 내용을 기록하는 블로그 포스팅입니다.

CloudNet@에서 제공해주는 자료들과 테라폼으로 시작하는 IaC 를 바탕으로 작성되었습니다.

 

local(지역 값)

코드 내에서 사용자가 지정한 값 또는 속성 값을 가공해 참조 가능한 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"
}

 

위의 코드에서 locals가 선언되었는데 두번째 locals에서 첫번째 locals에 정의된 content가 중복으로 선언되었으므로 아래와 같이 오류가 발생합니다.

 

 

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를 삭제하고 실행해보겠습니다. 

 

정상적으로 init과 apply가 진행되는 것을 확인하실 수 있습니다.

 

local의 참조

선언된 local 값은 local.<이름> 으로 참조할 수 있습니다. 테라폼 구성 파일을 여러 개 생성하여 작업하는 경우 서로 다른 파일에 선언되어 있더라도 다른 파일에서 참조할 수 있습니다.

 

main.tf 파일과 sub.tf 파일을 생성하여 참조 실습을 진행해보겠습니다.

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}"
}

 

terraform 실행

terraform init & terraform apply -auto-approve

 

main.tf의 content 내용 값으로 local.content를 참조하며, 해당 값은 다른 테라폼 구성 파일에 있지만 실행 시점에는 마치 하나의 구성 파일 처럼 올바로 표기되는 것을 확인할 수 있습니다. 

 

terraform state 확인

echo "local.content" | terraform console

 

 

위 실습 에제에서는 서로 다른 테라폼 구성 파일에서도 local 값을 참조할 수 있다는 것을 확인할 수 있지만, 관리 측면에서는 서로 참조하는 local 값이 파편화되어 유지 보수가 어려워질 수 있으므로 주의가 필요합니다.

 

실습 - aws iam 생성해보기

main.tf 파일 생성

provider "aws" {
  region = "ap-northeast-2"
}

locals {
  name = "mytest"
  team = {
    group = "dev"
  }
}

resource "aws_iam_user" "myiamuser1" {
  name = "${local.name}1"
  tags = local.team
}

resource "aws_iam_user" "myiamuser2" {
  name = "${local.name}2"
  tags = local.team
}

 

여기서 보셔야 할 것은 locals 블록입니다. myiamuser1과 myiamuser2 resource가 선언되었고 각 local에 name과 team을 참조합니다. 그러면 myiamuser1의 name에는 mytest1, team에는 {group=dev} 값이 들어가야 하고 myiamuser2의 name에는 mytest2, team에는 {group=dev}가 들어가야 합니다.

 

terraform init & plan

terraform init & terraform plan

 

terraform init과 plan을 실행하면 위의 사진처럼 실행 결과를 보여주게 됩니다. 위에서 설명한대로  myiamuser1의 name에는 mytest1, team에는 {group=dev} 값이 선언되었고, myiamuser2의 name에는 mytest2, team에는 {group=dev}값이 선언되었습니다.

terraform apply

terraform apply -auto-approve

 

terraform apply통해 실제 인프라에 배포해보겠습니다.

 

결과 확인

aws iam list-users | jq

 

위의 aws cli 명령어를 통해 iam user list를 출력해보도록 하겠습니다.

 

정상적으로 mytest1, mytest2가 생성된 것을 확인하실 수 있습니다.

 

 

terraform destory

terraform destory

 

실습이 끝난 후엔 항상 destroy 명령어를 통해 리소스를 제거해줍니다!

 


출력(output)

출력 값은 주로 테라폼 코드의 프로비저닝 수행 후의 결과 속성 값을 확인하는 용도로 사용됩니다. 프로그램이 언어에서 코드 내 요소 간에 확인이 가능하듯 테라폼 모듈 간, 워크스페이스 간 데이터 접근 요소로도 활용할 수 있습니다. 

 

출력 값의 용도

  • root module에서 사용자가 확인하고자 하는 특정 속성 출력
  • 자식 모듈의 특정 값을 정의하고 root module에서 결과를 참조
  • 서로 다른 root module의 결과를 원격으로 읽기 위한 접근 요소

이처럼 출력 값을 작성하면 단순한 디버깅을 넘어 속성 값을 노출하고 접근할 수 있어, 다수의 작업자 또는 팀 간 협업에 유용합니다.

 

선언

module내에서 생성되는 속성 값들은 output 블록에 정의된다.

ouput "instance_ip_addr" {
  value = "http://${aws_instance.server.private_ip}"
}

 

출력되는 값은 value의 값이며 테라폼이 제공하는 조합과 프로그래밍적인 기능들에 의해 원하는 값을 출력할 수 있습니다. 주의할 점은 output결과에서 리소스 생성 후 결정되는 속성 값은 프로비저닝이 완료되어야 최종적으로 확인할 수 있고 terraform plan 단계에서는 적용된 값을 출력하지 않습니다.

 

변수 정의 시 사용 가능한 메타 인수

description : 출력 값 설명

sensitive : 민감한 출력 값임을 알리고 테라폼의 출력문에서 노출 제한 - 디버깅 목적보다는 값을 노출시키지 않고 상위 모듈 또는 다른 모듈에서 참조하기 위해 활용

depends_on : value에 담길 값이 특정 구성에 종속성이 있는 경우 생성되는 순서를 임의로 조정

precondition : 출력 전에 지정된 조건을 검증

 

output 활용

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

output "fild_id" {
  value = local_file.abc.id
}

output "file_abspath" {
  value = abspath(local_file.abc.filename)
}

 

위와 같이 main.tf 파일을 작성하고 terraform plan을 실행합니다.

 

 

인수 값과 속성 값 출력 결과 차이를 확인해보겠습니다.

이미 정해진 속성(file_abspath) 에 대해서는 출력을 예측하지만아직 생성되지 않은 속성(file_id)에 대해서는 결과를 예측할 수 없으므로 terraform apply 실행 이후에 알 수 있다(known after apply)고 출력됩니다. 

 

 

위의 사진과 같이 apply후 프로비저닝 완료된 다음 속성 값이 출력됩니다.

terraform output

apply 실행 이후 구성 재적용 없이 마지막 결과로 표기되는 output을 다시 확인하고 싶은 경우에는 terraform output 명령어를 통해 확인할 수 있고, 원하는 값만 출력하는 것도 가능합니다.