"둘 다 AMI 만든다는 건 아는데, 실무에서 어느 걸 골라야 하죠?"
이 글이 그 질문에 답합니다.

🎯 이 글에서 다루는 것
- AWS Image Builder와 Packer의 핵심 개념 및 작동 방식 비교
- 사용 난이도와 학습 곡선 — 어느 쪽이 더 빨리 손에 익는가
- 실무 시나리오별 선택 기준 (CI/CD 파이프라인 통합, 멀티 클라우드, 컴플라이언스 환경)
- 보안·컴플라이언스 관점 차이
- 빌드 비용과 속도 비교
- 결론: 어떤 팀에 무엇이 맞는가
📌 도입 / 배경
AMI(Amazon Machine Image)는 EC2 인스턴스의 골든 이미지입니다. 어떤 설정이 들어간 인스턴스를 찍어두고, 이후 배포할 때마다 이 이미지를 기반으로 인스턴스를 찍어냅니다. Auto Scaling, Blue/Green 배포, 불변 인프라(Immutable Infrastructure) 전략 모두 골든 AMI 빌드 자동화가 전제입니다.
문제는 이 골든 이미지를 어떻게 만드느냐입니다.
AWS가 2019년 Image Builder를 출시하기 전까지, 대부분의 DevOps 팀은 HashiCorp의 Packer를 사용했습니다. 이제는 두 도구가 공존하고, 신규 프로젝트를 시작하는 팀마다 선택의 기로에 섭니다.
이 글은 두 도구를 단순히 나열하는 게 아니라, 실무 CI/CD 경험이 있는 엔지니어가 어느 쪽을 선택해야 하는지 명확한 기준을 제시하는 것을 목표로 합니다.

