1. Packer란?
Packer는 HashiCorp에서 개발한 오픈 소스 도구로, 단일 소스 구성에서 여러 플랫폼에 대한 동일한 머신 이미지를 자동으로 생성할 수 있습니다. AWS AMI, Azure Image, GCP Image, Docker Image, VMware 등 다양한 플랫폼을 지원하며, 인프라를 코드로 관리(Infrastructure as Code)하는 데 핵심적인 역할을 합니다.
1.1. Golden Image란?
Golden Image(또는 Base Image)는 운영 환경에서 사용할 서버의 기본 템플릿입니다. 필요한 패키지, 보안 설정, 모니터링 에이전트 등이 미리 설치되어 있어 새로운 서버를 빠르고 일관되게 배포할 수 있습니다.
1.2. Packer를 사용하는 이유
- 일관성: 동일한 설정의 이미지를 반복적으로 생성
- 자동화: 수동 작업 없이 CI/CD 파이프라인에 통합 가능
- 멀티 플랫폼: 하나의 템플릿으로 여러 클라우드 플랫폼용 이미지 생성
- 버전 관리: 이미지 구성을 코드로 관리하여 변경 이력 추적
2. Packer의 주요 개념
2.1. Template
- Packer의 구성 파일로, JSON 또는 HCL2 형식으로 작성합니다.
- 이미지를 어떻게 빌드할지 정의합니다.
2.2. Builder
- 특정 플랫폼용 이미지를 생성하는 컴포넌트입니다.
- 예:
amazon-ebs, azure-arm, googlecompute, docker 등
2.3. Provisioner
- 이미지에 소프트웨어를 설치하고 구성하는 컴포넌트입니다.
- 예:
shell, ansible, chef, puppet 등
2.4. Post-processor
- 빌드가 완료된 후 추가 작업을 수행합니다.
- 예: 이미지 압축, 업로드, 태깅 등
3. Packer 설치
3.1. macOS (Homebrew)
1
2
3
4
5
| ❯ brew tap hashicorp/tap
❯ brew install hashicorp/tap/packer
❯ packer version
Packer v1.11.2
|
3.2. Linux (Ubuntu/Debian)
1
2
3
4
5
6
| ❯ wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
❯ echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
❯ sudo apt update && sudo apt install packer
❯ packer version
Packer v1.11.2
|
3.3. Windows (Chocolatey)
1
2
3
4
| ❯ choco install packer
❯ packer version
Packer v1.11.2
|
4. Packer 사용 예시 (AWS AMI 생성)
AWS AMI를 생성하는 간단한 예시입니다. Ubuntu 기반 이미지에 Nginx를 설치하는 Golden Image를 만들어보겠습니다.
4.1. 디렉토리 구조
1
2
3
4
| packer-example/
├── aws-ubuntu.pkr.hcl
└── scripts/
└── setup.sh
|
4.2. Packer Template 작성 (aws-ubuntu.pkr.hcl)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| packer {
required_plugins {
amazon = {
source = "github.com/hashicorp/amazon"
version = "~> 1"
}
}
}
variable "aws_region" {
type = string
default = "ap-northeast-2"
}
variable "instance_type" {
type = string
default = "t3.micro"
}
variable "ami_name" {
type = string
default = "golden-image-ubuntu"
}
source "amazon-ebs" "ubuntu" {
ami_name = "${var.ami_name}-"
instance_type = var.instance_type
region = var.aws_region
source_ami_filter {
filters = {
name = "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"
root-device-type = "ebs"
virtualization-type = "hvm"
}
most_recent = true
owners = ["099720109477"] # Canonical
}
ssh_username = "ubuntu"
tags = {
Name = var.ami_name
Environment = "production"
Builder = "packer"
}
}
build {
sources = ["source.amazon-ebs.ubuntu"]
provisioner "shell" {
script = "scripts/setup.sh"
}
}
|
4.3. Provisioner 스크립트 작성 (scripts/setup.sh)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #!/bin/bash
set -e
echo "=== Updating system packages ==="
sudo apt-get update
sudo apt-get upgrade -y
echo "=== Installing Nginx ==="
sudo apt-get install -y nginx
echo "=== Installing monitoring tools ==="
sudo apt-get install -y htop curl wget vim
echo "=== Enabling Nginx service ==="
sudo systemctl enable nginx
echo "=== Cleaning up ==="
sudo apt-get clean
sudo rm -rf /var/lib/apt/lists/*
echo "=== Setup completed ==="
|
4.4. Packer 실행
4.4.1. 플러그인 초기화
1
2
3
| ❯ packer init aws-ubuntu.pkr.hcl
Installed plugin github.com/hashicorp/amazon v1.3.3 in "/Users/kkamji/.config/packer/plugins/..."
|
4.4.2. 템플릿 유효성 검사
1
2
3
| ❯ packer validate aws-ubuntu.pkr.hcl
The configuration is valid.
|
4.4.3. 이미지 빌드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| ❯ packer build aws-ubuntu.pkr.hcl
amazon-ebs.ubuntu: output will be in this color.
==> amazon-ebs.ubuntu: Prevalidating any provided VPC information
==> amazon-ebs.ubuntu: Prevalidating AMI Name: golden-image-ubuntu-1704700000
amazon-ebs.ubuntu: Found Image ID: ami-0c55b159cbfafe1f0
==> amazon-ebs.ubuntu: Creating temporary keypair...
==> amazon-ebs.ubuntu: Launching a source AWS instance...
amazon-ebs.ubuntu: Instance ID: i-0123456789abcdef0
==> amazon-ebs.ubuntu: Waiting for instance to become ready...
==> amazon-ebs.ubuntu: Using SSH communicator to connect: 54.180.xxx.xxx
==> amazon-ebs.ubuntu: Waiting for SSH to become available...
==> amazon-ebs.ubuntu: Connected to SSH!
==> amazon-ebs.ubuntu: Provisioning with shell script: scripts/setup.sh
amazon-ebs.ubuntu: === Updating system packages ===
amazon-ebs.ubuntu: === Installing Nginx ===
amazon-ebs.ubuntu: === Installing monitoring tools ===
amazon-ebs.ubuntu: === Enabling Nginx service ===
amazon-ebs.ubuntu: === Cleaning up ===
amazon-ebs.ubuntu: === Setup completed ===
==> amazon-ebs.ubuntu: Stopping the source instance...
==> amazon-ebs.ubuntu: Waiting for the instance to stop...
==> amazon-ebs.ubuntu: Creating AMI golden-image-ubuntu-1704700000 from instance i-0123456789abcdef0
amazon-ebs.ubuntu: AMI: ami-0987654321fedcba0
==> amazon-ebs.ubuntu: Waiting for AMI to become ready...
==> amazon-ebs.ubuntu: Terminating the source AWS instance...
==> amazon-ebs.ubuntu: Cleaning up any extra volumes...
==> amazon-ebs.ubuntu: No volumes to clean up, skipping
Build 'amazon-ebs.ubuntu' finished after 5 minutes 23 seconds.
==> Wait completed after 5 minutes 23 seconds
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs.ubuntu: AMIs were created:
ap-northeast-2: ami-0987654321fedcba0
|
5. 주요 명령어 정리
| 명령어 | 설명 |
|---|
packer init | 필요한 플러그인 초기화 |
packer validate | 템플릿 문법 검증 |
packer fmt | 템플릿 포맷팅 |
packer build | 이미지 빌드 실행 |
packer build -var "key=value" | 변수 전달하며 빌드 |
packer build -var-file="vars.pkrvars.hcl" | 변수 파일 사용 |
6. 요약
이 포스트에서는 Packer의 개념과 주요 구성 요소를 살펴보고, 설치 방법과 AWS AMI를 생성하는 기본적인 사용 방법을 소개했습니다. Packer를 활용하면 Golden Image를 코드로 관리할 수 있어 일관된 인프라 환경을 구축하고, CI/CD 파이프라인에 통합하여 이미지 빌드를 자동화할 수 있습니다.
7. Reference
궁금하신 점이나 추가해야 할 부분은 댓글이나 아래의 링크를 통해 문의해주세요. Written with KKamJi