본문 바로가기

클라우드/테라폼(Terraform)

테라폼 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 변수 파일 정의

- *.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