🌥️Cloud Study🌥️/Etc

[ Logging ] 쉘스크립트로 로깅 진행하기(+ 로그로테이트)

L_Chae 2024. 7. 24. 09:25

로깅 Logging

: 시스템의 동작을 기록하고, 발생한 이벤트나 문제를 추적하는 데 사용된다.

 

기능)

이벤트 기록 : 시스템 내에서 발생하는 다양한 이벤트(ex : 오류, 경고, 정보)를 로그 파일에 기록함

디버깅 : 개발자가 코드를 디버깅하거나 문제를 해결하는 데 도움이 됨

감사 추적 : 보안 및 규정 준수 목적으로 시스템 활동을 추적

장기 보관 : 로그를 장기적으로 보관하여 나중에 분석하거나 참조할 수 있음

 

예시)

웹 서버 로그 / 애플리케이션 로그 / 시스템 로그

 

 

로그로테이트 Logrotate

: 로그 파일을 주기적으로 회전(rotating)시켜 용량을 관리하는데 도움을 줌

 

기능)

로그 파일 로테이트 : 로그 파일이 일정 크기에 도달하거나 특정 기간이 경과하면, 새로운 로그 파일을 생성하고 이전 로그 파일을 백업함

백업 보관 : 오래된 로그 파일을 압축하거나 삭제하여 디스크 공간을 절약함

로그 파일 압축 : 개별 애플리케이션이나 서비스의 로그 파일에 대해 고유한 로테이트 정책을 설정할 수 있음

자동화 : cron과 같은 스케줄러를 사용하여 주기적으로 로그로테이트를 실행할 수 있음

 

기본 설정 파일은 `/etc/logrotate.conf`에 위치하며, 여기서 전역 설정을 할 수 있음.

개별 서비스나 애플리케이션의 설정 파일은 `/etc/logrotate.d/` 디렉토리에 위치함.


CPU 사용량, 메모리 사용량, 디스크 사용량을 로깅하는 쉘 스크립트를 작성해서 특정 시간마다 전송하도록 구현해보자.

 

우선 로깅을 수행할 인스턴스를 하나 만들어주었다. (그냥 있던거에 만들어줘도 되는데 나중에 다시 새로 만들어야 할까봐 ... 귀찮으니까...)

 

resource "aws_instance" "A_Logging" { // 로깅 서버
  ami           = "ami-056a29f2eddc40520"
  instance_type = "t2.micro"
  subnet_id     = aws_subnet.Private_A2.id
  key_name      = "KDT_Project2_AWS"

  vpc_security_group_ids = [aws_security_group.private.id]

  tags = {
    Name = "A_Logging"
  }

사양은 위와 같다.

 

 

 

GitHub - lcl1380/Terraform_Code: [ KDT 2024 ] AWS Terraform 코드 백업

[ KDT 2024 ] AWS Terraform 코드 백업. Contribute to lcl1380/Terraform_Code development by creating an account on GitHub.

github.com

다음은 쉘 스크립트를 작성해야 하는데, 파이프라인을 이용할 것이므로 적당히 테라폼 코드 올려두던 깃허브에 올려주었다.

 

흐름은 다음과 같다 :

1. 깃허브 레포지토리에서 CPU 사용량 등을 로깅하는 쉘 스크립트를 작성한다.

2. 젠킨스 파이프라인에서 쉘 스크립트를 각 인스턴스로 전송한다.

3. 각 인스턴스에서는 쉘 스크립트를 실행하고, CPU 사용량 등을 로깅 및 로그로테이션 작업을 진행한다.

4. 로깅 된 내역들은 통합 인스턴스로 보내지고, 로깅 인스턴스는 이메일로 취합한 로그를 보낸다.


sudo 권한 설정

# Jenkins 인스턴스에서
sudo visudo

# root 권한 밑에 추가
jenkins ALL=(ALL) NOPASSWD: ALL

젠킨스는 기본적으로 jenkins라는 계정으로 스크립트 명령을 내리는데,
ubuntu 계정의 소유 요소에는 쓰기 작업 등에 대해 허가가 나지 않는 경우가 있다.

이를 방지하기 위해 jenkins에서 root 비밀번호 없이 사용할 수 있도록 사전에 권한을 부여해주자.

 

+ bash ./log_resource_usage.sh
./log_resource_usage.sh: line 21: /var/log/resource_usage.log: Permission denied

근데 권한 추가해줬음에도 불구하고 pipeline에서 배포를 진행하면 다음과 같은 문제가 발생한다:

눈아프니까 내일 해야지 ...

 


Pipeline 코드 작성

pipeline {
    agent any
    stages {
        stage('Clone') {
            steps {
                git branch: 'main', url: 'https://github.com/lcl1380/Terraform_Code.git'
            }
        }
        stage('Update Crontab') {
            steps {
                sh 'chmod +x log_resource_usage.sh'
                sh 'bash ./log_resource_usage.sh'
            }
        }
        stage('Build') {
            steps {
                sh 'chmod +x log_resource_usage.sh'
                sh 'bash ./log_resource_usage.sh'
            }
        }
        stage('Deploy') {
            when {
                expression { currentBuild.result == null || currentBuild.result == 'SUCCESS' }
            }
            steps {
                sshagent(['KDT_Project2_AWS']) {
                    script {
                        def servers = [
                            '10.0.2.197',
                            '10.0.2.29'
                        ]
                        
                        servers.each { server ->
                            echo "Deploying to ${server}"
                            
                            // Copy the script to the remote server
                            sh "scp -o StrictHostKeyChecking=no log_resource_usage.sh ubuntu@${server}:/home/ubuntu"
                            
                            // Execute the script on the remote server
                            sh "ssh -o StrictHostKeyChecking=no ubuntu@${server} 'chmod +x /home/ubuntu/log_resource_usage.sh && /home/ubuntu/log_resource_usage.sh'"
                        }
                    }
                }
            }
        }
    }
    post {
        success {
            echo "Deployment succeeded"
        }
        failure {
            echo "Deployment failed"
        }
    }
}

 

master일 경우에는 그냥 git '링크.git'으로 끝난다.

인스턴스 프라이빗 IP와 github 프로젝트의 최상위 브랜치가 `main`인지 `master`인지에 따라 pipeline에서 사용하는 명령어가 다르므로 잘 확인해주자.

헷갈릴 경우 파이프라인 입력 박스 아래의 `Pipeline Syntax`를 활용하는 방법도 있다.


Cronjob 등록