안녕하세요 베스핀글로벌 클라우드 기술지원팀 Han입니다.


EC2 인스턴스에 문제가 발생했을 때 효과적으로 진단하고 해결할 수 있는 셀프 점검 방법을 개선된 명령어와 접근법으로 안내해 드리겠습니다.

1. 인스턴스 상태 및 종료 이유 확인

AWS 콘솔을 통한 확인 방법

  1. AWS 콘솔에 로그인하여 EC2 서비스로 이동
  2. 왼쪽 탐색 창에서 "인스턴스" 선택
  3. 문제가 있는 인스턴스를 선택
  4. 하단 세부 정보 패널에서 "상태 확인" 탭 확인
  5. "상태 확인" 탭에서 현재 인스턴스 상태 및 실패 이유 확인 가능
  6. 종료된 인스턴스의 경우 "설명" 탭에서 "상태 전환 이유" 필드 확인

AWS CLI를 통한 확인 방법

* 본 가이드는 인스턴스 ID i-1234567890abcdef0를 가정하고 작성 되었습니다. 조회 할 인스턴스 ID로 치환 하셔서 사용 하셔야 합니다.

인스턴스 상태 확인 (모든 상태 포함):

aws ec2 describe-instance-status --instance-ids i-1234567890abcdef0 --include-all-instances

종료 이유 간결하게 확인:

aws ec2 describe-instances --instance-ids i-1234567890abcdef0 --query 'Reservations[].Instances[].StateReason.Message' --output text

인스턴스 콘솔 출력 확인 (최신 로그):

aws ec2 get-console-output --instance-id i-1234567890abcdef0 --latest

2. 시스템 로그 및 메트릭 분석

CloudWatch 로그 확인 (콘솔)

  1. AWS 콘솔에서 CloudWatch 서비스로 이동
  2. 왼쪽 탐색 창에서 "로그" 선택
  3. 해당 인스턴스의 로그 그룹 선택
  4. 최근 로그 스트림 확인하여 오류 메시지 분석

CloudWatch 로그 확인 (CLI)

# 먼저 사용 가능한 로그 그룹 확인 
aws logs describe-log-groups --log-group-name-prefix /aws/ec2 
# 특정 로그 그룹의 스트림 확인 
aws logs describe-log-streams --log-group-name /aws/ec2/your-group 
# 로그 이벤트 가져오기 
aws logs get-log-events --log-group-name /aws/ec2/your-group --log-stream-name your-stream --limit 100

CloudWatch 메트릭 확인 (콘솔)

  1. CloudWatch 서비스에서 "지표" 선택
  2. "EC2" 네임스페이스 선택
  3. **"인스턴스별 지표"**에서 문제 인스턴스 선택
  4. CPU 사용률, 네트워크 트래픽, 디스크 I/O 등 주요 지표 확인

CloudWatch 메트릭 확인 (CLI, 동적 시간 설정)

# 현재 시간을 기준으로 지난 1시간 데이터 조회 
start_time=$(date -u -d '1 hour ago' '+%Y-%m-%dT%H:%M:%SZ') end_time=$(date -u '+%Y-%m-%dT%H:%M:%SZ') 
aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization \  --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \  --start-time $start_time --end-time $end_time --period 300 --statistics Average

3. 연결 문제 진단

보안 그룹 확인 (콘솔)

  1. EC2 대시보드에서 문제 인스턴스 선택
  2. "보안" 탭 선택
  3. 연결된 보안 그룹 확인 및 인바운드/아웃바운드 규칙 검토

보안 그룹 확인 (CLI) Bash

# 인스턴스에 연결된 보안 그룹 ID 가져오기 
sg_ids=$(aws ec2 describe-instances --instance-ids i-1234567890abcdef0 --query 'Reservations[].Instances[].SecurityGroups[].GroupId' --output text) 
# 각 보안 그룹의 상세 규칙 확인 
for sg_id in $sg_ids; do  
echo "보안 그룹 $sg_id의 규칙:"  
aws ec2 describe-security-groups --group-ids $sg_id 
done

네트워크 ACL 확인 (콘솔)

  1. VPC 서비스로 이동
  2. 왼쪽 탐색 창에서 "네트워크 ACL" 선택
  3. 인스턴스가 속한 서브넷의 ACL 규칙 검토

