안녕하세요 베스핀글로벌 클라우드 기술지원팀 Han입니다.
EC2 인스턴스에 문제가 발생했을 때 효과적으로 진단하고 해결할 수 있는 셀프 점검 방법을 개선된 명령어와 접근법으로 안내해 드리겠습니다.
1. 인스턴스 상태 및 종료 이유 확인
AWS 콘솔을 통한 확인 방법
- AWS 콘솔에 로그인하여 EC2 서비스로 이동
- 왼쪽 탐색 창에서 "인스턴스" 선택
- 문제가 있는 인스턴스를 선택
- 하단 세부 정보 패널에서 "상태 확인" 탭 확인
- "상태 확인" 탭에서 현재 인스턴스 상태 및 실패 이유 확인 가능
- 종료된 인스턴스의 경우 "설명" 탭에서 "상태 전환 이유" 필드 확인
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 로그 확인 (콘솔)
- AWS 콘솔에서 CloudWatch 서비스로 이동
- 왼쪽 탐색 창에서 "로그" 선택
- 해당 인스턴스의 로그 그룹 선택
- 최근 로그 스트림 확인하여 오류 메시지 분석
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 메트릭 확인 (콘솔)
- CloudWatch 서비스에서 "지표" 선택
- "EC2" 네임스페이스 선택
- **"인스턴스별 지표"**에서 문제 인스턴스 선택
- 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. 연결 문제 진단
보안 그룹 확인 (콘솔)
- EC2 대시보드에서 문제 인스턴스 선택
- "보안" 탭 선택
- 연결된 보안 그룹 확인 및 인바운드/아웃바운드 규칙 검토
보안 그룹 확인 (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 확인 (콘솔)
- VPC 서비스로 이동
- 왼쪽 탐색 창에서 "네트워크 ACL" 선택
- 인스턴스가 속한 서브넷의 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 볼륨 상태 확인 (콘솔)
- EC2 대시보드에서 왼쪽 탐색 창의 "볼륨" 선택
- 인스턴스에 연결된 볼륨 선택
- "상태" 열에서 볼륨 상태 확인
EBS 볼륨 상태 확인 (CLI)
# 인스턴스에 연결된 모든 볼륨 확인
aws ec2 describe-volumes --filters "Name=attachment.instance-id,Values=i-1234567890abcdef0" # 볼륨 상태 확인 (문제가 있는 볼륨 찾기)
aws ec2 describe-volume-status --volume-ids vol-1234567890abcdef0
5. 인스턴스 시작 문제 해결
사용자 데이터 스크립트 확인 (콘솔)
- EC2 대시보드에서 인스턴스 선택
- "작업" > "인스턴스 설정" > "사용자 데이터 보기" 선택
- 시작 스크립트에 오류가 있는지 검토
사용자 데이터 스크립트 확인 (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. 인스턴스 복구 옵션
인스턴스 재부팅 (콘솔)
- EC2 대시보드에서 인스턴스 선택
- "인스턴스 상태" > "인스턴스 재부팅" 선택
인스턴스 재부팅 (CLI)
aws ec2 reboot-instances --instance-ids i-1234567890abcdef0
인스턴스 중지 후 시작 (콘솔)
- EC2 대시보드에서 인스턴스 선택
- "인스턴스 상태" > "인스턴스 중지" 선택
- 인스턴스가 중지되면 "인스턴스 상태" > "인스턴스 시작" 선택
인스턴스 중지 후 시작 (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 인스턴스 문제를 효과적으로 진단하고 해결할 수 있습니다. 모니터링 시스템을 구축하여 문제를 사전에 감지하고 대응하는 것이 장기적으로 가장 효과적인 전략입니다.