EBS 볼륨에 애플리케이션 파일 저장하기

AWSBeginner
지금 연습하기

소개

보고서 애플리케이션에는 보고서 파일을 저장할 별도의 디스크가 필요합니다. Amazon EBS 볼륨을 생성하여 EC2 인스턴스에 연결하고, 파일 시스템을 포맷하고 마운트한 뒤 해당 볼륨에서 보고서를 제공합니다. 이후 마운트를 해제하고 볼륨 연결을 해제한 다음 생성한 리소스를 삭제합니다.

EC2 시작과 SSH의 기본을 이미 알고 있어야 합니다. 각 실습은 새로운 환경에서 시작하며, 자체 애플리케이션 이미지, 네트워크 및 키 페어가 제공됩니다.

자격증과의 관련성

이 실습에서는 EC2 워크로드에 적합한 블록 스토리지 선택을 연습하며, AWS Certified Cloud Practitioner CLF-C02 도메인 3 목표의 작업 3.6에 포함된 스토리지 개념을 익힙니다.

스토리지 서버 시작하기

이 단계에서는 애플리케이션 인스턴스를 시작하고 가용 영역을 확인합니다.

작업 디렉터리에서 제공된 리소스 ID를 불러옵니다.

cd /home/labex/project
source launch.env

storage-server라는 이름의 인스턴스 하나를 시작합니다. 이미지에는 보고서 애플리케이션이 이미 포함되어 있으며, 여기서는 데이터 볼륨을 제공합니다.

aws ec2 \
  run-instances \
  --image-id "$AMI_ID" \
  --instance-type t3.micro \
  --subnet-id "$SUBNET_ID" \
  --security-group-ids "$SECURITY_GROUP_ID" \
  --key-name report-key \
  --count 1 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=storage-server}]'

이름 태그로 인스턴스 ID를 가져옵니다.

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=storage-server \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

인스턴스가 실행될 때까지 기다립니다.

aws ec2 \
  wait instance-running \
  --instance-ids "$INSTANCE_ID"

가용 영역은 리전 내의 격리된 위치입니다. EBS 볼륨은 같은 가용 영역에 있는 인스턴스에 연결합니다. 영역을 추측하지 말고 인스턴스의 영역을 조회합니다.

AVAILABILITY_ZONE=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].Placement.AvailabilityZone' \
  --output text)

상태와 영역을 확인합니다.

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name,Zone:Placement.AvailabilityZone}'

running을 확인합니다. AWS View를 열고 Refresh resources를 클릭한 다음 storage-server를 선택하고 Check application을 클릭합니다. 스토리지를 추가하기 전에 HTTP 200을 확인합니다.

데이터 볼륨 생성 및 연결하기

이 단계에서는 별도의 EBS 데이터 볼륨을 생성하여 실행 중인 서버에 연결합니다.

Amazon EBS는 EC2용 블록 스토리지를 제공합니다. 볼륨은 디스크와 같은 리소스이며, 파일 시스템은 해당 디스크의 파일을 구성합니다. 볼륨을 연결하면 블록 장치를 사용할 수 있지만 파일 시스템이 생성되는 것은 아닙니다. EBS 볼륨 안내서에서는 볼륨 연결과 데이터 지속성을 설명합니다.

작고 비어 있는 범용 SSD 볼륨을 생성합니다. gp3는 볼륨 유형을 선택하고, --size 1은 1 GiB를 요청하며, 영역 변수는 인스턴스와 같은 영역에 배치합니다. 이후 작업을 위해 ID를 저장합니다.

VOLUME_ID=$(aws ec2 \
  create-volume \
  --availability-zone "$AVAILABILITY_ZONE" \
  --size 1 \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=report-data}]' \
  --query 'VolumeId' \
  --output text)

새 볼륨을 사용할 수 있을 때까지 기다립니다.

aws ec2 \
  wait volume-available \
  --volume-ids "$VOLUME_ID"

API 장치 이름 /dev/sdf를 사용하여 연결합니다.

aws ec2 \
  attach-volume \
  --volume-id "$VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdf

연결이 완료될 때까지 기다립니다.

aws ec2 \
  wait volume-in-use \
  --volume-ids "$VOLUME_ID"

볼륨과 연결 정보를 확인합니다.

aws ec2 \
  describe-volumes \
  --volume-ids "$VOLUME_ID" \
  --query 'Volumes[].{Volume:VolumeId,State:State,Zone:AvailabilityZone,Size:Size,Type:VolumeType,Attachments:Attachments}'

in-use, 크기 1, 유형 gp3, 그리고 자신의 인스턴스에 연결되었는지 확인합니다. AWS View를 새로 고침하여 볼륨 행을 확인합니다. 루트 볼륨은 새 데이터 볼륨과 별개입니다.

볼륨 마운트 및 보고서 제공하기

이 단계에서는 빈 데이터 볼륨을 초기화하여 애플리케이션에서 보고서를 사용할 수 있게 합니다.

인스턴스의 현재 퍼블릭 주소를 가져옵니다.