네트워크 ACL 확인 (CLI)

# 인스턴스의 서브넷 ID 찾기 
subnet_id=$(aws ec2 describe-instances --instance-ids i-1234567890abcdef0 --query 'Reservations[].Instances[].SubnetId' --output text) 
# 서브넷에 연결된 NACL 찾기 
aws ec2 describe-network-acls --filters "Name=association.subnet-id,Values=$subnet_id"

4. 리소스 상태 점검

시스템 상태 점검 (인스턴스 접속 가능한 경우)

SSH 또는 EC2 Instance Connect를 통해 인스턴스에 접속한 후:

# 시스템 부하 및 리소스 사용 확인 
uptime 
# CPU 정보 및 코어 확인 
lscpu 
# 메모리 사용량 확인 
free -h 
# 디스크 상태 및 용량 확인 
df -h 
# 디스크 I/O 상태 확인 
iostat -x 1 5 
# 네트워크 연결 및 포트 상태 확인 
netstat -tuln 
# 시스템 이벤트 로그 확인 
dmesg | tail 
# 주요 시스템 로그 확인 
tail -n 100 /var/log/syslog   # Ubuntu/Debian tail -n 100 /var/log/messages # Amazon Linux/RHEL/CentOS

인스턴스 메타데이터 확인 (인스턴스 내부에서)

