tools
Packer에서는 변수(variable)를 사용하여 AMI 이름, 리전, 인스턴스 타입 등 자주 변경될 수 있는 값을 코드에서 분리해 관리할 수 있습니다. 이를 통해 템플릿의 재사용성을 높이고, 환경별 설정을 쉽게 변경할 수 있습니다.
아래 예제는 AMI 이름(ami_name
)과 AWS 리전(region
)을 변수로 정의하고, 이를 source
블록에서 활용하는 방법을 보여줍니다.
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: 재사용할 값을 정의하는 구문입니다.
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
변수는 ${var.<변수명>}
형식으로 참조합니다.
${var.ami_name}-${timestamp()}
→ 변수 값에 빌드 시각을 붙여 AMI 이름 중복 방지var.region
을 직접 참조해 AWS 리전을 설정instance_type
, source_ami_filter
, ssh_username
)은 이전 예제와 동일하게 구성amazon-ebs.with-vars
소스를 사용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)을 통해 값을 주입해 동일한 템플릿을 개발·스테이징·운영 등 다양한 환경에 일관되게 적용할 수 있습니다.