인스턴스 수명 주기와 주소 관리하기

AWSBeginner
지금 연습하기

소개

팀은 유지보수 중 보고서 서버를 중지한 뒤 예측 가능한 퍼블릭 주소로 다시 시작하려고 합니다. EC2 인스턴스를 운영하고 중지 상태와 실행 상태를 비교하며 Elastic IP를 연결한 뒤, 추가 중지 및 시작 후 애플리케이션을 확인합니다.

EC2 시작, SSH, User Data를 이미 알고 있어야 합니다. 이 새 환경은 자체 이미지, 네트워크, 키 페어, 시작 스크립트를 제공합니다. 서버는 직접 시작하고 운영합니다.

자격증 시험과의 연관성

인스턴스 작업과 퍼블릭 주소 관리는 AWS Certified Cloud Practitioner CLF-C02 영역 3 시험 목표의 과제 3.3 및 3.5에 해당하는 컴퓨팅과 네트워크 개념을 학습하는 데 도움이 됩니다.

유지보수 서버 시작하기

이 단계에서는 애플리케이션 서버를 시작하고 초기 상태와 주소를 확인합니다.

프로젝트 디렉터리에서 시작합니다.

cd /home/labex/project

제공된 이미지, 서브넷, 보안 그룹 ID를 불러옵니다.

source launch.env

제공된 시작 스크립트는 보고서 애플리케이션의 인사 메시지를 설정합니다. 사용하기 전에 확인합니다.

cat lifecycle-user-data.sh

Lifecycle server 메시지를 찾습니다. 이전 실습과 마찬가지로 --user-data file://...는 Bash 스크립트를 읽고 인스턴스 시작 시 전달합니다. lifecycle-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 \
  --user-data file://lifecycle-user-data.sh \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=lifecycle-server}]'

이름 태그 조회로 인스턴스 ID를 저장하여 다음 작업에서 사용합니다.

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

상태와 네트워크 주소를 확인합니다.

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

running을 확인합니다. 아직 pending이면 잠시 기다린 뒤 조회를 반복합니다. 출력의 프라이빗 및 퍼블릭 IPv4 주소를 기억해 두세요. 유지보수 후에 비교합니다.

AWS View를 열고 Refresh resources를 클릭합니다. Application requests에서 lifecycle-server를 선택하고 Check application을 클릭합니다. 인스턴스 상태를 바꾸기 전에 HTTP 200과 Lifecycle server를 확인합니다.

유지보수를 위해 서버 중지하기

이 단계에서는 인스턴스를 중지하고 애플리케이션 요청을 처리할 수 없음을 확인합니다.

stopped 인스턴스는 전원이 꺼져 있으며 다시 시작할 수 있습니다. terminated 인스턴스는 영구적으로 제거되었습니다. EBS를 루트 스토리지로 사용하는 인스턴스는 중지해도 루트 볼륨이 보존되며, 중지 중에는 애플리케이션을 사용할 수 없습니다. 인스턴스 수명 주기 공식 가이드는 이 상태 차이를 설명합니다.

애플리케이션 인스턴스를 중지합니다.

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

stopped를 기다립니다. waiter는 상태를 주기적으로 조회하고 조건이 충족되면 출력 없이 종료합니다.

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

상태와 주소를 다시 확인합니다.

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

stopped를 확인합니다. 프라이빗 IPv4 주소는 유지되지만 자동 할당된 퍼블릭 IPv4 주소는 해제됩니다. 다시 시작한 후에는 그때의 퍼블릭 주소를 사용해야 합니다.

AWS View를 새로 고칩니다. stopped와 실행 중인 애플리케이션 선택 목록에서 인스턴스가 사라졌는지 확인합니다. 인스턴스 기록과 루트 스토리지는 남아 있어도 유지보수 중 서버는 사용할 수 없습니다.

Elastic IP로 퍼블릭 주소 유지하기

이 단계에서는 서버를 시작하고 Elastic IP를 연결한 뒤, 추가 중지 및 시작 후에도 퍼블릭 엔드포인트의 연결이 유지되는지 확인합니다.

기존 인스턴스를 시작합니다.

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

