back-end/Monitoring

[Crontab] log backup to S3

icandle 2024. 11. 14. 16:44

Intro

서버에 남겨지는 로그 파일들을 주기적인 배치작업으로 S3에 백업하고자 했다. 간단하게 linux 환경에서 사용할 수 있는 crontab을 사용했다. 로그 작성할때마다 S3에 보내는것 보다는, 서버에 바로 로그를 남기고 몇일에 한번씩 해당 파일들을 백업해서 옮기는 것이 운영서버에 성능 부하를 덜 발생시킬 것이라고 생각했다.

 

서버 환경

- AWS amazon linux2 EC2

 

우선 수동으로 python으로 작성한 backupLog 파일을 실행해본다. 

sudo python /home/path/backupLog_to_s3.py

 

백업 파일은 직접 구현한, S3 API를 사용하여 파일을 저장하는 StorageS3 모듈을 사용한다.

# -*- coding: utf-8 -*-
from core.s3 import StorageS3
import os

def backup_logs_to_s3():
    """서버 로컬 log AWS S3에 백업
    """    
    logs_directory = "logs/" 
    # logs 폴더의 파일들을 순회
    for file_name in os.listdir(logs_directory):

        # 로그 파일 이름이 'service.log.날짜' 형식인지 확인
        if file_name.startswith("service.log."):
            file_path = os.path.join(logs_directory, file_name)
            
            # 파일이 실제 파일인지 확인
            if os.path.isfile(file_path):
                # S3로 파일 업로드
                with open(file_path, 'rb') as file:     
                    s3 = StorageS3(media_root="logs/")
                    file_name += '.txt' #txt 확장자 추가
                    file_path = s3.upload(file, f"{file_name}")

 

 

파일이 정상적으로 잘 실행된다면, cron 파일 생성 및 작성한다.

#파일 편집하기
sudo vi /etc/crontab 

 

cron 스케줄링 주기 설정에 맞게 작성한다. 

sh 파일 실행하고 backup_log_output.log에 cron 실행 로그를 남기는 예시이다.

#매주 일요일 새벽 4시에 실행
0 4 * * 0 root sh /home/path/backup_log.sh >> /home/path/backup_log_output.log 2>&1

 

cron 예시

30 10,22 * * * /home/user/test.sh
  • 매일 오전 10시 30분, 오후 10시 30분에 /home/user/test.sh 를 수행.

*/10 * * * * /home/user/test.sh

  • 10분 마다 /home/user/test.sh 를 수행.

##0 8 * * 1-5 /home/user/test.sh

  • 평일(월~금요일) 8:00 시에 /home/user/test.sh 를 수행.

 

마지막으로, cron 파일을 수정 후에 cron 서비스를 재시작 합니다.

sudo systemctl restart crond