Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Terraform에서 Map 타입 변수의 사용

Terraform으로 AWS 리소스를 사용하면서 점점 변수를 많이 사용하게 된다. Terraform으로 리소스를 생성하면 그 리소스의 이름으로 참조할 수 있지만 모든 리소스를 다 Terraform으로 관리할 수 있는 것은 아니다. 경험했을 때는 사용자 이름이나 AMI 이름 등이 대표적이다.

resource "aws_instance" "demo" {
  ami = "ami-785c491f"
  instance_type = "t2.micro"
}

EC2 인스턴스를 위처럼 정의할 수 있는데 여기서 ami-785c491f는 Ubuntu Server 16.04 LTS (HVM) 이지만 이 AMI 아이디만으로는 알기가 어려우므로 이렇게 사용한다면 주석으로 어떤 AMI 인지를 적어두는 것이 차후에 관리하기가 좋을 것이다.

resource "aws_instance" "demo" {
  ami = "ami-785c491f" # Ubuntu Server 16.04 LTS (HVM)
  instance_type = "t2.micro"
}

일회성의 경우 애매하기는 하지만 가능하면 아래처럼 변수를 사용하는 것이 더 좋다고 생각한다.

variable "ubuntu_ami" {
  default = "ami-785c491f"
  description = "Ubuntu Server 16.04 LTS (HVM)"
}

resource "aws_instance" "demo" {
  ami = "${var.ubuntu_ami}"
  instance_type = "t2.micro"
}

변수를 사용하는 경우 쉽게 어떤 AMI를 사용하는지(이름을 잘 지어야겠지만) 알 수 있고 여러 곳에서 사용하는 경우 한 번에 이미지를 바꾸는 것도 가능하다.

여기서는 변수에 특정 값을 할 당했는데 Terraform의 변수는 맵을 지원하기 때문에 맵을 사용해서 여러 값을 넣는 것도 가능하다.

variable "ubuntu_ami" {
  default = {
    us-east-1 = "ami-d15a75c7"
    us-west-2 = "ami-8b92b4ee"
    ap-northeast-1 = "ami-785c491f"
    ap-northeast-2 = "ami-94d20dfa"
  }
  description = "Ubuntu Server 16.04 LTS (HVM)"
}

여러 리전을 사용하는 경우 하나의 변수를 Map으로 정의해서 리전 별로 지정하면 var.ubuntu_ami["ap-northeast-1"]와 같이 참조할 수 있고 사용할 때도 의미를 알기 쉬워서 아주 좋다.

variable "availability_zones" {
  type = "map"
  default = {
    "eu-west-1" = "eu-west-1a,eu-west-1b,eu-west-1c"
    "us-west-1" = "us-west-1b,us-west-1c"
    "us-west-2" = "us-west-2a,us-west-2b,us-west-2c"
    "us-east-1" = "us-east-1c,us-west-1d,us-west-1e"
  }
}

위처럼 Availability Zones을 리전별로 정의해 놓고 참조해서 사용하는 것도 가능하다. 맵에서 키를 찾는 lookup함수를 제공하므로 var.availability_zones["us-east-1"]대신 아래와 같이 값을 가져올 수도 있다.

> lookup(var.availability_zones, "us-east-1")
us-east-1c,us-west-1d,us-west-1e

Availability Zones는 배열로 만들어서 사용하고 싶다면 split을 사용하면 배열로 변환해서 할당할 수 있다.

> split(",", lookup(var.availability_zones, "us-east-1"))
[
  us-east-1c,
  us-west-1d,
  us-west-1e
]


2017/07/30 21:27 2017/07/30 21:27