본문으로 바로가기
반응형

Intro

이번 블로그에서는 Packer를 사용해 AWS AMI 이미지를 생성하는 심화 과정에 대해 다루어보겠습니다. Packer의 설정 파일을 여러 개로 나누고, 쉘 스크립트를 프로비저닝 단계에서 동작시키는 방법을 상세히 알아보도록 할게요. 이를 통해 좀 더 유연하고 구조화된 설정 관리가 가능해지며, 이미지 빌드 과정에서 추가 작업을 자동화할 수 있습니다.

Packer 파일 구조화


project-root/
├── build.pkr.hcl
├── plugins.pkr.hcl
├── source.pkr.hcl
├── variables.pkr.hcl
├── variables.pkrvars.hcl
└── scripts/
    └── install_software.sh
  • build.pkr.hcl - 빌드 작업의 단계와 프로비저닝 설정을 정의합니다.
  • plugins.pkr.hcl - 필요한 Packer 플러그인 설정을 관리합니다.
  • source.pkr.hcl - 소스 이미지 및 AWS 인스턴스 설정을 정의합니다.
  • variables.pkr.hcl - 빌드 과정에서 사용할 변수를 선언합니다.
  • variables.pkrvars.hcl - 선언된 변수의 값을 구체적으로 지정합니다.
  • scripts/install_software.sh - 프로비저닝 과정에서 실행할 쉘 스크립트입니다.

packer 코드 작성 방법

1. build.pkr.hcl

  • 역할: 빌드 작업의 단계와 프로비저닝 설정을 정의합니다.
  • 설명: build 블록은 Packer가 어떤 작업을 수행해야 하는지, 어떤 소스를 사용할지, 프로비저닝 방식이 무엇인지를 정의합니다. 예를 들어, AWS 환경에 맞는 빌드를 설정하고, 쉘 스크립트를 호출하여 소프트웨어 설치나 설정 작업을 자동화할 수 있습니다.

예시 파일 내용:

# build.pkr.hcl

build {
  sources = ["source.amazon-ebs.example"]

  provisioner "shell" {
    script = "./scripts/install_software.sh"
  }
}

위 설정에서 Packer는 source로 정의된 인스턴스를 빌드한 후, install_software.sh라는 스크립트를 실행합니다.

2. plugins.pkr.hcl

  • 역할: 필요한 Packer 플러그인 설정을 관리합니다.
  • 설명: Packer는 다양한 클라우드 제공자와 가상화 플랫폼을 지원하는 플러그인을 통해 기능을 확장할 수 있습니다. 이 파일에서 Packer가 사용할 플러그인을 정의하고 설정합니다. AWS를 위한 플러그인을 설치해 EC2 인스턴스의 AMI 빌드를 할 수 있도록 설정할 수 있습니다.

예시 파일 내용:

# plugins.pkr.hcl

packer {
  required_plugins {
    amazon = {
      version = ">= 1.0.0"
      source  = "github.com/hashicorp/amazon"
    }
  }
}

이 파일은 Packer가 amazon 플러그인을 사용하여 AWS 관련 빌드 작업을 수행할 수 있도록 설정합니다.

3. source.pkr.hcl

  • 역할: 소스 이미지 및 AWS 인스턴스 설정을 정의합니다.
  • 설명: source 블록은 어떤 이미지를 기반으로 새로운 이미지를 생성할지 정의합니다. 여기에는 소스 AMI, 인스턴스 유형, 리전 등을 설정할 수 있습니다. 주로 AWS, Azure, Docker와 같은 환경에 맞춰 설정을 구성합니다.

예시 파일 내용:

# source.pkr.hcl

source "amazon-ebs" "example" {
  region             = var.aws_region
  instance_type      = var.instance_type
  source_ami_filter {
    filters = {
      name                = "amzn2-ami-hvm-*-x86_64-gp2"
      root-device-type    = "ebs"
      virtualization-type = "hvm"
    }
    owners      = ["123456789012"]
    most_recent = true
  }
  ami_name = "packer-example-{{timestamp}}"
}

이 파일에서는 Amazon Linux 2를 기반으로 최신 AMI 이미지를 생성하도록 설정되어 있습니다.

4. variables.pkr.hcl

  • 역할: 빌드 과정에서 사용할 변수를 선언합니다.
  • 설명: 변수 블록은 이미지 빌드 시 필요한 값을 미리 정의할 수 있도록 하여 빌드 설정의 유연성을 높입니다. 여기서는 리전, 인스턴스 타입 등 변수들을 선언할 수 있습니다.

예시 파일 내용:

# variables.pkr.hcl

variable "aws_region" {
  type    = string
  default = "us-west-2"
}

variable "instance_type" {
  type    = string
  default = "t2.micro"
}

5. variables.pkrvars.hcl

  • 역할: 선언된 변수의 값을 구체적으로 지정합니다.
  • 설명: 파일에 정의된 변수의 값을 구체적으로 설정하여 특정 환경에서 빌드할 때 유동적으로 사용할 수 있도록 합니다. 예를 들어, 빌드에 사용할 리전과 인스턴스 유형을 다른 값으로 지정할 수 있습니다.

예시 파일 내용:

# variables.pkrvars.hcl

aws_region    = "us-east-1"
instance_type = "t3.small"

이렇게 설정하면, aws_regioninstance_typeus-east-1t3.small로 오버라이드됩니다.

6. 쉘 스크립트 파일: install_software.sh

프로비저닝 단계에서 실행할 쉘 스크립트를 작성하여, 필요한 소프트웨어를 자동으로 설치할 수 있습니다. 예를 들어, Apache 웹 서버를 설치하고 시작하는 스크립트를 작성해보겠습니다.

예시 스크립트 파일 (scripts/install_software.sh):

#!/bin/bash
# install_software.sh

# Apache 설치 및 시작
sudo yum update -y
sudo yum install -y httpd
sudo systemctl enable httpd
sudo systemctl start httpd

Packer는 이 스크립트를 실행하여 생성하는 AMI에 Apache 서버가 설치되고 자동으로 시작되는 환경을 구축할 수 있습니다.

Packer 빌드 실행

위 파일들이 준비되었다면, Packer를 이용해 이미지 빌드를 시작할 수 있습니다. 다음과 같은 명령어를 사용하여 빌드를 진행합니다:

packer init .
packer validate .
packer build -var-file=variables.pkrvars.hcl build.pkr.hcl

validate 명령은 설정 파일의 문법 오류를 확인하는 데 유용하며, build 명령을 통해 모든 설정과 프로비저닝이 적용된 AMI 이미지를 생성합니다.

이와 같이 Packer 파일을 여러 개로 나누어 구성하고, 프로비저닝 단계에서 쉘 스크립트를 실행하면 더 복잡한 이미지를 쉽게 구성할 수 있습니다. 이러한 방식은 유지 관리와 확장성이 뛰어나기 때문에 실무에서 자주 활용됩니다. Packer사용하면 자동화된 AWS AMI 생성 과정을 더욱 체계적으로 관리가 가능합니다.

반응형