DevOps/Terraform

[Terraform] 연관된 변수들을 연쇄적으로 참조하기

TTOII 2022. 4. 22. 17:45
728x90

✔️ 변수의 연쇄 참조

인스턴스의 리전을 정하는 variable 블록을 보자
variable.tf

variable "aws_region" {
  description = "AWS Region"
  type        = string
  default     = "ap-northeast-1"
}

리전의 값은 string type이며
default의 값만 바꾸면 ec2 인스턴스를 배치할 리전을 변경할 수 있다.

 

aws ec2 인스턴스를 배치 시킬 때 가용 영역을 인스턴스에 직접 정의하는 방식보다는
어떤 서브넷에 배치 시킬 것이냐를 결정하면 어떤 가용영역에 배치될 것인지가 결정되는 경우가 많다.
즉 가용 영역이 아닌 서브넷에 의해 배치되는 경우가 많다.

 

variable.tf

variable "aws_availability_zone" {
  description = "AWS AZs"
  type        = map(string)
  default = {
    ap-northeast-1 = "ap-northeast-1c"
    ap-northeast-2 = "ap-northeast-2c"
    ap-northeast-3 = "ap-northeast-3c"
  }
}

맵의 값 타입은 string 타입이다.
default 값도 map 타입이므로 {}를 사용해야 하며 가용 영역을 선언한다.

 

메인 파일로 넘어가보자
main.tf

AZ = var.aws_availability_zone["ap-northeast-1"]
AZ = var.aws_availability_zone.ap-northeast-1
AZ = var.aws_availability_zone.[aws_region]

가용 영역을 다음과 같이 정의하면 [ ] 안에 들어가는 값에 따라 가용 영역이 변경된다.

여기에 가용 영역을 직접 입력하는 것보다 aws_region 값을 참조하도록 변경한다.

 

이렇게 했을 때의 장점은 변수를 하나만 변경해도 연관되어 있는 변수들이 연쇄적으로 변경된다는 것이다.

 

다음은 연쇄적으로 참조할 수 있도록 변경한 파일이다.

variable.tf

variable "aws_region" {
  description = "AWS Region"
  type        = string
  default     = "ap-northeast-1"
}

variable "aws_availability_zone" {
  description = "AWS AZs"
  type        = map(string)
  default = {
    ap-northeast-1 = "ap-northeast-1c"
    ap-northeast-2 = "ap-northeast-2c"
    ap-northeast-3 = "ap-northeast-3c"
  }
}

main.tf

availability_zone = var.aws_availability_zone[var.aws_region]

다시 설명하면 aws_region variable 블록의 default 값이 ap-northease-1로 설정되어 있고
main.tf 에서 그 값을 참조하여 aws_availability_zone 값을 ap-northease-1c 로 정하고 있다.

따라서 만약 aws_region의 default 값을 ap-northease-2로 변경한다면 main.tf 에서 따로 값을 변경할 필요 없이 aws_availability_zone의 값을 자동적으로 ap-northease-2c로 정할 것이다.

테라폼에서는 이러한 기법을 많이 사용한다.

 

추가로 이미지 변경도 진행해보자 

같은 이미지라도 리전에 따라 id가 다 다르다.
따라서 리전을 변경할 때마다 사용할 이미지의 id도 같이 변경해주는 것이 효율적이다.
variable.tf

variable "aws_region" {
  description = "AWS Region"
  type        = string
  default     = "ap-northeast-1"
}

variable "aws_availability_zone" {
  description = "AWS AZs"
  type        = map(string)
  default = {
    ap-northeast-1 = "ap-northeast-1c"
    ap-northeast-2 = "ap-northeast-2c"
    ap-northeast-3 = "ap-northeast-3c"
  }
}

variable "aws_amazon_linux_ami" {
  description = "Amazon Linux 5.10 AMI Image"
  type        = map(string)
  default = {
    ap-northeast-1 = "ami-0bcc04d20228d0cf6"
    ap-northeast-2 = "ami-02e05347a68e9c76f"
    ap-northeast-3 = "ami-0fe7b77eb0549da6c"
  }

}

앞선 예시와 마찬가지로 리전이 변경됨에 따라 ami의 id가 변경되도록 만들고 main.tf 파일에 다음과 같이 선언하면 aws_region의 값만을 변경하여 사용할 이미지를 변경할 수 있다.

 

그리고 자주 변경할 가능성이 있는 변수(ex. aws_region)를 terraform.tfvars 파일에 분리하면
변수를 몇개만 조작해도 다양한 리소스를 생성할 수 있다.
terraform.tfvars

instance_name = "MyInstance"

aws_region = "ap-northeast-2"
728x90