AWS Elastic Beanstalk에서 Docker core dump file 디스크 용량 초과 트러블 슈팅

김철기·2022년 7월 6일
1

안녕하세요. Gameeye에서 deeplol.gg 서비스를 개발 중인 김철기입니다.
클라우드 서버 인프라 구축, 백엔드 개발, 딥러닝 모델 연구를 담당하고 있습니다.

목자

트러블 슈팅 개요

  • 문제점
  • 해결 방향

Dockerfile to docker-compose

  • docker-compose로 웹서버 빌드하기
  • docker-compose에서 os 환경변수 사용하기
  • core dump file 비활성화

이번 포스팅에서는 Elastic Beanstalk + Docker 플랫폼 환경에서 Docker core dump file이 지속적으로 증가해 디스크 용량을 초과하는 문제를 해결해보도록 하겠습니다.
이전 포스팅들과 다르게 정보전달보다 트러블 슈팅 기록용으로 작성해보려고 합니다.

트러블 슈팅 개요

문제점

API 호출이 많아지면서 서버에서 core dump file을 계속해서 생산했고, 그로 인하여 API 서버의 디스크 용량이 가득차 서버가 동작하지 않는 문제가 발생했습니다.
(🤮 엄청난 양의 파일들...)

일반적으로 core dump file은 프로그램이 비정상적으로 충돌하거나 정지할 때 생성된다고 합니다. 최근 초당 60개 가량 request를 처리하다보니 여러가지 요인(API limit 제한 등..)으로 충돌이 많았나봅니다.

해결 방향

오류가 발생한 내역을 DB에 따로 보관하고 동시에 CloudWatch에서 서버 상태를 체크하고 있기때문에 core dump file을 작은 크기로 제한해 보관하거나 보관하지 않아도 된다고 생각했습니다.
core dump file을 관리하는 방법에는 크게 3가지가 있습니다.

  • 서버를 주기적으로 재구축하는 방법(cron 사용)
  • 서버에서 명령어로 직접 파일을 제거해주는 방법(cron 사용)
  • docker 자체에서 core dump file을 제한하는 방법
  • 서버를 주기적으로 재구축하는 방법
    장점: core dump file의 제거 이외에도 다른 로그 데이터 삭제, 예기치 못한 오류로 동작하지 않는 서버 원상복구
    단점: 재구축하는동안 서비스 불가, 주기내에 용량이 초과할 수 있음

  • 서버에서 명령어로 직접 파일을 제거해주는 방법
    장점: 간단한 쉘 스크립트로 가능(?)
    단점: 주기내에 용량이 초과할 수 있음

  • docker 자체에서 core dump file을 제한하는 방법
    장점: docker 구축 단계에서 간단한 코드 몇 줄이면 근본적인 문제해결 가능
    단점: docker-compose를 사용해야하고 docker-compose로 빌드하면 access log가 생성되지 않음(해결방법이 있을것으로 예상, 방법을 찾는 중...🤔)

첫 번째와 두 번째 방법은 서비스에 직접적인 영향을 줄 수 있는 크리틱한 단점이 있고 근본적인 문제를 해결하는 것이 맞다고 생각해 세 번째 방법을 채택했습니다.

Dockerfile to docker-compose

core dump file 세팅을 Dockerfile에서 할 수 없었기 때문에 기존에 사용하던 Dockerfile을 docker-compose를 통해 빌드해줘야 합니다.

docker-compose로 웹서버 빌드하기

기존에 사용하던 Dockerfile과 같은 뎁스에 docker-compose.yml 파일을 생성해줍니다.
아래 파일로 빌드하면 현재 위치에서 Dockerfile을 찾아 빌드하고 80번 포트로 서비스합니다.

version: "3"
services:
  web:
    build: .
    ports:
      - "80:{Dockerfile EXPOSE}"

docker-compose에서 os 환경변수 사용하기

Dockerfile로 빌드하는 경우 구성에서 설정한 환경변수를 별다른 조치없이 소스에서 사용할 수 있었습니다. docker-compose로 빌드하는 경우에는 환경변수를 environment 구문으로 정의해줘야 합니다.

version: "3"
services:
  web:
    build: .
    ports:
      - "80:{Dockerfile EXPOSE}"
    environment:
      API_ENV: ${API_ENV}
      AWS_ACCESS: ${AWS_ACCESS}
      AWS_SECRET: ${AWS_SECRET}

core dump file 비활성화

마지막으로 가장 중요한 core dump file을 비활성화해주는 구문을 추가합니다.

version: "3"
services:
  web:
    build: .
    ports:
      - "80:{Dockerfile EXPOSE}"
    environment:
      API_ENV: ${API_ENV}
      AWS_ACCESS: ${AWS_ACCESS}
      AWS_SECRET: ${AWS_SECRET}
    ulimits:
      core:
        hard: 0
        soft: 0

완성된 docker-compose.yml 파일로 환경을 구축하게되면 core dump file이 생성되지 않는 설정으로 서버가 구축됩니다.

마무리

간단한 설정을 통해 서버 디스크 용량을 지킬수 있게 되었습니다. access log가 생성되지 않는 것이 마음아프지만 이 부분도 해결할 수 있을 것이라고 생각됩니다. 해결법을 찾으면 포스팅하겠습니다. 감사합니다. 잘못된 부분이나 궁금한 내용이 있으시면 댓글 남겨주세요🙏

profile
Deepveloper, deeplol.gg, fleaman.shop

0개의 댓글