Ssoon

Chapter (03) 기본 사용법 - HCL - 데이터 소스 / Variable 본문

Terraform 101 Study 2기

Chapter (03) 기본 사용법 - HCL - 데이터 소스 / Variable

구구달스 2023. 7. 10. 23:35
CloudNet@ 가시다님이 진행하는 Terraform 101 Study 2기
"테라폼으로 시작하는 IaC" (한빛미디어) 도서로 진행!

데이터 소스

  • 테라폼으로 정의되지 않은 외부 리소스 또는 저장된 정보를 테라폼 내에서 참조할 때 사용합니다.

🧿 데이터 소스 구성

  • date 로 시작하고 "데이터 소스 유형"을 정의합니다.
date "local_file" "abd" {
	filename = "${path.module}/abc.txt"
}

🧿 데이터 소스 속성 참조

 데이터 소스 인수의 선언

data "<리소스 유형>"	"<이름>" {
	<인수> = <값>
}

✔ 데이터 소스 참조 방식

date.<리소스 유형>.<이름>.<속성>
  • 인수 (Argument) : 데이터 소스로 가져오기 위한 조건
  • 속성 (Attribute) : 가져온 데이터 소스의 내용
resource "local_file" "abc" {
  content  = ""
  filename = "${path.module}/abc.txt"
}

data "local_file" "abc" {
  filename = local_file.abc.filename
}

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

data.local_file.abc  =(참조)=>  local_file.abc 의 파일 이름

리소스 local_file.def =(참조)=> data.local_file.abc.content 로 읽어진 데이터

 

✅ Variable

  • 인프라 구성에 필요한 속성 값을 정의 -> 코드의 변경 없이 여러 인프라를 생성
  • Plan 수행 시 값을 입력합니다.

🧿 변수 선언 방식

  • variable 로 시작하는 블록으로 구성됩니다.
  • 변수 블록 뒤의 이름 값은 고유해야 합니다. -> 이 이름을 다른 코드에서 참조합니다.
variable "이름" {
	<인수> = <값>
}

variable "image_id" {
	type = string
}

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

  • default : 변수에 할당되는 기본값 정의
  • type : 변수에 허용되는 값 유형 정의
  • description : 입력 변수의 설명
  • validation :  변수 선언의 제약조건을 추가하여 유효성 검사 규칙 정의
  • sensitive : 민감한 변수 값임을 알리고 출력문 노출 제한
  • nullable : 변수 값이 없어도 됨

🧿  변수 유형

기본 유형

  • string : 글자 유형
  • number : 숫자 유형
  • bool : true 또는 false
  • any : 명시적 모든 유형 허용됨을 표시
variable "string" {
  type = string
  description = "var String"
  default = "myString"
}

variable "number" {
  type = number
  default = 123
}

variable "boolean" {
  default = true
}

집합 유형

  • list (<유형>) : 인덱스 기반 집합
  • map (<유형>) : 값=속성 기반 집합, 키값 기준 정렬
  • set (<유형>) : 값 기반 집합, 정렬 키값 기준 정렬
  • object  ({<인수이름>=<유형>,...})
  • tuple  ([<유형>...])
variable "list" {
  default = [
    "google",
    "vmware",
    "amazon"
  ]
}

variable "map" {	# Sorting
  default = {
    aws = "amazon",
    azure = "microsoft"
  }
}

variable "set" {	# Sorting
  type = set(string)
  default = [
    "google",
    "vmware"
  ]
}

variable "object" {
  type = object({name=string, age=number})
  default = {
    name = "abc"
    age = 12
  }
}

variable "tuple" {
  type = tuple([string, number, bool]}
  default = ["abc", 123, true]
}

🧿 유효성 검사

  • 변수 블록 > validation 블록 > condition > 지정 규칙이 true 또는 false를 반환
  • error_message : condition 값의 결과가 false인 경우 출력
  • regex
    • 대상의 문자열에 정규식 적용 -> 일치하는 문자열을 반환
    • can 함수 사용 -> 정규식 일치하지 않는 경우 -> 오류 검출
variable "image_id" {
  type = string

  validation {
    condition = length(var.image_id) > 4
    error_message = "ERROR"
  }
  
  validation {
    condition = can(regex("^ami=", var.image_id))
    error_message = "ERROR"
  }
}

🧿 변수 참조

  • var.<이름> 으로 참조합니다.
variable "my_password" {}

resource "local_file" "abc" {
  content = var.my_password
  filename = "${path.module}/abc.txt"
}
  • variable에 정의된 값이 없음 -> terraform plan 이후 변수 값 입력 항목 출력
  • 입력받은 값으로 terraform plan을 수행합니다.

🧿 민감한 변수 취급

  • terraform plan 실행 시 참조되는 변수 값 password 가 출력되지 않습니다.
variable "my_password" {
  default = "password"
  sensitive = true
}

resource "local_file" "abc" {
  content = var.my_password
  filename = "${path.module}/abc.txt"
}
  • 하지만, terraform.tfstate 파일에는 평문으로 기록됩니다.

🧿 변수 입력 방식과 우선순위

  • variablr 의 목적
    • 코드 내용을 수정하지 않고 테라폼 모듈적 특성을 통해 입력되는 변수로 재사용
  • 선언하는 방식에 따라 변수의 우선순위가 있습니다 
variable "my_var" {}

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

✔ 우선순위 1 - 실행 후 입력

✔ 우선순위 2 - variable 블록의 default 값

variable "my_var" {
  default = "var2"
}

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

✔ 우선순위 3 - 환경 변수 (TF_VAR)

✔ 우선순위 4 - terraform.tfvars 변수 선언

my_var = "var4"

✔ 우선순위 5 - *.auto.tfvars 변수 선언

  • 파일명의 정렬에 따라 우선순위가 적용됩니다.

✔ 우선순위 7 - CLI -var 인수 지정 또는 -var-file 파일 지정

🧿 선언 방식이 다양한 이유

테라폼 실행 환경, 실행 방식에 따라 입력 변수 값을 선언

              -> 동일한 코드로 다수의 프로비저닝을 수행하도록 디자인

 

.tfvars 파일에 변수를 미리 기입하면 변수 값을 하나의 파일에서 관리할수 있는 장점

Comments