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
'IT' 카테고리의 다른 글
[Software] DRY원칙이란?(Don't Repeat Yourself) (0) | 2022.05.31 |
---|---|
[IT] 러닝커브(Learning Curve) 란? (0) | 2022.02.28 |
[OS] windows server에 OpenSSH 설치하기 (0) | 2022.02.25 |
ASCII란? UUEncode란? MIME Type이란? MEDIA Type이란? (0) | 2022.02.07 |
프로그램 코딩 케이스 종류(카멜, 스네이크, 케밥, 파스칼) (0) | 2022.01.22 |