연재 시리즈

테라폼 시리즈 11편. 변수와 입력

악분 2022. 10. 22. 11:34
반응형

안녕하세요. 이 글은 테라폼스터디 1주차 내용을 정리했습니다.

 

1. 변수선언 방법

변수 variable BLOCK type을 사용하면 변수를 선언할 수 있습니다. 정의할 수 있는 속성은 테라폼 공식문서를 참고하시길 바랍니다.

terraform INPUT 공식문서: https://developer.hashicorp.com/terraform/language/values/variables#arguments
variable "<변수 이름>" {
  description = "변수 설명"
  type        = 변수타입
}

 

아래 예제는 server_port라는 변수이름을 선언했습니다. server_port 변수는 정수타입니다. 관례적으로 변수정의는 variables.tf파일에 저장합니다.

cat <<EOT > variables.tf
variable "server_port" {
  description = "The port the server will use for HTTP requests"
  type        = number
}
EOT

 

2. 변수 값 초기화 방법

변수를 정의하면 초기화를 해야 사용할 수 있습니다. 초기화 실습을 하기 위해 number타입을 갖는 server_port변수를 정의하겠습니다.

cat <<EOT > variables.tf
variable "server_port" {
  description = "The port the server will use for HTTP requests"
  type        = number
}
EOT

 

2.1 대화형(프롬프트 입력)

variable block을 정의한 후, terraform plan명령어를 실행하면 변수를 초기화하는 프롬프트 창이 나옵니다. 8080을 입력하면 server_port변수 값이 8080으로 설정됩니다.

terraform plan

 

2.2 환경변수 설정

프롬프트를 입력하지 않고 환경변수로 변수 값을 설정할 수 있습니다. TF_VAR_{변수 이름}으로 환경변수를 설정하고 환경변수 값에 초기화 할 값을 설정하면 됩니다. 환경변수 초기화 방법은 외부에 노출시키면 안되는 민감정보를 초기화 할 때 사용하면 좋습니다.

# 리눅스 환경변수 정의방법
export TF_VAR_server_port=8080

 

terraform plan명령어를 실행하면 변수 값이 설정되었기 떄문에, 프롬프트가 나오지 않습니다.

terraform plan

 

환경변수에 설정된 변수값을 사용하고 싶지 않으면 해당 환경변수를 삭제하면 됩니다.

# 리눅스 환경변수 삭제 방법
unset <환경변수 이름>

 

2.3 테라폼 명령어 인자

테라폼 명령어를 실행할 때 -var인자로 변수 값을 초기화 할 수 있습니다.

terraform plan -var "server_port=8081"

 

terraform plan명령어를 실행하면 변수 값이 설정되었기 떄문에, 프롬프트 창이 나오지 않습니다.

 

2.4 default값 설정

variable BLOCK TYPE을 정의할 때, 변수 default 값을 설정할 수 있습니다.

cat <<EOT > variables.tf
variable "server_port" {
  description = "The port the server will use for HTTP requests"
  type        = number
  default     = 8080
}
EOT

 

terraform plan명령어를 실행하면 변수 값이 설정되었기 떄문에, 프롬프트 창이 나오지 않습니다.

 

3. 변수 사용방법(입력, Input)

변수를 정의 했으니 변수를 사용해야겠죠? 테라폼 코드에서 변수사용은 리소스 입력으로 사용합니다. 그러므로 변수 사용방법은 테라폼 입력(INPUT) 공식문서에 자세히 설명되어 있습니다.

테라폼 입력 공식문서: https://developer.hashicorp.com/terraform/language/values/variables

 

3.1 리소스에서 변수참조

변수를 사용하는 방법은 테라폼 코드 리소스 참조와 비슷합니다. var.{변수이름}을 참조하면 변수를 사용할 수 있습니다.

 

아래 예제는 foo.bar라는 파일을 생성합니다. 파일 내용은 server_port변수 값입니다.

cat <<EOT > main.tf
variable "server_port" {
  description = "The port the server will use for HTTP requests"
  type        = number
  default     = 8080
}

resource "local_file" "foo" {
    content  = var.server_port
    filename = "foo.bar"
}
EOT

 

terraform init으로 local_file provider를 설치합니다. 그리고 terrforam apply명령어를 실행하면 foo.bar파일이 생성됩니다.

terraform init
terraform apply

 

foo.bar파일내용을 확인하면 server_port변수의 default값이 있습니다.

cat foo.bar; echo

 

3.2 리소스 속성 안에서 변수참조

리소스 속성 안에서 변수를 참조할 때는 바로 참조하지 못합니다. ${var.변수이름}으로 참조해야 합니다.

 

아래 예제는 content속성에서 server_port변수를 참조합니다.

cat <<EOT > main.tf
variable "server_port" {
  description = "The port the server will use for HTTP requests"
  type        = number
  default     = 8080
}

resource "local_file" "foo" {
    content  = <<-EOF
              #!/bin/bash
              echo "My Web Server - var test" > index.html
              nohup busybox httpd -f -p var.server_port &
              EOF
    filename = "foo.bar"
}
EOT

 

terraform apply명령어를 실행하면 foo.bar파일이 생성됩니다. foo.bar파일을 확인하면 예상했던 server_port변수 값이 설정되지 않고 server_port문자열이 그대로 초기화되었습니다.

terraform apply

 

main.tf파일을 수정해볼게요. content속성에 변수를 참조할 때, var.server_port를 ${var.server_port}로 수정합니다.

cat <<EOT > main.tf
variable "server_port" {
  description = "The port the server will use for HTTP requests"
  type        = number
  default     = 8080
}

resource "local_file" "foo" {
    content  = <<-EOF
              #!/bin/bash
              echo "My Web Server - var test" > index.html
              nohup busybox httpd -f -p ${var.server_port} &
              EOF
    filename = "foo.bar"
}
EOT

 

terraform apply명령어를 실행하고 foo.bar파일을 확인합니다. port값이 server_port변수 값으로 잘 초기화 되었습니다.

terraform apply

반응형