🔍 두 도구 개념 먼저 잡기
AWS Image Builder
AWS가 직접 만든 관리형 서비스입니다. 콘솔, CloudFormation, Terraform 등으로 파이프라인을 선언하면, AWS가 임시 EC2 인스턴스를 띄우고 → 컴포넌트(설치 스크립트)를 실행하고 → AMI를 생성하고 → 인스턴스를 종료하는 전 과정을 알아서 처리합니다.
핵심 구성 요소:
| 구성 요소 | 역할 |
| Recipe | 베이스 이미지 + 컴포넌트 조합 정의 |
| Component | 설치·설정 스크립트 단위 (YAML) |
| Pipeline | 빌드 스케줄 및 배포 대상 설정 |
| Distribution | 완성된 AMI를 어느 리전/계정에 배포할지 |
Packer
HashiCorp가 만든 오픈소스 CLI 도구입니다. JSON 또는 HCL2 파일로 빌드 구성을 정의하고, packer build 명령 하나로 실행합니다. AWS뿐 아니라 Azure, GCP, VMware, Docker 이미지까지 동일한 방식으로 만들 수 있습니다.
핵심 구성 요소:
| 구성 요소 | 역할 |
| Builder | 어떤 플랫폼에 이미지를 만들지 정의 (amazon-ebs 등) |
| Provisioner | Shell, Ansible, Chef 등으로 내부 설정 수행 |
| Post-processor | 빌드 후 처리 (Manifest 파일 생성, 태깅 등) |
| Variable | 빌드 파라미터화 (리전, AMI 이름, 버전 등) |
🔍 사용 난이도 / 학습 곡선
AWS Image Builder
초기 진입은 콘솔 기반이라 쉽게 느껴집니다. 하지만 이 편의함이 오래가지 않습니다.
컴포넌트 YAML 문법이 독자적이고, 빌드 실패 시 로그를 찾아 S3나 CloudWatch Logs로 들어가야 합니다. 로컬에서 미리 테스트할 방법이 없고, 컴포넌트 하나 수정해도 전체 파이프라인을 재실행해야 결과를 확인할 수 있습니다. 이는 반복 개발 주기(iteration)가 느리다는 의미입니다.
학습 난이도: 처음 3일은 쉽고, 이후 디버깅과 세밀한 제어에서 막힙니다.
Packer
CLI 기반이라 진입 장벽이 있지만, Terraform을 써본 DevOps 엔지니어라면 HCL2 문법이 익숙하게 느껴집니다. packer validate로 구문 검증, packer build -debug로 인터랙티브 디버깅이 가능합니다. 로컬에서 Docker builder로 프로비저너 스크립트를 먼저 검증한 뒤 AWS 빌드에 적용하는 패턴도 널리 쓰입니다.
# packer build 기본 구조 (HCL2)
packer {
required_plugins {
amazon = {
version = ">= 1.2.0"
source = "github.com/hashicorp/amazon"
}
}
}
variable "aws_region" {
type = string
default = "ap-northeast-2"
}
variable "app_version" {
type = string
}
source "amazon-ebs" "golden_ami" {
region = var.aws_region
instance_type = "t3.micro"
# 베이스 이미지: 최신 Amazon Linux 2023 자동 탐색
source_ami_filter {
filters = {
name = "al2023-ami-*-x86_64"
root-device-type = "ebs"
virtualization-type = "hvm"
}
owners = ["amazon"]
most_recent = true
}
ssh_username = "ec2-user"
ami_name = "my-app-golden-${var.app_version}-{{timestamp}}"
ami_description = "Golden AMI for my-app v${var.app_version}"
tags = {
Name = "my-app-golden"
Version = var.app_version
BuildDate = "{{timestamp}}"
ManagedBy = "Packer"
}
}
build {
sources = ["source.amazon-ebs.golden_ami"]
# 1단계: 시스템 업데이트
provisioner "shell" {
inline = [
"sudo dnf update -y",
"sudo dnf install -y amazon-cloudwatch-agent"
]
}
# 2단계: Ansible로 앱 설정
provisioner "ansible" {
playbook_file = "./ansible/app-setup.yml"
extra_arguments = [
"--extra-vars", "app_version=${var.app_version}"
]
}
# 3단계: 빌드 결과 매니페스트 저장 (다음 배포 단계에서 AMI ID 참조용)
post-processor "manifest" {
output = "manifest.json"
strip_path = true
}
}
학습 난이도: 첫 설정에 1~2일, 이후 Ansible·Shell 조합만 익히면 빠르게 확장됩니다.
🔍 실무 CI/CD 파이프라인 통합
이것이 가장 중요한 비교 지점입니다.
Packer + GitHub Actions
Packer는 CLI 도구이므로 파이프라인에서 단순히 명령 하나를 실행하면 됩니다. AMI ID는 manifest.json에 기록되어 후속 Terraform 배포 단계로 바로 넘길 수 있습니다.
# .github/workflows/build-ami.yml
name: Build Golden AMI
on:
push:
branches: [main]
paths:
- 'packer/**'
- 'ansible/**'
jobs:
build-ami:
runs-on: ubuntu-latest
permissions:
id-token: write # OIDC 기반 AWS 인증
contents: read
steps:
- uses: actions/checkout@v4
# OIDC로 AWS 인증 (장기 자격증명 불필요)
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsPackerRole
aws-region: ap-northeast-2
# Packer 설치
- name: Setup Packer
uses: hashicorp/setup-packer@main
with:
version: "1.10.0"
# 플러그인 초기화
- name: Packer Init
run: packer init ./packer/
# 유효성 검사
- name: Packer Validate
run: packer validate -var "app_version=${{ github.sha }}" ./packer/
# AMI 빌드
- name: Packer Build
run: |
packer build \
-var "app_version=${{ github.sha }}" \
./packer/
# 빌드된 AMI ID를 다음 job으로 전달
- name: Extract AMI ID
id: ami
run: |
AMI_ID=$(jq -r '.builds[-1].artifact_id' manifest.json | cut -d: -f2)
echo "ami_id=$AMI_ID" >> $GITHUB_OUTPUT
# Terraform으로 즉시 배포 트리거
- name: Trigger Deployment
run: |
echo "Built AMI: ${{ steps.ami.outputs.ami_id }}"
# 후속 Terraform apply 또는 Auto Scaling Group 업데이트
AWS Image Builder + EventBridge
Image Builder는 콘솔이나 CLI로 파이프라인 실행을 트리거하고, 완료 이벤트를 EventBridge로 수신해 Lambda → Terraform을 연결하는 패턴을 씁니다. 동작은 하지만 파이프라인 구성이 여러 AWS 서비스에 분산되어 가시성이 낮아집니다.
결론: CI/CD 통합의 단순함과 가시성은 Packer가 압도적으로 유리합니다.
🔍 보안 · 컴플라이언스 관점
AWS Image Builder의 강점
Image Builder에는 Inspector 통합이 내장되어 있습니다. 빌드 파이프라인 안에서 CVE 스캔을 실행하고, 취약점이 발견되면 AMI 배포를 자동으로 차단합니다. AWS Organizations 환경에서 SCPs(Service Control Policies)와 결합하면, 승인되지 않은 이미지의 사용 자체를 막을 수 있습니다.
또한 STIG(보안 기술 구현 가이드) 컴포넌트를 AWS가 직접 제공합니다. 금융·공공 환경의 컴플라이언스 요건을 빠르게 충족해야 할 때 유용합니다.
Packer의 보안 접근
Packer 자체에는 스캔 기능이 없습니다. 대신 프로비저너 단계에서 Trivy, Lynis, OpenSCAP 같은 도구를 직접 호출하는 방식입니다. 더 유연하지만, 직접 구성해야 합니다.
# Packer에서 Trivy로 취약점 스캔하는 예시
provisioner "shell" {
inline = [
# Trivy 설치
"curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin",
# OS 패키지 취약점 스캔
"trivy rootfs --exit-code 1 --severity HIGH,CRITICAL /",
# 결과를 S3에 저장 (감사 로그용)
"trivy rootfs --format json / > /tmp/trivy-report.json",
"aws s3 cp /tmp/trivy-report.json s3://my-compliance-bucket/trivy-reports/$(date +%Y%m%d)/report.json"
]
}
컴플라이언스 환경(금융, 공공, 의료): Image Builder가 유리합니다. 자체 보안 파이프라인을 이미 갖춘 팀: Packer가 더 유연합니다.
🔍 비용 · 속도 관점
두 도구 모두 빌드 중 임시 EC2 인스턴스를 사용합니다. 도구 자체의 추가 비용은 없습니다. 차이는 빌드 시간에서 납니다.
| 항목 | AWS Image Builder | Pakcer |
| 도구 비용 | 무료 (EC2 비용만) | 무료 (EC2 비용만) |
| 빌드 인스턴스 시작 오버헤드 | 약 3~5분 (서비스 초기화 포함) | 약 1~2분 |
| 빌드 실패 시 재시도 비용 | 매번 인스턴스 재기동 | -debug 모드로 인스턴스 유지 가능 |
| 로컬 사전 테스트 | 불가 | Docker builder로 가능 (무료) |
| 병렬 멀티 리전 빌드 | 배포 구성으로 지원 | parallel 블록으로 지원 |
Packer의 로컬 사전 테스트 패턴이 실질적인 비용 절감에 유리합니다. 스크립트 오류를 AWS 빌드 전에 로컬 Docker 컨테이너에서 잡아내면 불필요한 EC2 비용이 발생하지 않습니다.
🔍 멀티 클라우드 / 하이브리드 환경
Packer의 가장 강력한 카드입니다.
AWS AMI, Azure Managed Image, GCP Custom Image, VMware vSphere Template을 동일한 HCL 파일 하나로 관리할 수 있습니다.
# 멀티 클라우드 동시 빌드 예시
source "amazon-ebs" "aws_golden" {
region = "ap-northeast-2"
instance_type = "t3.micro"
# ... AWS 설정
}
source "azure-arm" "azure_golden" {
location = "Korea Central"
vm_size = "Standard_B1s"
# ... Azure 설정
}
build {
# 두 플랫폼 동시 빌드
sources = [
"source.amazon-ebs.aws_golden",
"source.azure-arm.azure_golden"
]
# 동일한 프로비저너를 양쪽에 적용
provisioner "ansible" {
playbook_file = "./ansible/golden-base.yml"
}
}
AWS Image Builder는 AWS 전용입니다. 멀티 클라우드나 온프레미스 이미지가 필요한 순간 선택지에서 사라집니다.
⚠️ 주의사항 / 흔한 실수
① Image Builder 컴포넌트 버전 관리를 소홀히 하는 것 컴포넌트는 한번 생성하면 수정이 안 됩니다. 변경할 때마다 새 버전을 만들어야 합니다. 버전 정책 없이 운영하면 어떤 버전이 프로덕션에 들어가 있는지 추적이 어려워집니다.
② Packer에서 임시 키페어·보안그룹을 수동 정리하지 않는 것 빌드 중 강제 종료되면 Packer가 생성한 임시 리소스가 AWS에 남을 수 있습니다. packer build에 --on-error=abort 옵션과 함께 정리 스크립트를 CI에 넣어두세요.
③ AMI 이름에 버전 정보를 넣지 않는 것 golden-ami-latest처럼 덮어쓰는 이름을 쓰면 롤백이 불가능합니다. app-v1.2.3-20240327 형태의 불변 이름을 권장합니다.
④ 빌드 IAM 권한을 과도하게 부여하는 것 빌드용 Role에 AdministratorAccess를 붙이는 경우가 있습니다. 최소 권한 원칙으로, AMI 생성·태깅·S3 접근 등 필요한 권한만 정의하세요.
✅ 정리 / 마무리
솔직하게 결론을 내리겠습니다.
| 상황 | 추천 |
| AWS 단일 환경 + 컴플라이언스 강조 (금융·공공) | AWS Image Builder |
| AWS Organizations + Inspector 자동 스캔 필요 | AWS Image Builder |
| CI/CD 파이프라인에 완전 통합, 코드로 관리 원함 | Packer |
| 멀티 클라우드 또는 온프레미스 이미지 병행 | Packer |
| Terraform 이미 사용 중, HCL에 익숙한 팀 | Packer |
| 빠른 반복 개발, 디버깅 편의성 중시 | Packer |
대부분의 DevOps 실무 팀에게는 Packer가 더 나은 선택입니다. CI/CD 통합, 코드 가시성, 멀티 클라우드 유연성, 빠른 반복 개발 — 이 네 가지 관점에서 Packer가 앞섭니다.
AWS Image Builder는 AWS 생태계 안에서 Inspector·SCPs·Organizations를 묶어 컴플라이언스를 자동화해야 할 때 진가를 발휘합니다. 두 도구를 혼용하는 팀도 있습니다. Packer로 베이스 이미지를 만들고, Image Builder로 컴플라이언스 검증 레이어를 얹는 방식입니다.
결국 도구의 우열보다 팀의 워크플로우와 환경에 무엇이 맞는가가 핵심입니다. 🎯
'클라우드' 카테고리의 다른 글
| 🐳 도커는 진짜로 무엇을 격리하는가? — 커널 기능으로 보는 컨테이너의 속살 (0) | 2026.03.30 |
|---|---|
| 🍀 HashiCorp가 배신했다? — Terraform의 역사와 OpenTofu가 탄생한 진짜 이유 (0) | 2026.03.28 |
| 🏗️ 개발자라면 인프라 배포를 알아야 하는 진짜 이유 — "코드만 잘 짜면 된다"는 착각 (0) | 2026.03.27 |
| ☁️ AWS 마이그레이션할 때 왜 AWS 콘솔 말고 테라폼을 배워야 하나? (0) | 2026.03.27 |
| 🔑 키 교체(Key Rotation)하면 데이터를 전부 다시 암호화할까? — 클라우드 KMS의 진실 (0) | 2026.03.27 |