변수와 아웃풋

LizzyLee·2025년 1월 20일

Terraform

목록 보기
4/6
post-thumbnail

📖 학습 목표

✏️ 변수와 아웃풋의 목적과 원리를 이해한다!
✏️ 테라폼에서 변수를 생성하고 활용해보자!
✏️ 테라폼에서 아웃풋을 생성하고 활용해보자!


📢 변수 (Variables)

resource "google_compute_instance" "VM" {
	name = "VM"
	location = "us-central1-a"
}

resource "google_storage_bucket" "bucket" {
	name = "bucket"
	location = "us-central1-a"
  	storage_class = "standard"
}

지금까지 리소스에 대한 arguments 의 값들을 전부 하드 코딩하여 직접 코드 상에 적어주었다. 만약 해당 값들을 파라미터로 변경하여 런타임 상에서 그 값을 적용하고 싶다면 어떻게 해야할까?

코드 상에 있는 VM, bucket, us-central1-a, standard 값 모두 변수로 변경하여 런타임 상에서 값을 지정해 줄 수 있다! 변수에 대해서 알아보자!

변수란 무엇일까?

기본 문법 및 예제

//syntax
variable "variable_name" {
	type = <variable_type>
  	description = "<variable description>"
  	default = "<default value for variables>"
  	sensitive = true 
}

//example 
variable "variable_name" {
	type = string
  	description = "Region for the bucket"
  	default = "US"
  	sensitive = true 
}
  • "variable_name" 은 모듈 내에서 unique 한 값을 가져야한다.
  • type, description 등 여러 arguments 가 존재하나 모두 선택값이므로 {} 안에 아무런 값이 없어도 생성이 가능하다. 이 경우 테라폼이 자동으로 typedefault 값을 지정한다.

Arguments 종류 및 예제

  • type : 변수의 데이터 타입을 지정할 수 있다. 예: bool, number, string
  • default : 변수의 기본값을 의미한다. 같은 모듈 내에서 변수의 기본값을 사용하고 싶은 경우 [1] 과 같이 사용 할 수 있다.
// dir tree 
-- server /
	-- main.tf 
	-- outputs.tf 
	-- variables.tf 

// main.tf 
resource "google_storage_bucket" "mybucket1" {
	name = "<unique_nucket_name>"
  	location = "US"
  	storage_class = var.bucket_storage_class // [1]
}


// variables.tf 
variable "bucket_storage_class" {
	type = string 
  	default = "REGIONAL"
}
  • description : 변수에 대한 설명을 적을 수 있다. 문서화를 목적으로 주로 변수의 목적 또는 예상값을 적는데 사용한다.
  • sensitive : 커맨드 결과나 로그 파일에 기록되기에 다소 민감한 경우 sensitive 값을 설정할 수 있다. 오직 true 값만 설정할 수 있으며 설정할 경우 terraform plan 또는 terraform apply 사용 시 해당 변수의 값이 보이지 않게 된다.

변수값 설정 방법

variable 리소스를 생성하여 테라폼 내 변수를 생성하는 방법 및 관련 작동 방식에 대하여 공부했다. 변수를 설정했다면 런타임 내에서 변수값을 전달해주어야 한다. 이 방법에는 크게 네 가지 종류가 있다.

  • .tfvars 파일

    • 설명: .tfvars 파일을 생성하여 여러 변수값을 저장하고 버전을 관리한다.
    • 실행방법: tf apply -var-file my-vars.tfvars
  • CLI 옵션

    • 설명: CLI 옵션을 사용하여 빠르게 변수값을 설정하고 코드를 테스트 한다.
    • 실행방법: tf apply -var project_id="my-project
  • 환경 변수

    • 설명: 스크립트나 파이프라인에 테라폼을 사용하는 경우 환경 변수를 사용해 변수를 설정할 수 있다.
    • 실행방법:
      TF_VAR_project_id="my-project"
       tf apply
  • terraform.tfvars 파일

    • 설명

      • 변수값이 너무 많은 경우 terraform.tfvars 파일 을 생성하여 변수값을 설정할 수 있다.

      • .tfvars , .tfvars.json, .auto.tfvars, auto.tfvars.json 으로 끝나는 확장자 파일에 variables.tf 파일에서 정의해둔 변수의 값을 지정할 수 있다.

      • 예시)

        // dir tree 
        -- server / 
          -- main.tf 
          -- outputs.tf 
          -- terraform.tfvars 
          -- variables.tf 
          
        // terraform.tfvars
        // 변수의 값을 지정한다.
        mybucket_storage_class = "REGIONAL" 
        bucket_region = "US"
        
        // variables.tf 
        // 변수의 형태를 정의한다.
        variable "mybucket_storage_class" {
          type = string 
        }
        
        variable "bucket_region" {
          type = string 
        }
    • 실행방법: tf apply