# IMDSv2 토큰 생성 
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` 
# 인스턴스 유형 확인 
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-type 
# 인스턴스 ID 확인 
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id 
# 예약된 이벤트 확인 (스팟 인스턴스 종료 예정 등) 
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/spot/termination-time

EBS 볼륨 상태 확인 (콘솔)

  1. EC2 대시보드에서 왼쪽 탐색 창의 "볼륨" 선택
  2. 인스턴스에 연결된 볼륨 선택
  3. "상태" 열에서 볼륨 상태 확인

EBS 볼륨 상태 확인 (CLI)

# 인스턴스에 연결된 모든 볼륨 확인 
aws ec2 describe-volumes --filters "Name=attachment.instance-id,Values=i-1234567890abcdef0" 
# 볼륨 상태 확인 (문제가 있는 볼륨 찾기) 
aws ec2 describe-volume-status --volume-ids vol-1234567890abcdef0

5. 인스턴스 시작 문제 해결

사용자 데이터 스크립트 확인 (콘솔)

  1. EC2 대시보드에서 인스턴스 선택
  2. "작업" > "인스턴스 설정" > "사용자 데이터 보기" 선택
  3. 시작 스크립트에 오류가 있는지 검토

사용자 데이터 스크립트 확인 (CLI)

# 사용자 데이터를 가져와서 자동으로 디코딩 
aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData \  --query 'UserData.Value' --output text | base64 --decode

시스템 및 인스턴스 상태 확인 상세 조회

aws ec2 describe-instance-status --instance-ids i-1234567890abcdef0 --include-all-instances \  --query 'InstanceStatuses[].{InstanceId:InstanceId,InstanceState:InstanceState.Name,SystemStatus:SystemStatus.Status,InstanceStatus:InstanceStatus.Status,Details:SystemStatus.Details}'

6. 인스턴스 복구 옵션

인스턴스 재부팅 (콘솔)

  1. EC2 대시보드에서 인스턴스 선택
  2. "인스턴스 상태" > "인스턴스 재부팅" 선택

인스턴스 재부팅 (CLI)

aws ec2 reboot-instances --instance-ids i-1234567890abcdef0

인스턴스 중지 후 시작 (콘솔)

  1. EC2 대시보드에서 인스턴스 선택
  2. "인스턴스 상태" > "인스턴스 중지" 선택
  3. 인스턴스가 중지되면 "인스턴스 상태" > "인스턴스 시작" 선택

인스턴스 중지 후 시작 (CLI)

# 인스턴스 중지 
aws ec2 stop-instances --instance-ids i-1234567890abcdef0 
# 인스턴스 상태 확인 (중지 완료 대기) 
aws ec2 describe-instances --instance-ids i-1234567890abcdef0 --query 'Reservations[].Instances[].State.Name' --output text 
# 인스턴스 시작 
aws ec2 start-instances --instance-ids i-1234567890abcdef0

7. 이벤트 히스토리 확인

CloudTrail을 통한 인스턴스 관련 이벤트 확인

# 인스턴스 관련 최근 이벤트 조회 
aws cloudtrail lookup-events --lookup-attributes AttributeKey=ResourceName,AttributeValue=i-1234567890abcdef0

EC2 인스턴스 이벤트 알림 확인

# 예약된 인스턴스 이벤트 확인 
aws ec2 describe-instance-status --instance-ids i-1234567890abcdef0 --filter Name=event.code,Values=system-reboot,system-maintenance,instance-reboot,instance-retirement

8. 자동화된 모니터링 설정

CloudWatch 알람 설정 (CLI)

# 현재 시간 기준으로 동적으로 알람 설정 
aws cloudwatch put-metric-alarm --alarm-name "EC2-CPU-Alarm-$(date +%Y%m%d)" \  --alarm-description "Alarm when CPU exceeds 80%" \  --metric-name CPUUtilization --namespace AWS/EC2 \  --statistic Average --period 300 --threshold 80 \  --comparison-operator GreaterThanThreshold \  --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \  --evaluation-periods 2 \  --alarm-actions arn:aws:sns:region:account-id:topic-name

CloudWatch 대시보드 생성 (CLI)

# EC2 인스턴스 모니터링 대시보드 생성 
aws cloudwatch put-dashboard --dashboard-name "EC2-Monitor-$(date +%Y%m%d)" \  --dashboard-body '{"widgets":[{"type":"metric","x":0,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-1234567890abcdef0"]],"period":300,"stat":"Average","region":"region","title":"CPU Utilization"}}]}'

실용적인 진단 팁

1. 리전 및 프로필 문제 해결

# 특정 리전 지정 
aws ec2 describe-instances --region ap-northeast-2 
# 프로필 지정 
aws ec2 describe-instances --profile your-profile-name 
# 현재 설정된 리전 및 프로필 확인 
aws configure list

2. 효과적인 필터링과 출력 형식

# 인스턴스 ID, 상태, 종료 이유만 필터링 
aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId,State.Name,StateReason.Message]' --output table 
# 특정 상태의 인스턴스만 조회 (예: 종료 중인 인스턴스) 
aws ec2 describe-instances --filters "Name=instance-state-name,Values=shutting-down,stopping,stopped,terminated" --output table

3. jq를 활용한 고급 필터링

# 모든 인스턴스의 상태와 문제 요약 (jq 필요) 
aws ec2 describe-instances | jq '.Reservations[].Instances[] | {InstanceId: .InstanceId, State: .State.Name, StateReason: .StateReason.Message, StatusChecks: .StatusChecks}'

4. 인스턴스 로그 취합 및 분석

# 시스템 로그 취합 스크립트 예시 (인스턴스 내부에서) 
sudo bash -c "echo '=== System Info ==='; uname -a; echo; \ echo '=== CPU Info ==='; lscpu; echo; \ echo '=== Memory Info ==='; free -h; echo; \ echo '=== Disk Info ==='; df -h; echo; \ echo '=== Last Boot Log ==='; dmesg | tail -n 50; echo; \ echo '=== Recent System Log ==='; tail -n 100 /var/log/syslog 2>/dev/null || tail -n 100 /var/log/messages; \ echo '=== Process List ==='; ps aux --sort=-%cpu | head -n 20" > ec2-diagnostic-$(hostname)-$(date +%Y%m%d).log

결론

위 명령어들은 실제 AWS 환경에서 검증된 것으로, EC2 인스턴스 문제 진단에 효과적으로 활용할 수 있습니다. 명령어 실행 시 권한, 리전 설정, 인스턴스 상태 등에 따라 출력이 달라질 수 있으므로, 필요에 따라 파라미터를 조정하시기 바랍니다.

체계적인 진단 접근법과 이러한 도구를 활용하면 대부분의 EC2 인스턴스 문제를 효과적으로 진단하고 해결할 수 있습니다. 모니터링 시스템을 구축하여 문제를 사전에 감지하고 대응하는 것이 장기적으로 가장 효과적인 전략입니다.