테라폼 Terraform 입력 변수
# Terraform 입력 변수
Ansible과 다르게 Terraform은 변수를 정의하는것 따로, 그 변수에 값을 할당하는것이 따로이다. 변수만 정의하는게 있고, 변수값을 할당하는것이 따로있다.
리전 정보, AMI 이미지 등 정보를 Terraform 구성파일 자체에 하드 코딩하는 방식은 Terraform구성파일의 재사용성, 팀 형태의 공유, Git 등의 버전 제어에 적합하지 않다. 따라서 변경 가능한 구성을 변수화 하는것이 좋다.
# 입력 변수 정의
variable 이라는 블록을 사용해서 변수를 정의한다.
- "region" : 변수명
- type : 입력 변수 값의 유형, 지정하지 않으면 모든 형태 가능 (type = string이면 문자열만 가능)
- default : 입력 변수의 기본값, 기본 값을 선언하지 않는 경우, 다른 방법으로 값을 제공해야 한다.
- description : 입력 변수의 설명
- validation : 입력 변수의 유효성 검사 규칙
- sensitive : 입력 변수가 사용될 때 출력 제한 (민감한 데이터)
type = list (string) 리스트 타입이고 그 리스트가 문자열(string)로 되어있다
[ list (목록) (,)있음 ]
type = map 딕셔너리
{ key="value" (,)없음 }
# 변수의 유형
기본 유형
- string : 텍스트 (""hello")
- number : 숫자 ( 525 )
- bool : 부울
복합 유형
- list / tuple : 목록 ( ["us-west-1a","us-westp1c"] )
- map / object : 키/값 ( {name = "ldh", age = 27} )
# 입력 변수에 값 할당
- *.tfvars 변수 파일 정의 ( 변수 = "값" )
- 쉘 환경 변수
- terraform 명령의 -var 옵션
# 변수 적용 순서
- terraform 명령의 -var, -var-file 옵션 -> 우선순위 제일 높다
- *.auto.tfvars 및 *.auto.tfvars.jason 변수 파일
- terraform.tfvars.jason 변수파일
- terraform.tfvars 변수파일
- 쉘 환경변수
# 입력 변수 사용
입력 변수는 var.<NAME>으로 사용 및 참조 할 수 있다.
var.ami_images[key] -> key에 대한 value가 참조된다.
# 입력 변수를 사용한 구성 파일
기존의 main.tf 파일에 정의 할 수도 있지만, 변수만 정의된 별도의 Terraform 구성 파일을 정하는 것이 좋다.
# 인스턴스 생성을 위한 구성파일
key도 변수 참조
# 입력 변수를 정의하기 위한 구성 파일
ap-northeast-1 , ap-northeast-2 같은 이미지인데 리전이 다르다.
# 변수 값을 정의하기 위한 변수 파일
region을 변경하면 이미지도 바뀐다.
# formatting , 유효성 검사
# 계획 확인
devops@control:~/aws-example$ vi main.tf
devops@control:~/aws-example$ vi varible.tf
devops@control:~/aws-example$ vi terraform.tfvars
devops@control:~/aws-example$ terraform fmt
varible.tf
devops@control:~/aws-example$ terraform validate
Success! The configuration is valid.
devops@control:~/aws-example$ cat main.tf
resource "aws_instance" "my_instance" {
ami = var.ami_image[var.aws_region]
instance_type = var.instance_type
tags = {
Name = "MyInstance"
}
}
resource "aws_eip" "my_eip" {
vpc = true
instance = aws_instance.my_instance.id
}
devops@control:~/aws-example$ cat varible.tf
variable "aws_region" {
description = "AWS region"
type = string
default = "ap-northeast-1"
}
variable "ami_image" {
description = "Ubuntu 20.04 LTS Image"
type = map(string)
default = {
ap-northeast-1 = "ami-09ff2b6ef00accc2e"
ap-northeast-2 = "ami-0b329fb1f17558744"
}
}
variable "instance_type" {
description = "EC2 instance type"
type = string
default = "t3.micro"
}
devops@control:~/aws-example$ cat terraform.tfvars
aws_region = "ap-northeast-2"
devops@control:~/aws-example$
devops@control:~/aws-example$ terraform plan