EC2 애플리케이션 서버 시작하기

AWSBeginner
지금 연습하기

소개

팀은 작은 보고서 애플리케이션용 서버가 필요합니다. 이 실습에서는 Amazon EC2 인스턴스를 시작하고 SSH로 연결한 뒤 애플리케이션 인사 메시지를 변경하고 AWS View에서 응답을 테스트합니다. 이후 인스턴스를 종료하고 최종 상태를 확인합니다.

기본 터미널 명령과 VPC, 서브넷, 보안 그룹의 목적을 알고 있어야 합니다. 환경에는 네트워크, Ubuntu 이미지, SSH 키 페어, 애플리케이션이 제공됩니다. 애플리케이션 인스턴스는 직접 만들고 설정합니다.

자격증 시험과의 연관성

이 실습은 AWS Certified Cloud Practitioner CLF-C02 영역 3 시험 목표의 과제 3.1 및 3.3과 관련된 프로그래밍 방식의 AWS 작업과 컴퓨팅 서비스로서의 EC2 선택을 연습합니다. 이미지, 인스턴스 유형, 실행 중인 인스턴스의 차이도 배웁니다.

애플리케이션 인스턴스 시작하기

이 단계에서는 준비된 이미지를 확인하고 제공된 네트워크에 EC2 인스턴스 한 개를 시작합니다.

EC2 인스턴스는 가상 서버입니다. **Amazon Machine Image(AMI)**는 운영 체제와 초기 소프트웨어를 제공합니다. 인스턴스 유형은 컴퓨팅 성능과 메모리 용량의 조합을 지정합니다. 이 입문 애플리케이션에는 작은 범용 인스턴스 유형인 t3.micro를 선택합니다.

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

cd /home/labex/project

launch.env 파일에는 준비된 이미지, 서브넷, 보안 그룹의 식별자가 들어 있습니다. 사용할 리소스를 확인합니다.

cat launch.env

이 값들은 리소스 ID이며 환경마다 다릅니다. 파일의 변수 할당을 읽는 source로 현재 셸에 불러옵니다.

source launch.env

AMI를 확인합니다. --image-ids 옵션은 이미지를 선택하고 --query는 표시할 필드를 제한합니다.

aws ec2 \
  describe-images \
  --image-ids "$AMI_ID" \
  --query 'Images[].{Image:ImageId,Name:Name,Architecture:Architecture}'

이미지 이름 report-server-ubuntu-2204와 아키텍처 x86_64를 찾습니다. 이 이미지에는 Ubuntu와 보고서 애플리케이션이 들어 있으므로 서버 시작과 운영에 집중할 수 있습니다.

서브넷은 인스턴스의 네트워크 위치를 결정합니다. 제공된 보안 그룹은 실습 접근 네트워크에서 포트 22의 SSH와 포트 8081의 애플리케이션 요청을 허용합니다. 키 페어 report-key는 인스턴스에 설치되는 퍼블릭 키를 제공하며, SSH 연결용 프라이빗 키는 프로젝트 디렉터리에 있습니다.

준비된 리소스로 인스턴스 한 개를 시작합니다. --count 1은 서버 한 개를 만들고 태그는 식별하기 쉬운 이름 report-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=report-server}]'

응답에는 새 인스턴스 ID와 초기 상태가 들어 있습니다. 다음 명령에서 사용할 ID를 셸 변수에 저장합니다. $(...) 구문은 괄호 안의 명령을 실행하고 출력을 저장하며, --output text는 ID를 일반 텍스트로 반환합니다.

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=report-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이며 프라이빗 및 퍼블릭 IPv4 주소가 있는지 확인합니다. 아직 pending이면 잠시 기다렸다가 확인 명령을 반복합니다. 프라이빗 주소는 VPC 내부의 서버를 식별하고, 퍼블릭 주소는 실습 접근 네트워크를 통해 연결할 대상입니다.

연결하고 애플리케이션 설정하기

이 단계에서는 SSH로 인스턴스에 연결하고 보고서 애플리케이션의 인사 메시지를 변경한 뒤 AWS View에서 응답을 테스트합니다.

