Search
Duplicate
📒

[Terraform] 03-2. data, variable, local, output

상태
완료
수업
Terraform
주제
기본개념
4 more properties
참고

데이터 소스(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 파일 어느 곳에서나 가능하다.
보통 variables.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
복사
출력 값 확인