tools

packer - Variable

Packer에서는 변수(variable)를 사용하여 AMI 이름, 리전, 인스턴스 타입 등 자주 변경될 수 있는 값을 코드에서 분리해 관리할 수 있습니다. 이를 통해 템플릿의 재사용성을 높이고, 환경별 설정을 쉽게 변경할 수 있습니다.

아래 예제는 AMI 이름(ami_name)과 AWS 리전(region)을 변수로 정의하고, 이를 source 블록에서 활용하는 방법을 보여줍니다.

packer
variable "ami_name" {
  default = "custom-ubuntu"
}
variable "region" {
  default = "us-east-1"
}
 
source "amazon-ebs" "with-vars" {
  ami_name      = "${var.ami_name}-${timestamp()}"
  region        = var.region
  instance_type = "t2.micro"
 
  source_ami_filter {
    filters = {
      name                = "ubuntu/images/*ubuntu-20.04-amd64-server-*"
      root-device-type    = "ebs"
      virtualization-type = "hvm"
    }
    owners      = ["099720109477"]
    most_recent = true
  }
 
  ssh_username = "ubuntu"
}
 
build {
  sources = ["source.amazon-ebs.with-vars"]
 
  provisioner "shell" {
    # 운영 시에는 베이스 이미지에 맞는 패키지 매니저(apt) 명령어를 사용해야 한다
    inline = ["sudo apt update && sudo apt install -y nginx"]
  }
}

variable 블록

  • variable: 재사용할 값을 정의하는 구문입니다.

  • default 값: 해당 변수가 별도로 지정되지 않았을 때 사용되는 기본값입니다.

  • 예제:

    • ami_name: AMI 이름 기본값을 "custom-ubuntu"로 설정
    • region: AWS 리전을 "us-east-1"로 설정

CLI 실행 시 -var 옵션을 사용하면 이 값을 덮어쓸 수 있습니다.

packer build -var "ami_name=myapp-ubuntu" -var "region=ap-northeast-2" template.pkr.hcl

source 블록

변수는 ${var.<변수명>} 형식으로 참조합니다.

  • ami_name: ${var.ami_name}-${timestamp()} → 변수 값에 빌드 시각을 붙여 AMI 이름 중복 방지
  • region: var.region을 직접 참조해 AWS 리전을 설정
  • 나머지 설정(instance_type, source_ami_filter, ssh_username)은 이전 예제와 동일하게 구성

build 블록

  • sources: amazon-ebs.with-vars 소스를 사용
  • provisioner "shell": 빌드된 환경에 Nginx를 설치하는 명령 실행
sudo apt update && sudo apt install -y nginx

sudo apt update && sudo apt install -y nginx는 Ubuntu 이미지를 기반으로 할 때만 정상 동작합니다. 예제의 source_ami_filter가 Ubuntu 20.04라서 문제는 없지만, Amazon Linux나 다른 베이스로 바뀌면 yum/dnf를 써야 합니다.


정리

이 예제는 Packer에서 변수를 활용해 템플릿의 유연성과 재사용성을 높이는 방법을 보여주며, 변수를 사용하면 환경별 차이를 손쉽게 반영할 수 있고 CLI의 -var 옵션이나 별도 변수 파일(.pkrvars.hcl)을 통해 값을 주입해 동일한 템플릿을 개발·스테이징·운영 등 다양한 환경에 일관되게 적용할 수 있습니다.


참고 자료