Ssoon
Chapter (03) 기본 사용법 - HCL - 데이터 소스 / Variable 본문
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 파일에 변수를 미리 기입하면 변수 값을 하나의 파일에서 관리할수 있는 장점
'Terraform 101 Study 2기' 카테고리의 다른 글
Chapter (03) 기본 사용법 - HCL - 반복문 (0) | 2023.07.10 |
---|---|
Chapter (03) 기본 사용법 - HCL - Local / Output (0) | 2023.07.10 |
Chapter (03) 기본 사용법 - HCL - Resource (0) | 2023.07.10 |
Chapter (03) 기본 사용법 - HCL - 블록 (0) | 2023.07.04 |
Chapter (03) 기본 사용법 - 주요 커맨드 (0) | 2023.07.04 |
Comments