[EC2] AWS EC2에 네트워크 트래픽 스파이크와 CPU 크레딧소모로 인한 서버 다운 해결 방법

2025. 8. 28. 22:04·IT 기술

들어가며

EC2에 t2.micro 인스턴스를 올려놓고 스테이징용 백엔드 서버로 쓰고 있었다. 그런데 어느 순간 보니 서버가 죽어 있는 것 아닌가? 인스턴스 모니터링을 보니, 네트워크 패킷 입력 그래프에 뾰족한 것이 보였다. 지금 서비스가 돌아가고 있는 서버도 아닌데, 아이고...

0. 자세한 상황

  • 네트워크 패킷 입력에 스파이크 나타남
  • 같은 시간대에 CPU 사용률 100% 달성
  • 이후 CPU 크레딧이 0을 향해 달려감
  • 서버 다운되어 접근 불가능해짐

아... 다시 봐도 머리가 아프다.

1. 예상 원인 분석

DDoS인가?
보통 필자가 겪은 가장 흔한 원인은 SecurityGroup(보안 그룹) 설정이 미흡해 랜덤 DDOS에 치이는 경우다. 그런데 본인은 이미 이를 몇 번 당해봐서 이 문제는 절대 아님을 확신할 수 있었다. 혹시 몰라 더블 체크를 했으나 당연히 문제는 없었다.

 

그럼 코드 탓인가?
그게 아니라면 인스턴스에 올라간 애플리케이션 내부 무한루프 내지는 메모리 누수가 있을 수 있다. 하지만 네트워크 패킷에 스파이크가 찍히기 전까진 고요했으니 이것도 원인이라고 할 수는 없겠다. 당장 인스턴스에 올라간 건 REST API 서버 정도였으니, 무한루프가 터지기가 더 어렵지 않을까.

결국 이리저리 분석하다 발견한 원인은 다른 무언가였으니...

2. 실제 원인 분석 과정

우선 내가 놓치고 있는 무언가가 있는지, 혹시 몰라 열린 경로를 찾아보았다.
이 글을 읽고 계신 분들 중, SecurityGroup 설정이 미흡(0.0.0.0/0으로 열어둔다던가...)한 경우 아래 명령어로 잡히는 리스닝 소켓들을 막거나, SecurityGroup 부분을 제대로 설정하면 DDoS 공격을 막을 수 있을 것이다.

$ ss -tulpn | grep 0.0.0.0

 

필자는 다른 경우였으니 다음으로 넘어가자.

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           957Mi       827Mi        67Mi       1.1Mi       219Mi       130Mi
Swap:             0B          0B          0B

 

벌써 느낌이 온다. 인스턴스를 재부팅했는데도 저렇게 메모리 압박이 다가온다.

우선 CPU가 터져나간 이유는 아마도 메모리가 먼저 터졌기 때문이리라.

실제로 무슨 일이 일어났는지는 페이징과 스레싱에 대해 따로 찾아보도록 하자. CS 만세.

 

대략 인스턴스의 사망 원인은 알아냈다. 그런데 메모리가 왜 터져나갔을까? 네트워크 트래픽은 왜 솟구쳤는가? 여기에 대한 문제가 해결되지 않았다. 네트워크 트래픽이 몰린 시간대를 보고 관련 네트워크 로그를 딸 수 있는 것들을 찾아봤다.

$ sudo journalctl --since "2 days ago" | grep -i "network\|traffic\|ddos\|attack"

 

아웃풋은 지극히 정상적인 Docker 활동이었다. 다음.

$ sudo docker-compose logs app --since 24h | head -100

 

애플리케이션 로그. 여기도 깨끗하다. 다음.

$ cat /proc/net/dev

 

네트워크 인터페이스 로그...는 봐도 잘 모르겠다. 다음.

# 네트워크 트래픽이 몰린 06:20~06:30 시간대 모든 로그
sudo journalctl --since "2025-08-28 06:20:00" --until "2025-08-28 06:30:00"

# Docker 컨테이너 로그 (해당 시간대)
sudo docker-compose logs --since "2025-08-28T06:20:00" --until "2025-08-28T06:30:00"

# 시스템 리소스 관련 로그
sudo journalctl --since "2025-08-28 06:20:00" --until "2025-08-28 06:30:00" | grep -i "cpu\|memory\|oom\|kill"

 

드디어 단서를 잡을 수 있었다. 로그를 정리해보자면 다음과 같다.

  1. cron-daily 작업 시작
  2. apt-daily-upgrade 작업 시작
  3. PackageKit 데몬 시작
  4. fwupd 서비스 재시작 (155.1M 메모리 사용)
  5. 메모리 압박으로 캐시 플러시

