tools
AWS에서 Amazon EBS 기반의 AMI를 생성하는 Packer 탬플릿 통해 Packer에 대해 이해도를 높여 봅시다. AWS의 Ubuntu 이미지를 기반으로, 단순히 "Hello, world!"
라는 문구를 파일에 저장하는 템플릿입니다.
source "amazon-ebs" "basic" {
ami_name = "hello-world-${timestamp()}"
instance_type = "t2.micro"
region = "us-east-1"
source_ami_filter {
filters = {
name = "ubuntu/images/*ubuntu-20.04-amd64-server-*"
root-device-type = "ebs"
virtualization-type = "hvm"
}
owners = ["099720109477"] # Canonical(우분투) 공식 계정
most_recent = true
}
ssh_username = "ubuntu"
}
build {
sources = ["source.amazon-ebs.basic"]
provisioner "shell" {
inline = [
"echo 'Hello, world!' > /tmp/hello.txt"
]
}
}
source
블록은 어떤 환경을 기반으로 AMI를 만들지 정의합니다. 여기서는 AWS의 amazon-ebs
타입을 사용하여 Ubuntu 20.04 LTS 기반의 인스턴스를 생성하고 빌드에 활용합니다.
ami_name
: AMI 이름. ${timestamp()}
를 사용해 빌드할 때마다 고유한 이름을 생성.instance_type
: 빌드 과정에서 사용할 인스턴스 타입 (t2.micro
).region
: 빌드가 진행될 AWS 리전 (us-east-1
).source_ami_filter
: 기준이 되는 AMI를 검색하는 조건.source_ami_filter.name
: Ubuntu 20.04 서버 이미지 패턴.source_ami_filter.root-device-type
: EBS 볼륨 사용.source_ami_filter.virtualization-type
: HVM 방식.source_ami_filter.owners
: Canonical 공식 계정 ID (099720109477
).source_ami_filter.most_recent
: 최신 버전 선택.ssh_username
: SSH 접속 계정 (ubuntu
).build
블록은 이미지를 만들고 후속 작업을 수행하는 단계를 정의합니다.
여기서는 source
에서 정의한 빌드 환경을 이용하여, 단순히 /tmp/hello.txt
파일에 "Hello, world!"
라는 문구를 작성합니다.
sources
: 사용할 source
블록 지정 (amazon-ebs.basic
).provisioner "shell"
: 빌드된 인스턴스 내부에서 실행할 스크립트나 명령.
여기서는 간단히 파일에 문자열을 저장하는 명령을 실행.이 Hello World 예제는 Packer의 가장 기본적인 동작 원리를 보여줍니다. source
블록에서 어떤 베이스 이미지를 기반으로 AMI를 만들지 정의하고, build
블록에서 간단한 프로비저닝 스크립트를 실행하여 결과 AMI에 원하는 변경 사항을 반영합니다. 실제 실행은 packer init .
→ packer validate .
→ packer build .
순서로 진행하며, 빌드가 완료되면 AWS 콘솔의 EC2 → AMI 메뉴에서 새로 생성된 이미지를 확인할 수 있습니다. 이런 기본 구조를 이해해두면 이후 멀티 클라우드 빌드, EKS 노드 AMI 커스터마이징, 보안 에이전트 사전 설치 같은 고급 시나리오로 쉽게 확장할 수 있습니다.