우선순위

여러 방식을 통해 변수 값을 지정하는 경우 다음과 같은 우선순위를 통해 값이 지정된다.

  1. 환경 변수
  2. .tfvars 파일
  3. .tfvars.json 파일
  4. .auto.tfvars 또는 .auto.tfvars.json 파일 중 사전식 순서대로
  5. -var 옵션 또는 -var-file 옵션 중 명시된 순서대로

💡 값이 지정 안된 변수
값이 미지정된 변수의 경우 terraform plan 과 같은 커맨드 실행 시 CLI 에서 변수값을 지정하도록 프롬포트 창을 띄운다.

Best Practice

1. 자주 사용하는 값만 변수로 지정한다.

  • 공통된 값만 변수로 사용하고 너무 많은 값들을 변수로 설정하지 않는다.
  • 사용 사례를 생각해보고 정의하자.
  • 자주 수정할 일이 없는 값의 경우 변수로 지정하지 말자.

2. description 을 작성하자.
기록 및 관리의 목적으로 설명을 추가하는 것이 좋다.

3. 되도록 파일을 통해 변수값을 관리하자
CLI 로 변수값을 설정하는 방식은 임시적인 방편일 뿐이니 파일로 변수값을 작성하여 관리하는 것이 권장된다.

4. 알맞는 변수 이름을 생성하자.
변수의 이름을 통해 변수의 목적을 드러낼 수 있도록 하자

variable "ram_size_gb" {} // 권장 
variable "ram_size" {} // 비권장

📢 아웃풋 (Outputs)

아웃풋이란 무엇일까?

기본 문법 및 예제

//// syntax
output <label> {
	value = <resource_type>.<resource_name>.<attribute>
}

//// example 
// dir tree 
-- server / 
  -- main.tf 
  -- outputs.tf 
  -- variables.tf 

// main.tf 
resource "google_storage_bucket_objects" "picture" {
	self_link : // ... etc 
}

// outputs.tf
output "picture_URL" {
	value = google_storage_bucket_objects.picture.self_link // [1]
  	// .. etc 
}
  • 정의: 아웃풋이란 프로그래밍에서 return 값과 비슷하다고 볼 수 있다.
  • 목적:
    • 리소스 생성 완료 후, 생성된 리소스의 속성값을 출력한다.
    • root module 에서 생성된 리소스의 속성값을 child moudle에 전달한다.
  • 예시 설명:
    • 버킷을 생성한 후 특정 속성의 값을 output 값으로 출력할 수 있다.
    • [1] 과 같이 참조 syntax 를 통해 구현이 가능하다.

💡 output 키워드만 있다면 사실 상 어느 파일에 output 리소스를 생성해도 상관 없지만 코드의 관리 목적을 위해 주로 outputs.tf 파일에 작성한다.

Arguments 종류 및 예제

  • value (필수값) : 모듈을 사용하는 리소스에게 값을 리턴한다.
  • description : output 의 설명을 적는다. 주로 output 의 목적 및 예상값을 작성한다.
  • sensitive : 리턴하고자 하는 리소스의 속성값을 마스킹한다. 주로 패스워드와 같은 민감한 정보를 가리고자 할 때 사용한다.

💡 시스템적인 변수의 경우 직접 변수값을 설정하기보다 output 값을 사용하는 것을 권장한다.

💡 terraform output 커맨드를 사용하여 특정 프로젝트에 사용되는 모든 output 값을 도출할 수 있다.

Best Practice

1. 실제로 사용하는 값 또는 필요한 값만 output 값으로 사용한다.

예를 들어, 특정 VPC 에 서브넷 생성 시 필요한 것은 vpc id 이다. 따라서 vpc idoutput 값으로 설정하고 vpc name 등 기타 불필요한 부분들은 output 값으로 설정하지 않도록 한다.

2. 적절한 output 이름을 설정하고 이를 outputs.tf 파일에서 관리한다.

3. 민감한 정보의 경우 sensitive 값을 활성화 한다.
sql 패스워드 등 과 같이 민감한 정보는 직접 암호화 하기 보다 sensitive 옵션값을 설정한다.

0개의 댓글