Post

클라우드활용 5주차 — AWS EC2: 인스턴스 배포·웹서버·커스텀 AMI

키페어·보안그룹부터 run-instances(t2.micro), user-data 부팅 구성, SSH 접속, CloudWatch 모니터링, 커스텀 AMI 생성까지 EC2를 CLI로 다뤄 본 5주차 기록.

클라우드활용 5주차 — AWS EC2: 인스턴스 배포·웹서버·커스텀 AMI

5주차는 AWS의 핵심 컴퓨팅 서비스 EC2(Elastic Compute Cloud) 를 다룬다. 강의는 콘솔(GUI) 기반이지만 여기서는 AWS CLI로 진행했다. 키페어·보안그룹부터 run-instances(프리티어 t2.micro), user-data 부팅 구성, SSH 접속, CloudWatch 모니터링, 커스텀 AMI 생성 까지 다뤘다. 모든 자원은 끝에서 종료·삭제했고, 계정 ID·공인 IP는 일부 가렸다.

핵심 개념

  • Amazon EC2: 클라우드에서 가상 서버(인스턴스)를 임대하는 컴퓨팅 서비스. 필요할 때 켜고 끄며 사용량만큼 과금한다.
  • AMI(Amazon Machine Image): 인스턴스를 만드는 OS + 설정 템플릿. 실행 중인 인스턴스로부터 커스텀 AMI 를 떠서 동일 환경을 복제할 수 있다.
  • 인스턴스 타입: t2.micro 처럼 패밀리(t)+세대(2)+크기(micro) 로 사양을 표기. 본 실습은 프리티어 t2.micro(1 vCPU/1GB).
  • 스토리지: EBS(영속 블록 스토리지) vs 인스턴스 스토어(임시, 중지 시 소실).
  • 보안 그룹: 인스턴스 방화벽. 인바운드 SSH=내 IP만(/32), HTTP=0.0.0.0/0.
  • 키 페어: SSH 공개키 인증(개인키 .pem 은 로컬 보관, 권한 600).
  • user-data: 인스턴스 최초 부팅 시 실행되는 스크립트. 본 실습은 user-data로 httpd 설치 + 페이지 배포를 자동화했다.

EC2 다루기

서울 리전 ap-northeast-2, --profile clouduse 로 실행했다.

키 페어 + 보안 그룹 생성

1
2
3
4
5
6
7
8
9
$ aws ec2 create-key-pair --key-name clouduse-week5-key \
    --query "KeyMaterial" --output text > clouduse-week5-key.pem
$ chmod 600 clouduse-week5-key.pem          # 개인키 권한 제한

$ aws ec2 create-security-group --group-name clouduse-week5-sg \
    --description "clouduse week5 lab" --query "GroupId" --output text
sg-05f590b54b1b20eef
$ aws ec2 authorize-security-group-ingress --group-id sg-05f5... --protocol tcp --port 22 --cidr <내IP>/32   # SSH=내 IP만
$ aws ec2 authorize-security-group-ingress --group-id sg-05f5... --protocol tcp --port 80 --cidr 0.0.0.0/0    # HTTP=전체

AMI 조회 + 인스턴스 배포 (user-data 부팅 구성)

부팅 시 httpd를 설치하고 페이지를 배포하는 user-data 스크립트를 함께 전달했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ aws ec2 describe-images --owners amazon \
    --filters "Name=name,Values=al2023-ami-2023.*-x86_64" "Name=state,Values=available" \
    --query "sort_by(Images, &CreationDate)[-1].ImageId" --output text
ami-09ec11229c1cf3485                     # 최신 Amazon Linux 2023

$ aws ec2 run-instances --image-id ami-09ec... --instance-type t2.micro \
    --key-name clouduse-week5-key --security-group-ids sg-05f5... \
    --user-data file://user-data.sh \
    --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=clouduse-week5}]' \
    --query "Instances[0].InstanceId" --output text
i-0190efb644132a011

$ aws ec2 wait instance-running --instance-ids i-0190... && \
  aws ec2 describe-instances --instance-ids i-0190... \
    --query "Reservations[0].Instances[0].[InstanceId,InstanceType,State.Name,PublicIpAddress,Placement.AvailabilityZone]"
i-0190efb644132a011   t2.micro   running   <PublicIP>   ap-northeast-2c