PUBLIC_IP=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].PublicIpAddress' \
  --output text)

제공된 SSH 설정으로 연결합니다.

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

인스턴스 내부에서 새로 연결된 장치를 확인합니다. 이 실습의 Linux 장치 이름은 /dev/xvdf이며, 장치 이름은 API 연결 이름과 다를 수 있습니다. 다른 EC2 이미지에서는 NVMe 이름이 표시될 수 있으므로 작업 전에 디스크를 식별해야 합니다. 공식 Linux 볼륨 준비 안내서에서 이 차이를 설명합니다.

lsblk -f /dev/xvdf

장치에 파일 시스템 유형이 없는지 확인합니다. 새로 생성한 빈 데이터 볼륨에만 ext4 파일 시스템을 생성합니다. 기존 데이터가 있는 볼륨을 포맷하면 데이터가 삭제됩니다.

sudo mkfs.ext4 /dev/xvdf

마운트 지점은 파일 시스템에 접근하는 디렉터리입니다. 보고서 애플리케이션용으로 준비된 디렉터리에 새 파일 시스템을 마운트합니다.

sudo mount /dev/xvdf /srv/reports

원본 장치, 파일 시스템 및 마운트 지점을 확인합니다.

findmnt /srv/reports

/dev/xvdf, ext4, /srv/reports를 확인합니다. 가상 데이터로 CSV 보고서를 생성합니다. sudo tee는 관리자 소유 파일 시스템에 쓰며, 구분자를 따옴표로 감싼 here-document는 두 줄을 그대로 유지합니다.

sudo tee /srv/reports/report.csv <<'CSV'
period,total
Q1,320
CSV

파일을 다시 읽습니다.

cat /srv/reports/report.csv

LabEx 터미널로 돌아갑니다.

exit

AWS View에서 storage-server를 선택하고 Read volume report를 클릭합니다. HTTP 200과 CSV 텍스트 period,total 및 Q1,320을 확인합니다. 이 응답은 애플리케이션이 마운트된 볼륨의 파일을 읽을 수 있음을 보여 줍니다.

이 실습의 마운트는 수동입니다. 재부팅하면 수동 마운트가 자동으로 복원되지 않습니다. 운영 환경에서는 일반적으로 항목을 테스트한 뒤 /etc/fstab에 파일 시스템 UUID를 설정합니다.

마운트 해제, 연결 해제 및 삭제하기

이 단계에서는 정해진 순서로 데이터 볼륨과 애플리케이션 인스턴스를 제거합니다.

먼저 애플리케이션 인스턴스에 다시 연결합니다.

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

디스크 연결을 해제하기 전에 파일 시스템 마운트를 해제합니다. 그러면 파일 시스템 접근이 중단되고 보류 중인 쓰기가 디스크에 반영됩니다.

sudo umount /srv/reports

더 이상 마운트되어 있지 않은지 확인합니다.

findmnt /srv/reports

마운트되지 않은 디렉터리에서는 findmnt가 아무것도 출력하지 않고 0이 아닌 종료 상태를 반환합니다. 여기서는 예상된 결과입니다. LabEx 터미널로 돌아갑니다.

exit

자신의 데이터 볼륨만 연결 해제합니다.

aws ec2 \
  detach-volume \
  --volume-id "$VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdf

볼륨을 다시 사용할 수 있을 때까지 기다립니다.

aws ec2 \
  wait volume-available \
  --volume-ids "$VOLUME_ID"

연결 해제된 볼륨을 삭제합니다. 이 작업은 데이터를 영구적으로 제거하므로 운영 볼륨을 삭제하기 전에 중요한 파일이나 백업을 보관합니다.

aws ec2 \
  delete-volume \
  --volume-id "$VOLUME_ID"

애플리케이션 인스턴스를 종료합니다.

aws ec2 \
  terminate-instances \
  --instance-ids "$INSTANCE_ID"

종료될 때까지 기다립니다.

aws ec2 \
  wait instance-terminated \
  --instance-ids "$INSTANCE_ID"

인스턴스의 최종 상태를 확인합니다.

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'

terminated를 확인한 다음 남아 있는 볼륨을 나열합니다.

aws ec2 \
  describe-volumes \
  --query 'Volumes[].{Volume:VolumeId,State:State}'

예상 결과는 []입니다. 데이터 볼륨은 명시적으로 삭제했으며, 이 인스턴스의 루트 볼륨은 종료 시 삭제되었습니다. AWS View를 새로 고침하여 서버가 더 이상 실행 중인 대상이 아니고 볼륨 목록이 비어 있는지 확인합니다. 준비된 네트워크와 키 페어는 그대로 유지합니다.

요약

EC2 인스턴스와 같은 가용 영역에 EBS 데이터 볼륨을 생성하고 연결했으며, 빈 파일 시스템을 포맷하여 애플리케이션용으로 마운트했습니다. 실제 보고서 응답을 확인한 다음 볼륨의 마운트와 연결을 해제하고 삭제한 뒤 서버를 종료했습니다.