본문으로 바로가기
반응형

Intro

이번 블로그에서는 Packer를 활용해 AWS AMI 이미지를 생성하면서 EBS 볼륨을 자동으로 마운트하는 심화 설정을 소개합니다. 이를 통해 여러 EBS 볼륨을 자동으로 설정하고, 지정된 마운트 포인트에 연결하는 작업을 자동화할 수 있습니다. 이 과정은 복잡한 디스크 구조를 가진 인프라에서 특히 유용하며, 자동화된 AMI 빌드와 함께 마운트 설정을 완성할 수 있습니다.

AWS에서 AMI 이미지를 생성하고 이를 자동으로 EBS 볼륨에 연결하여 마운트하는 과정은 배포의 일관성과 효율성을 극대화합니다. 그러나 EBS 볼륨을 수동으로 마운트하려면 번거로울 수 있습니다. 이 포스팅에서는 Packer 설정 파일을 구조화하여 EBS 볼륨을 자동으로 마운트하는 방법을 다룹니다.


1. Packer 파일 설정

Packer에서 AMI 빌드 시 EBS 볼륨을 설정하고 마운트하는 방법을 보여주기 위해 주요 변수를 포함한 설정 파일을 작성합니다.

build.pkr.hcl

build 블록에서는 source를 호출하고, provisioner에서 쉘 스크립트를 통해 자동으로 EBS 볼륨을 마운트합니다.

# build.pkr.hcl

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

  provisioner "shell" {
    script = "../../scripts/${var.script_version}/init_volume.sh"
    environment_vars = [
      "DISKS=${local.disks}"
    ]
  }
}
  • script: ../../scripts/${var.script_version}/init_volume.sh에 있는 스크립트를 실행하여 EBS 볼륨을 자동 마운트합니다.
  • environment_vars: DISKS 변수로 마운트할 디스크 정보를 전달합니다. 이를 통해 여러 볼륨에 대해 일괄적으로 작업을 수행할 수 있습니다.

source.pkr.hcl

AWS의 AMI 이미지를 생성할 때 사용할 소스를 정의하는 파일입니다.

# source.pkr.hcl

locals {
  disks = join("^", [
    for key, vol in var.add_ebs_vol :
    "${join(",", [vol.ebs_device_name, vol.os_device_name, vol.mount_point])}"
  ])
}

source "amazon-ebs" "golden_ami" {
  ami_name           = "dpx-al2023-x86-golden-ami"
  region             = "ap-northeast-2"
  vpc_id             = "vpc-028226e3fc7528f7a"
  subnet_id          = "subnet-065e6407cd2c3c4b1"
  security_group_ids = ["sg-0e60f9c97018104b0"]
  instance_type      = "t3.small"
  ssh_username       = "ec2-user"
  ami_users          = ["123456789012"]

  source_ami_filter {
    filters = {
      name                = "al2023-ami-2023.*.*-kernel-6.1-x86_64"
      root_device_type    = "ebs"
      virtualization_type = "hvm"
    }
    owners      = ["123456789012"]
    most_recent = true
  }

  launch_block_device_mappings {

    volume_type           = var.root_ebs_vol.volume_type
    device_name           = var.root_ebs_vol.ebs_device_name
    volume_size           = var.root_ebs_vol.volume_size
    delete_on_termination = var.root_ebs_vol.delete_on_termination
    encrypted             = var.root_ebs_vol.encrypted
    // kms_key_id            = var.root_ebs_vol.kms_key_id
  }

  dynamic "launch_block_device_mappings" {

    for_each = var.add_ebs_vol

    content {
      volume_type           = launch_block_device_mappings.value.volume_type
      device_name           = launch_block_device_mappings.value.ebs_device_name
      volume_size           = launch_block_device_mappings.value.volume_size
      encrypted             = launch_block_device_mappings.value.encrypted
      delete_on_termination = launch_block_device_mappings.value.delete_on_termination
      // kms_key_id            = launch_block_device_mappings.value.kms_key_id
    }

  }
}
  • 여기서 AWS의 Amazon Linux 2023 AMI를 기반으로 EC2 인스턴스를 생성하도록 설정되어 있습니다.
  • disks 변수의 값들은 아래 2번에서 variables.pkrvars.hcl 에서 정의한 값들 이며, 쉘스크립트 동작시 마운트할 디스크 정보를 전달하여 여러 EBS 볼륨에 대한 자동 마운트 작업을 수행할 수 있게 합니다.
  • dynamic "launch_block_device_mappings" 를 사용해서 아래 2번에서 add_ebs_vol 으로 정의한 볼륨 개수 만큼 ebs를 생성합니다.