외부에서 웹 접속 확인

1
2
3
4
5
$ curl -s -o /dev/null -w "%{http_code}\n" http://<PublicIP>
200
$ curl -s http://<PublicIP> | grep -E "h1|t2.micro"
클라우드활용 5주차 — AWS EC2 웹서버
t2.micro(프리티어) 인스턴스에서 서빙합니다.

브라우저로 퍼블릭 IP에 접속하면 user-data로 자동 구성된 페이지가 표시된다.

EC2(t2.micro)에서 httpd로 서빙한 웹페이지 Amazon Linux 2023 + Apache httpd가 t2.micro 인스턴스에서 제공하는 페이지.

SSH 접속 + 원격 확인

1
2
3
4
5
$ ssh -i clouduse-week5-key.pem ec2-user@<PublicIP> '...'
[remote] hostname: ip-172-31-39-26.ap-northeast-2.compute.internal
[remote] whoami: ec2-user
[remote] OS: Amazon Linux 2023.12.20260611
[remote] httpd: active

키 페어 개인키로 SSH 인증에 성공했고, 원격에서 OS·httpd 상태를 확인했다.

모니터링 (상태검사 + CloudWatch)

1
2
3
4
5
6
7
$ aws ec2 describe-instance-status --instance-ids i-0190... \
    --query "InstanceStatuses[0].[InstanceState.Name,InstanceStatus.Status,SystemStatus.Status]" --output text
running   ok   ok                         # 인스턴스/시스템 상태검사 통과

$ aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization \
    --dimensions Name=InstanceId,Value=i-0190... --period 300 --statistics Average Maximum
13.28   13.28   Percent                    # CloudWatch가 수집한 CPU 지표

커스텀 AMI 생성

실행 중인 인스턴스를 템플릿으로 떠서 동일 환경을 복제할 수 있는 AMI를 만들었다.

1
2
3
4
5
6
$ aws ec2 create-image --instance-id i-0190... --name clouduse-week5-custom \
    --description "week5 custom AMI from running instance" --no-reboot --query "ImageId" --output text
ami-074b46cccaac37576

$ aws ec2 describe-images --image-ids ami-074b... --query "Images[0].[ImageId,State,Name]" --output text
ami-074b46cccaac37576   pending   clouduse-week5-custom    # My AMIs 에 등록(pending→available)

create-image 는 AMI + 루트 볼륨 스냅샷 을 함께 만들기 때문에, 정리 시 둘 다 삭제해야 한다.

정리 — 모든 자원 삭제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ aws ec2 wait image-available --image-ids ami-074b...        # 스냅샷 ID 확보용 대기
  AMI=ami-074b46cccaac37576  연결 스냅샷=snap-01186c4376defd87d

$ aws ec2 terminate-instances --instance-ids i-0190...        → shutting-down
$ aws ec2 wait instance-terminated --instance-ids i-0190...   → 종료 완료
$ aws ec2 deregister-image --image-id ami-074b...             → Return: true
$ aws ec2 delete-snapshot   --snapshot-id snap-0118...        → 삭제됨
$ aws ec2 delete-security-group --group-id sg-05f5...         → Return: true
$ aws ec2 delete-key-pair --key-name clouduse-week5-key       → Return: true
$ rm -f clouduse-week5-key.pem                                # 로컬 개인키 삭제

$ aws ec2 describe-instances --filters "Name=instance-state-name,Values=running,pending" \
    --query "Reservations[].Instances[].InstanceId" --output text
(없음 — 남은 자원 0개)

정리

4주차에서 만든 IAM 권한 위에서, 이번엔 실제 컴퓨팅 자원(EC2)을 직접 임대해 띄웠다. user-data 로 부팅을 자동화하면 SSH로 일일이 설치할 필요 없이 띄우자마자 서빙되는 서버가 된다. 커스텀 AMI 는 동일한 서버를 여러 대 복제할 때 쓰지만, AMI를 만들면 스냅샷도 같이 생기므로 정리 때 deregister-image + delete-snapshot 을 모두 해야 숨은 스토리지 과금이 남지 않는다. 실습 직후 describe-instances 로 running 0개를 확인해 프리티어 범위 안에서 정리했다.

This post is licensed under CC BY 4.0 by the author.