인스턴스의 퍼블릭 IPv4 주소를 가져와 다른 셸 변수에 저장합니다.

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

SSH는 서버와 암호화된 터미널 연결을 만듭니다. Ubuntu 이미지의 로그인 이름은 ubuntu입니다. 제공된 ssh_config는 프라이빗 키와 실습 연결 경로를 선택하며, -F는 SSH에 해당 설정 파일을 읽도록 지시합니다.

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

터미널은 현재 애플리케이션 인스턴스 내부에 있습니다. 로그인 사용자를 확인합니다.

whoami

출력은 ubuntu여야 합니다. 이를 통해 사용자가 labex인 LabEx 터미널과 애플리케이션 인스턴스를 구분할 수 있습니다.

제공된 애플리케이션은 /etc/report-app/config.json에서 인사 메시지를 읽습니다. 이 시스템 파일을 수정하려면 관리자 권한이 필요합니다. sudo tee는 다음 텍스트를 파일에 쓰며, 두 JSON 구분자 사이의 here-document가 해당 텍스트를 제공합니다.

sudo tee /etc/report-app/config.json <<'JSON'
{
  "message": "Hello from EC2"
}
JSON

애플리케이션은 요청마다 이 설정을 다시 읽습니다. curl을 사용해 인스턴스의 루프백 주소로 상태 확인 엔드포인트를 요청합니다.

curl -sS http://127.0.0.1:8081/health

JSON 응답은 Report server 서비스를 식별하고 "message": "Hello from EC2"를 포함해야 합니다. 이를 통해 인스턴스 내부에서 애플리케이션이 설정대로 응답함을 확인합니다.

SSH 세션에서 나와 LabEx 터미널로 돌아갑니다.

exit

AWS View를 열고 Refresh resources를 클릭합니다. 인스턴스 표에서 report-server를 찾습니다. running 상태를 확인하고 퍼블릭 IPv4 주소를 CLI 결과와 비교합니다.

Application requests에서 실행 중인 인스턴스를 선택하고 Check application을 클릭합니다. Hello from EC2를 포함하는 HTTP 200 응답을 확인합니다. 이 요청은 인스턴스의 현재 퍼블릭 주소를 사용하므로 서버 내부 확인에 더해 네트워크를 통한 애플리케이션 동작도 테스트합니다.

AWS View에 실행 중인 report-server와 설정된 애플리케이션 응답이 표시된 모습

확인 예시: 애플리케이션이 HTTP 200과 Hello from EC2를 반환합니다. 리소스 ID와 주소는 다릅니다.

서버 종료하기

이 단계에서는 애플리케이션 인스턴스를 종료하고 더 이상 실행 중이 아닌지 확인합니다.

종료하면 인스턴스가 영구적으로 제거됩니다. 저장한 ID를 사용해 자신의 애플리케이션 서버만 선택합니다.

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

응답에는 이전 상태와 현재 상태가 표시됩니다. AWS CLI는 리소스가 지정된 상태에 도달할 때까지 조회하는 waiter도 제공합니다. 종료가 끝날 때까지 기다립니다.

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

조건이 충족되면 waiter는 출력 없이 종료합니다. 최종 상태를 확인합니다.

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

terminated를 확인합니다. 종료 후에도 인스턴스 기록이 표시될 수 있지만 서버가 계속 실행 중이라는 뜻은 아닙니다.

AWS View에서 Refresh resources를 클릭합니다. 인스턴스는 terminated로 표시되며 더 이상 실행 중인 애플리케이션 대상이 아니어야 합니다. 준비된 네트워크와 키 페어는 그대로 둡니다.

요약

AMI, 인스턴스 유형, 네트워크 리소스, SSH 키 페어로 EC2 인스턴스를 시작했습니다. 서버에 연결해 보고서 애플리케이션을 설정하고 AWS View에서 응답을 확인했습니다. 마지막으로 인스턴스를 종료하고 최종 상태를 확인했습니다.