2. EBS 볼륨 설정

AMI 생성 시 추가할 EBS 볼륨의 유형, 크기, 마운트 포인트 등을 변수로 지정하여 유연성을 높입니다.

# EBS 볼륨 설정 예시
# variables.pkrvars.hcl

region             = "ap-northeast-2"
instance_type      = "t3.small"

root_ebs_vol = {
  volume_type           = "gp3"
  ebs_device_name       = "/dev/xvda"
  os_device_name        = "/dev/nvme0n1"
  volume_size           = 30
  encrypted             = false
  delete_on_termination = true
}

add_ebs_vol = {
  vol1 = {
    volume_type           = "gp3"
    ebs_device_name       = "/dev/sdb"
    os_device_name        = "/dev/nvme1n1"
    volume_size           = 50
    mount_point           = "/data"
    encrypted             = false
    delete_on_termination = true
  }
  vol2 = {
    volume_type           = "gp3"
    ebs_device_name       = "/dev/sdc"
    os_device_name        = "/dev/nvme2n1"
    volume_size           = 20
    mount_point           = "/log"
    encrypted             = true
    delete_on_termination = false
  }
  vol3 = {
    volume_type           = "gp3"
    ebs_device_name       = "/dev/sdd"
    os_device_name        = "/dev/nvme3n1"
    volume_size           = 30
    mount_point           = "/file"
    encrypted             = true
    delete_on_termination = false
  }
}

이 설정은 각 EBS 볼륨에 대한 세부 정보를 정의하여 AMI 빌드 시 자동으로 마운트될 수 있도록 합니다. 총 3개의 EBS가 할당되고 이는 자동으로 마운트 까지 동작하게 됩니다.


3. EBS 마운트 스크립트 작성: init_volume.sh

Packer의 프로비저닝 단계에서 실행할 init_volume.sh 스크립트를 작성하여, EBS 볼륨을 자동으로 마운트하고 파일 시스템을 생성하도록 합니다.

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

#!/bin/bash -x

################################################################################
# File: init_volume.sh
# Description: Script to automate volume mounting.
################################################################################

list=$DISKS
IFS='^' read -ra elements <<< "$list"

for item in "${elements[@]}"; do
    IFS=',' read -r ebs_device os_device mount_point <<< "$item"
    echo "EBS Device: $ebs_device"
    echo "OS Device: $os_device"
    echo "Mount Point: $mount_point"

    ### 마운트할 폴더 생성
    sudo mkdir -p $mount_point
    sudo chown deploy:deploy $mount_point

    ### 파일 시스템 생성
    sudo mkfs -t xfs "$os_device"
    sleep 5

    ## UUID 정의
    os_device_sed=$(echo $os_device | sed 's/.*\///')
    os_device_uuid=$(lsblk -f | grep "$os_device_sed" | awk '{print $3}')
    echo "os_device_uuid: $os_device_uuid"

    ## fstab 입력
    sudo sh -c "echo 'UUID=$os_device_uuid  $mount_point  xfs  defaults,nofail  0  2' >> /etc/fstab"
done

sudo mount -a
  • DISKS 변수: 쉘 스크립트에서 Packer가 전달한 DISKS 변수를 사용해 각 볼륨을 마운트합니다.
  • UUID 및 fstab 업데이트: 볼륨의 UUID를 찾고, /etc/fstab 파일에 등록하여 인스턴스 재부팅 시 자동으로 마운트되도록 설정합니다.

4. Packer 빌드 실행

모든 설정 파일과 스크립트가 준비되었으면, 다음 명령어로 빌드를 실행하여 EBS 볼륨 마운트가 설정된 AMI 이미지를 생성합니다.

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

validate 명령으로 설정 파일을 검증한 후, build 명령으로 최종 이미지를 생성합니다.


이번 포스팅에서는 Packer를 활용해 AWS AMI 이미지를 생성하고, 자동으로 EBS 볼륨을 마운트하는 방법을 다뤘습니다. 이를 통해 복잡한 인프라 구성에서도 마운트를 자동화할 수 있으며, 일관된 AMI 빌드와 배포를 손쉽게 관리할 수 있습니다.

참고URL

반응형