참고
데이터 소스(data)
NOTE
데이터 소스는 테라폼으로 정의되지 않는 외부 리소스 또는 저장된 정보를 테라폼 내에서 참조할 때 사용한다.
# Terraform Code
data "<리소스 유형>" "<이름>" {
<인수> = <값>
}
# 데이터 소스 참조
data.<리소스 유형>.<이름>.<속성>
YAML
복사
data로 시작하며, 이후 데이터 소스 유형을 정의한다.
data "aws_availability_zones" "available" { # 사용가능한 AZ목록 가져오기
state = "available"
}
resource "aws_subnet" "primary" { # e.g. ap-northeast-2a
availability_zone = data.aws_availability_zones.available.names[0]
}
resource "aws_subnet" "secondary" { # e.g. ap-northeast-2b
availability_zone = data.aws_availability_zones.available.names[1]
}
YAML
복사
리전 내에서 사용 가능한 가용영역 목록 가져오기
•
데이터 소스 유형은 1번째 언더스코어를 기준으로 프로바이더_리소스 유형을 의미한다.
•
데이터 소스 유형을 선얺나 뒤에는 고유한 이름을 붙인다. 리소스의 이름과 마찬가지로 이름은 동일한 유형에 대해 식별자 역할을 하므로 중복될 수 없다.
•
이름 뒤에는 데이터 소스 유형에 대한 구성인수들을 {}안에 선언한다. 인수가 필요하지 않은 유형도 있지만 그때에도 { }는 입력한다.
resource "local_file" "abc" { # abc 파일 생성
content = "123!"
filename = "${path.module}/abc.txt"
}
data "local_file" "abc"{ # 외부 abc 파일을 읽는다.
filename = local_file.abc.filename
}
resource "local_file" "def" { # data abc파일의 내용을 사용한다
content = data.local_file.abc.content
filename = "${path.module}/def.txt"
}
YAML
복사
실습코드
입력변수(variable)
NOTE
입력 변수는 인프라 구성에 필요한 속성 값을 정의하여 코드 변경 없이 여러 인프라를 생성하는 데 사용된다!
"입력"이라는 용어가 사용되는 이유는 일반적인 애플리케이션 코드에서의 변수 선언과는 다르게 테라폼에서는 Plan 실행 시 값을 입력하기 때문이다.
variable "string" { # string 타입
type = string
description = "var String"
default = "myString"
}
variable "number" { # number(숫자) 타입
type = number
default = 1234
}
variable "boolean" { # boolean 타입
default = true
}
variable "list" { # list 타입
default = [
"google",
"vmware",
"amazon",
"microsoft"
]
}
variable "map" { # map 타입
default = {
aws = "amazon",
azure = "microsoft",
gcp = "google"
}
}
variable "set" { # set 타입
type = set(string)
default = [
"google",
"vmware",
"amazon",
"microsoft"
]
}
variable "object" { # object 타입
type = object({
name=string, age=number
})
default = {
name = "abc"
age = 12
}
}
variable "tuple" { # tuple 타입
type = tuple([ string, number, bool ])
default = [ "abc", 123, true ]
}
YAML
복사
type종류
•
default
◦
변수를 선택 사항으로 만드는 기본 값
•
type
◦
변수에 허용되는 값 유형을 지정한다.
◦
string, number, bool, list(), set() ..
•
description
◦
입력 변수에 대한 설명
•
validation
◦
제약조건, 유효성 검사 설정
•
sensitive
◦
변수가 구성에 사용될 때 Terraform UI 출력을 제한한다.
•
nullable
◦
null 모듈 내에 있을 수 있는지 여부
variable "image_id" {
type = string
description = "AMI값은 서버에 사용한다."
validation { # variable 조건
condition = length(var.image_id) > 4
error_message = "이미지 ID값은 최소 4글자이상이다."
}
validation { # regex 정규식
condition = can(regex("^ami-", var.image_id))
error_message = "이미지 ID는 무조건 ami-로 시작한다."
}
}
Bash
복사
유효성 검사
variable "my_password" {}
resource "local_file" "abc" {
content = var.my_password # my_password 변수참조
filename = "${path.module}/abc.txt"
}
Bash
복사
변수 참조 (지정된 값이 없다면 실행시점에 입력)
variable "my_password" {
default = "password"
sensitive = true
}
resource "local_file" "abc" {
content = var.my_password # 변수사용
filename = "${path.module}/abc.txt"
}
Bash
복사
sensitive는 실행계획에서 감쳐진 변수값으로 나온다.
값이 가려져서 나옴
•
변수를 정의하는 파일은 .tf 파일 어느 곳에서나 가능하다.
•
변수 입력방식
NOTE
사용자는 프로비저닝 실행 시에 '입력 변수'라는 이름으로 원하는 값을 변수에 정의할 수 있어야 한다. 이를 적절히 활용하여 로컬 환경과 빌드 서버 환경에서의 정의를 다르게 할 수 있으며, 프로비저닝 파이프라인을 구성하는 경우 외부 파일에 변수를 저장할 수 있습니다.
variable "my_var" {} # my_var 값을 어디서 정의하는가?
resource "local_file" "abc" {
content = var.my_var
filename = "${path.module}/abc.txt"
}
YAML
복사
•
.tfvars, *.auto.tfvars, *.auto.tfvars.json 파일에 변수를 등록하고 사용할 수 있다.
•
terraform apply -var=my_var=var7 이와같이 CLI로 변수입력도 가능
지역 값(local)
NOTE
코드 내에서 사용자가 지정한 값 또는 속성 값을 가공해 참조 가능한 local은 외부에서 입력되지 않고 코드내에서만 가공되어 동작하는 값을 선언한다.
variable "prefix" {
default = "hello"
}
locals {
name = "terraform"
content = "${var.prefix} ${local.name}" # 입력변수, 로컬변수 사용
}
resource "local_file" "abc" {
content = local.content # 지역변수 참조
filename = "${path.module}/abc.txt"
}
Bash
복사
local은 입력변수와 달리 모듈 내에서만 접근 가능하다. (외부에서 사용하려면 output 사용해야함)
variable "prefix" {
default = "hello"
}
locals {
name = "terraform"
}
resource "local_file" "abc" {
content = local.content # sub.tf 참조
filename = "${path.module}/abc.txt"
}
Bash
복사
main.tf
locals {
content = "${var.prefix} ${local.name}"
}
Bash
복사
sub.tf
선언된 local값은 테라폼 구성 파일을 여러개 생성해 작업하는 경우 서로 다른 파일에 선언되어 있더라도 다른파일에서 참조할 수 있다.
출력(Output)
NOTE
출력 값은 주로 테라폼 코드의 프로비저닝 수행 후의 결과 속성 값을 확인하는 용도로 사용된다.
프로그래밍 언어에서 코드 내 요소간에 제한된 노출을 지원하듯, 테라폼 모듈 간, 워크스페이스 간 데이터 접근 요소로도 활용할 수 있다.
•
루트 모듈에서 사용자가 확인하고자 하는 특정 속성 출력
•
자식 모듈의 특정 값을 정의하고 루트 모듈에서 결과를 참조
•
서로 다른 루트 모듈의 결과를 원격으로 읽기 위한 접근 요소
output "instance_ip_addr"{
value = "http://${aws_instance.server.private_ip}"
}
YAML
복사
ex) aws 인스턴스 IP값 출력
•
description : 출력값 설명
•
sensitive : 민감한 출력값임을 알리고 출력문에서 값 노출 제한
•
depends_on : value에 담길 값이 특정 구성에 종속성이 있는 경우 생성되는 순서를 임의로 조정
•
precondition : 출력 전에 지정된 조건을 검증
resource "local_file" "abc" {
content = "abc123"
filename = "${path.module}/abc.txt"
}
output "file_id" {
value = local_file.abc.id # 파일의 ID
}
output "file_abspath" {
value = abspath(local_file.abc.filename) # 절대 경로
}
YAML
복사
실습코드
출력 값
terraform output file_id
terraform output -raw file_id
YAML
복사
출력 값 확인