AWS

Packer 사용해서 AWS ami 커스텀 해보기

황동리 2025. 9. 30. 13:29
반응형

Packer 란?

Packer는 여러 클라우드 및 가상화 환경에서 사용할 수 있는 머신 이미지를 자동으로 빌드해주는 도구 입니다.


Packer를 사용하게된 계기

Kubernetes 환경에서 Job 리소스를 사용하다 보면, 요청이 들어올 때마다 새로운 Pod가 생성됩니다.


이 과정에서 노드가 새로 생성되고, 필요한 컨테이너 이미지를 내려받은 뒤에야 Pod가 실행되기 때문에 시간이 오래 걸리는 문제가 있었습니다.


이 문제를 해결하기 위해, 노드가 시작될 때 이미 필요한 컨테이너 이미지가 포함된 상태로 준비되어 있으면 좋겠다고 생각했습니다.


이를 위해 선택한 도구가 HashiCorp Packer 입니다.


Packer를 사용하면 커스텀 베이스 노드 이미지를 빌드할 수 있고, 여기에 Pod 실행에 필요한 이미지를 미리 포함시킬 수 있습니다.


그 결과, Job 실행 시 Pod가 더 빠르게 기동되어 전체 처리 시간이 단축되었습니다.


이제 AMI를 어떻게 커스텀 했는지 제가 겪었던 과정을 설명 드리겠습니다.

Packer 설치

저는 Mac 환경이여서 아래 방법으로 설치하였습니다.

brew tap hashicorp/tap
brew install hashicorp/tap/packer

다른 환경 설치 방법은 아래 링크를 참조하시면 됩니다.
Packer 설치

.pkr.hcl 작성

packer {
  required_plugins {
    amazon = { # AWS AMI 빌드를 위한 amazon 플러그인 선언
      source  = "github.com/hashicorp/amazon"
      version = ">= 1.4.0"
    }
  }
}

# AMI를 빌드할 EC2 인스턴스 정의
source "amazon-ebs" "ask-engine" {
  ami_name      = "eks-al2023-baked-ask-engine-v1.5.45" # 새 AMI 이름 패턴
  instance_type = "t3a.medium"                          # 빌드할 때 쓸 임시 인스턴스 타입
  region        = "ap-northeast-1"                      # AMI 빌드 리전
  source_ami    = "ami-0fb4a375208b57770"               # Base 이미지의 ami 지정
  subnet_id    = "subnet-032c0221411d3954b"             # SSH 접속을 위한 퍼블릭 서브넷 ID
  ssh_username = "ec2-user"                             # 기본 로그인 사용자
  iam_instance_profile = "dev-outcode-hot-instance-role" # Packer 빌드용 IAM 인스턴스 프로파일


  # 루트 디스크 설정
  launch_block_device_mappings {
    device_name           = "/dev/xvda"
    volume_size           = 30                           # 30 GB
    volume_type           = "gp3"
    delete_on_termination = true                         # EC2 인스턴스 삭제 시 EBS 같이 삭제
  }

  # 결과 AMI에 태그 부여 → Karpenter에서 태그 기반 선택 가능
  tags = {
    Name                     = "eks-al2023-baked-ask-engine-v1.5.45"
    "karpenter.sh/discovery" = "dev-outcode-eks-cluster" # Karpenter discovery 태그
    "baked.images"           = "true"
  }
}

# 빌드 실행 정의
build {
  name    = "eks-al2023-baked-ask-engine-v1.5.45"
  sources = ["source.amazon-ebs.ask-engine"]

  provisioner "shell" { # EC2 인스턴스에 접속해서 실행할 셸 명령어들
    inline = [
      "sudo systemctl start containerd",
      "export ECR_PASSWORD=$(aws ecr get-login-password --region ap-northeast-1)",
      "sudo ctr -n k8s.io image pull -u AWS:$ECR_PASSWORD 308910977993.dkr.ecr.ap-northeast-1.amazonaws.com/dev-outcode:ask-engine-v1.5.45"
    ]
  }
}

Packer 사용하여 ami 커스텀

이제 앞서 작성한 파일로 ami 커스텀을 진행해보겠습니다.

  • HCL 기반 설정에서 플러그인 초기화

    packer init <.pkr.hcl 파일명>
  • 템플릿 문법 검증

    pakcer validate <.pkr.hcl 파일명>
  • 이미지 빌드

    pakcer build <.pkr.hcl 파일명>

그러면 아래 이미지와 같이 빌드 과정이 나오고, 빌드가 성공적으로 끝났다는 것을 알 수 있습니다.


이상 입니다.

반응형