running을 기다립니다.

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

주소를 확인합니다.

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

인스턴스 ID와 프라이빗 IPv4 주소는 동일하게 유지됩니다. 자동 할당된 퍼블릭 주소는 중지 및 시작 후 바뀝니다. AWS View를 새로 고치고 애플리케이션을 다시 확인합니다. 여전히 Lifecycle server를 반환해야 합니다.

Elastic IP는 해제할 때까지 계정에 할당되는 퍼블릭 IPv4 주소입니다. 할당은 주소를 예약하고 연결은 인스턴스나 네트워크 인터페이스에 주소를 연결합니다. Elastic IP 공식 가이드에 설명된 것처럼 중지 및 시작 후에도 안정적인 주소를 제공할 수 있습니다.

VPC에서 사용할 Elastic IP 한 개를 할당하고 할당 ID를 저장합니다.

ALLOCATION_ID=$(aws ec2 \
  allocate-address \
  --domain vpc \
  --query 'AllocationId' \
  --output text)

해당 할당을 인스턴스에 연결합니다. 반환된 연결 ID는 정리할 때 사용하도록 저장합니다.

ASSOCIATION_ID=$(aws ec2 \
  associate-address \
  --allocation-id "$ALLOCATION_ID" \
  --instance-id "$INSTANCE_ID" \
  --query 'AssociationId' \
  --output text)

주소와 연결된 인스턴스를 확인합니다.

aws ec2 \
  describe-addresses \
  --allocation-ids "$ALLOCATION_ID" \
  --query 'Addresses[].{PublicIPv4:PublicIp,Allocation:AllocationId,Instance:InstanceId}'

Elastic IP를 기억해 둡니다. 이 주소가 인스턴스의 자동 할당 퍼블릭 IPv4 주소를 대체합니다. AWS View를 새로 고치고 애플리케이션을 확인하여 새 주소가 같은 서버에 도달하는지 확인합니다.

이제 유지보수 중지 및 시작을 한 번 더 수행합니다.

aws ec2 \
  stop-instances \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  wait instance-stopped \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  start-instances \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  wait instance-running \
  --instance-ids "$INSTANCE_ID"

인스턴스를 다시 확인합니다.

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

퍼블릭 주소가 기록한 Elastic IP인지 확인합니다. AWS View를 새로 고치고 Check application을 클릭합니다. HTTP 200과 Lifecycle server는 유지보수 후 서버가 유지된 주소를 통해 요청을 처리함을 보여 줍니다.

주소 해제하고 서버 종료하기

이 단계에서는 할당된 주소를 해제하고 애플리케이션 인스턴스를 영구적으로 제거합니다.

연결 해제는 인스턴스와의 연결을 제거하지만 계정에서 주소 할당을 해제하지는 않습니다. 먼저 저장한 연결을 해제합니다.

aws ec2 \
  disassociate-address \
  --association-id "$ASSOCIATION_ID"

그다음 할당을 해제합니다.

aws ec2 \
  release-address \
  --allocation-id "$ALLOCATION_ID"

AWS에서 할당된 퍼블릭 IPv4 주소는 인스턴스가 중지되어 있어도 과금 대상 리소스입니다. 더 이상 필요하지 않은 주소를 해제하는 것도 리소스 정리의 일부입니다.

서버를 종료합니다.

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를 확인합니다. 남은 Elastic IP 할당을 조회합니다.

aws ec2 \
  describe-addresses \
  --query 'Addresses[].{Allocation:AllocationId,PublicIPv4:PublicIp}'

결과는 빈 목록 []이어야 합니다. AWS View를 새로 고치고 서버가 더 이상 실행 중인 대상이 아닌지 확인합니다. 준비된 네트워크와 키 페어는 그대로 둡니다.

요약

EC2 애플리케이션 서버를 중지하고 시작하면서 주소 변화를 관찰하고 Elastic IP를 연결했습니다. 추가 유지보수 후 유지된 주소를 통해 애플리케이션에 접근할 수 있음을 확인했습니다. 마지막으로 할당을 해제하고 서버를 종료하여 두 리소스가 정리되었는지 확인했습니다.