요약하자면 데일리 시스템 업데이트가 크론잡으로 돌았고, 이때 여러 시스템 서비스가 동시에 돌면서 메모리가 터진 것이다.

그 이후는 직전에 언급한대로...

3. 해결 - 업데이트 비활성화

그리 오래 쓸 인스턴스도 아니고, 프라이빗하게 사용하는 인스턴스인데 굳이 무언가 몸을 비틀 필요는 없다고 생각했다.
자동 업데이트를 꺼버리면 해결되는 것 아닌가?

# 자동 업데이트 비활성화
sudo systemctl disable apt-daily-upgrade.service

# 타이머도 비활성화
sudo systemctl disable apt-daily-upgrade.timer
sudo systemctl stop apt-daily-upgrade.timer

# apt-daily 관련 모든 서비스/타이머 비활성화
sudo systemctl disable apt-daily.timer
sudo systemctl stop apt-daily.timer

 

이와 별개로 t2.micro의 메모리 할당량에 대한 기억을 되찾았으니, 바로 Swap space까지 걸어주도록 하자.

Swap space 설정하기

# 128M * 16 = 2GB
sudo dd if=/dev/zero of=/swapfile bs=128M count=16

sudo chmod 600 /swapfile

sudo mkswap /swapfile

sudo swapon /swapfile

sudo swapon -s

 

Swap space 설정이 끝났다.
Swapfile용 파일을 만들고, 권한 잡고, 적용하고, 활성화했다. 마지막은 잘 되었는지 로그 확인용이다. 지금은 2GB로 설정했으며, 필요에 따라 수정하면 된다. 인스턴스 재부팅 이후에도 계속 Swap space를 적용하려면 아래 작업을 진행하자.

sudo vi /etc/fstab

 

위 명령어 입력 후 나타난 vi에  /swapfile swap swap defaults 를 작성하고 저장하자.

free

 

명령어로 Swap space가 잘 적용되었는지 확인하자.

 

맺으며

https://www.youtube.com/watch?v=n3-oeEJWgc0

 

어째 AWS, 특히 t2.micro는 매번 쓸 때마다 별 일이 다 생기는 기분이다. 언제쯤 되어야 이런 일들을 겪지 않을 수 있을지...

 

Reference

https://diary-developer.tistory.com/32 - Swapfile 생성 및 Swap Space 설정

'IT 기술' 카테고리의 다른 글

[Windows] ngrok 기반 리버스 SSH 터널을 통한 원격 접속 방법  (3) 2025.08.27
[Mac] Access denied for user 'root' @'localhost ' (using password: YES) 오류 해결  (0) 2025.08.20
npm run dev 시 EACCES: Permission Denied 포트 충돌 해결방법  (0) 2025.07.13
구글 시트를 활용한 홈페이지 폼 데이터 수집 시스템 구축하기  (0) 2025.06.21
AWS Eventbridge 일정으로 여러 Lambda 동시에 실행하기  (0) 2025.04.11
'IT 기술' 카테고리의 다른 글
  • [Windows] ngrok 기반 리버스 SSH 터널을 통한 원격 접속 방법
  • [Mac] Access denied for user 'root' @'localhost ' (using password: YES) 오류 해결
  • npm run dev 시 EACCES: Permission Denied 포트 충돌 해결방법
  • 구글 시트를 활용한 홈페이지 폼 데이터 수집 시스템 구축하기
시남
시남
개발하는 사람입니다. 하고 싶은 것들 사이에서 매번 선택하는 삶을 살고 있습니다.
  • 시남
    Refactor Life like code.
    시남
  • 전체
    오늘
    어제
    • 분류 전체보기 (22)
      • IT 기술 (10)
        • Spring boot (5)
      • 이야기 (3)
      • 독서 (0)
      • 개발일기 (4)
        • 1D3Q (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    기획
    H2DB
    Ai
    reverse tunnel
    Spring
    springboot h2
    h2 console
    1인개발
    bootrun
    AWS
    ai 검색
    h2 콘솔
    로켓방정식의 저주
    root@localhost
    리버스 터널링
    바이브코딩
    java
    사이드프로젝트
    프롬프트 엔지니어링
    vibe coding
    gradle-wrapper
    h2-console
    1D3Q
    1인기획
    gemini
    코드 하이라이팅
    contentcachingrequestwrapper
    개발일지
    회고
    Spring Boot
  • 최근 댓글

  • 최근 글

  • hELLO By정상우.v4.10.4 관리
시남
[EC2] AWS EC2에 네트워크 트래픽 스파이크와 CPU 크레딧소모로 인한 서버 다운 해결 방법
상단으로

티스토리툴바