ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Terraform Variable

    IaC/Terraform 기초 2023. 9. 19. 23:17

     

     

    이번엔 테라폼 Variable에 대해서 알아보겠습니다.

    variable은 테라폼에서 사용되는 변수입니다.

    다른 일반적인 개발 언어로 개발을 하셨던 분들은 변수가 무엇인지 다 아실 것이라고 생각합니다.

    혹시 모르시는 분들을 위해 간단하게 설명하면 변수는 값을 담는 그릇이라고 생각하시면 좋습니다.

     

    그럼 테라폼에서 변수는 어떤 역할을 하는거죠?

     

    변수는 값을 입력받아서 그 값을 담아서 전달할 수 있죠.

    테라폼에서 변수도 마찬가지입니다. 

    어떤 변수로 설정하면 하드코딩을 하지 않고

    외부의 값을 입력받아서 해당 값에 따라

    리소스의 생성 조건을 다양하게 변화시킬 수 있습니다.

     

    그럼 테라폼에 어떤 변수 타입이 있는지 코드로 간단하게 살펴봅시다.

     

    variable "cloudman_string" {
      type = string
      default = "cloudman"
    }
    
    variable "cloudman_number" {
      type = number
      default = "1234"
      description = "float64 data type from the Go. -1.8 * 10^308 ~ 1.8 * 10^308"
    }
    
    variable "cloudman_bool" {
      type = bool
      default = false
      description = "true/false"
    }
    
    variable "cloudman_list" {
      type = list(any)
      default = [ 0, "1" ]
    }
    
    variable "cloudman_map" {
      type = map(string)
      default = {
        "key" = "value"
      }
    }
    
    variable "cloudman_set" {
      type = set(string)
      default = [ "att1" ]
    }
    
    variable "cloudman_object" {
      type = object({
        name = string
        age  = number
      })
    }
    
    variable "cloudman_tuple" {
      type = tuple([ number ])
      default = [ 0 ]
    }
    
    variable "cloudman_any" {
      type = any
      default = "string"
    }

     

    type이 string, number 등 무언가 다른 개발 언어에서 봤던 변수와 비슷하죠?

    하나씩 알아보겠습니다.

     

    우선, string은 문자열을 담는 변수입니다. 

    "123", "가나다" 이런 식의 문자로 된 값들을 담을 수 있습니다.

     

    다음은 number인데요,

    테라폼이 Go 언어로 설계되었기 때문에 Go 언어의 float64 타입과 같은 최대값과 최소값을 가집니다.

     

    bool 타입은 true와 false를 값을 가질 수 있는 변수인데,

    조건문에서 활용될 수 있습니다.

    (기본적으로 테라폼에서는 주로 삼항연산자를 활용해 조건문을 만듭니다.)

     

    list는 순서가 있는 변수의 collection입니다.

    그래서 list 다음에 collection에 담길 변수의 타입을 지정할 수 있습니다.

     

    map은 다른 프로그램 언어에서와 마찬가지로 key-value 쌍을 갖는 변수의 collection입니다.

    다른 언어의 map과 마찬가지로 key는 unique한 값을 가집니다.

     

    set은 list와 비슷한 타입의 변수이지만, list와 달리 순서를 정할 수 없고

    set 안에 값들은 unique 하다는 특징이 있습니다.

     

    object는 객체인데요 여러가지 변수를 담는 더 큰 그릇으로 생각하면 됩니다.

    객체 안에 attribute라는 값에 이름과 데이터 타입을 정의할 수 있습니다.

     

    tuple은 list와 거의 비슷하지만 하나의 변수 타입만 담을 수 있는 collection입니다.

    collection인데 하나의 변수 타입만 있으면 tuple, 여러 변수 타입이 있으면 list로 보면 쉽습니다.

     

    마지막은 any인데요, 

    아무 값이나 다 담을 수 있는 변수 타입입니다.

    하지만 변수 타입의 에러를 일으킬 수 있기 때문에

    any보다는 변수의 타입을 정하여 사용하는 것이 좋습니다.

     

    이렇게 변수를 만들면 변수의 기본값을 default에 넣어서 지정할 수 있고,

    그 변수에 대한 설명을 description에 넣을 수 있습니다.

     

    variable로 정의한 값은 다음과 같이 다른 리소스를 생성할 때 입력받는 값으로 활용될 수 있습니다.

     

    resource "aws_s3_bucket" "cloudman_s3_sample_bucket" {
      bucket = var.cloudman_bucket_name
      bucket_prefix = "logs/"
      tags = {
        log = "yes"
        expired = "yes"
      }
    }

     

    var. 다음에 변수명을 입력하면 변수로 입력받은 값을

    리소스 생성 시에 넣어서 리소스의 attribute를 정할 수 있는 것이죠.

    기본값인 default 값을 정의한 변수는

    terraform plan이나 terraform apply에서 값을 입력하지 않으면 

    다음과 같이 값을 입력하라는 창이 뜨고 바로 plan이나 apply를 실행할 수 없습니다.

     

     

    그런데 만약 이렇게 입력해야 하는 값이 100개가 넘는다면 어떻게 해야 할까요?

    terraform plan으로 생성되는 리소스를 한번 확인하기 위해서 하나하나 다 입력을 해주어야 할까요?

    그러면 너무 비효율적이겠죠? (만약 그렇게 되었다면 테라폼의 모든 값은 하드코딩 되겠죠)

     

    그래서 terraform.tfvars.json이라는 이름의 파일을 만들어서 json으로 각 variable의 값을 정해주면

    variable을 하나하나 입력하지 않고 전체 json에서 읽어서 테라폼을 실행합니다.

     

    같은 폴더 내에 있다면 따로 테라폼을 실행할 때 경로를 지정하지 않아도 되고,

    만약 테라폼을 실행하는 테라폼 코드가 있는 위치와 다른 곳에 있다면

    -var-file="/path/to/terraform/tfvars/json" 과 같이

    tfvars.json 파일이 있는 위치를 경로로 지정할 수도 있습니다.

     

    지금까지 테라폼 variable에 대해서 알아보았습니다.

    'IaC > Terraform 기초' 카테고리의 다른 글

    Terraform Local  (0) 2023.09.20
    Terraform State Lock  (0) 2023.09.15
    Terraform Backend  (0) 2023.09.12
    Terraform Provider  (0) 2023.09.12
    Terraform Apply  (0) 2023.09.05
Designed by Tistory.