본문으로 건너뛰기

Object Storage로 웹서버 로그 적재

Virtual Machine에 배포된 웹서버의 로그를 Object Storage에 적재하는 방식을 자동화하는 스크립트를 작성합니다.

안내
  • 예상 소요 시간: 15분
  • 사용자 환경
    • 권장 운영 체제: MacOS, Ubuntu
    • Region: kr-central-1

사전 준비

이 실습을 진행하기 위해서는 카카오클라우드 콘솔에서 액세스 키VM 접근용 키 페어를 확인해야 합니다.

Step 1. VM 기반 웹 서비스 구성

이전 튜토리얼 VM 기반의 웹 서비스 구성 문서를 참고하여, 웹 서버 환경을 구성합니다. 해당 문서에 안내된 리소스 사양은 운영체제(ubuntu 20.04)를 제외하고 필요에 따라 적절히 변경하여 진행할 수 있습니다.

Step 2. 웹 서비스에 SSH 접속

ssh를 이용하여 웹서버에 접속합니다. 퍼블릭 IP를 설정하지 않은 경우 Bastion 호스트 등의 방법으로 접속을 시도합니다. 이 단계는 웹서버가 프로비저닝된 모든 인스턴스에서 동일하게 진행합니다.

# web-1
ssh -i ${PRIVATE_KEY} ubuntu@${WEB1_ENDPOINT}

# web-2
ssh -i ${PRIVATE_KEY} ubuntu@${WEB1_ENDPOINT}

Step 3. Object Storage 환경 설정 스크립트 작성

  1. shell에서 json 포맷의 데이터를 쉽게 사용하기 위해 jq 패키지를 설치합니다.

    sudo apt-get update -y
    sudo apt-get install -y jq
  2. ssh를 통해 인스턴스에 접속한 다음, 로그를 적재할 환경 변수 파일을 작성합니다. 아래 표를 참조하여 환경 변수 중 액세스 키보안 액세스 키를 입력합니다.

    cat << \EOF | sudo tee /tmp/env.sh
    #!/bin/bash

    export ACCESS_KEY="${ACCESS_KEY}"
    export ACCESS_SECRET_KEY="${ACCESS_SECRET_KEY}"

    # Don't Edit
    export BUCKET_NAME="hands-on"
    export FILE="/var/log/nginx/access.log"
    export TOPATH="/log/nginx/date_id=$(date +%Y-%m-%d)/host_id=$(hostname -s)/access.log"
    EOF
    환경 변수 키환경 변수 값
    ${ACCESS_KEY}액세스 키
    ${ACCESS_SECRET_KEY}사용자 보안 액세스 키
  3. Object Storage API 요청을 위해 API 인증 토큰프로젝트 ID를 작성합니다.

    • 환경변수 파일에 작성한 ‘액세스 키’와 ‘사용자 보안 액세스 키’를 이용하여 API 인증 토큰프로젝트 ID를 발급받을 수 있습니다.
    • 토큰 발급에 대한 자세한 설명은 API 인증 토큰 발급을 참고하시기 바랍니다.
    cat << \EOF | sudo tee /tmp/token.sh
    #!/bin/bash

    export TOKEN=$(curl -s -X POST -i https://iam.kakaocloud.com/identity/v3/auth/tokens -H "Content-Type: application/json" -d \
    '{
    "auth": {
    "identity": {
    "methods": [
    "application_credential"
    ],
    "application_credential": {
    "id": "'${ACCESS_KEY}'",
    "secret": "'${ACCESS_SECRET_KEY}'"
    }
    }
    }
    }' | grep x-subject-token | awk -v RS='\r\n' '{print $2}')

    export PROJECT_ID=$(curl -s -X POST https://iam.kakaocloud.com/identity/v3/auth/tokens -H "Content-Type: application/json" -d \
    '{
    "auth": {
    "identity": {
    "methods": [
    "application_credential"
    ],
    "application_credential": {
    "id": "'${ACCESS_KEY}'",
    "secret": "'${ACCESS_SECRET_KEY}'"
    }
    }
    }
    }' | jq -r ".token.project.id")

    if [ -z $TOKEN ]; then
    echo "TOKEN is null..."
    exit 0
    fi

    if [ -z $PROJECT_ID ]; then
    echo "PROJECT_ID is null..."
    exit 0
    fi
    EOF
  4. 환경변수와 토큰 발급 스크립트를 이용하여 로그를 적재할 Object Storage 버킷을 생성합니다. 생성되는 Object Storage 버킷에 대한 정보는 아래 표를 확인합니다.

    cat << \EOF | sudo tee /tmp/init.sh
    #!/bin/bash

    . /tmp/env.sh
    . /tmp/token.sh

    function create_bukkit() {
    echo "create bukkit."
    curl -s -X PUT 'https://objectstorage.kr-central-1.kakaocloud.com/v1_ext/bucket' \\
    -H "X-Auth-Token:${TOKEN}" \\
    -H 'Content-Type: application/json' \\
    -d '{
    "name": "'${BUCKET_NAME}'",
    "type": "hot",
    "use_encryption": true
    }'
    echo "create end: ${BUCKET_NAME}"
    }

    create_bukkit

    EOF
    bash /tmp/init.sh

    항목정보
    버킷 유형hot
    버킷 이름hands-on
    암호화미사용
  5. 환경 변수 파일에 정의한 정보에 따라 로그 파일을 Object Storage에 업로드하는 스크립트를 작성합니다.

    cat << \EOF | sudo tee /tmp/upload.sh
    #!/bin/bash

    . /tmp/env.sh
    . /tmp/token.sh
    . /tmp/preupload.sh

    function upload_file() {
    echo "upload file: ${FILE}"
    curl -s -X PUT 'https://objectstorage.kr-central-1.kakaocloud.com/v1/'${PROJECT_ID}'/'${BUCKET_NAME}''${TOPATH}'' \
    -H 'X-Auth-Token: '${TOKEN}'' \
    -H 'Content-Type: application/octet-stream' \
    -T ${FILE}
    echo "upload end: '${BUCKET_NAME}' '${TOPATH}'"
    }

    upload_file
    . /tmp/postupload.sh
    EOF
  6. 로그 파일을 업로드하기 전과 후에 실행할 스크립트를 작성합니다. 로그 파일을 업로드한 경우 백업 파일을 생성하고 새로운 로그파일을 작성하도록 설정합니다.

    cat << EOF | sudo tee /tmp/preupload.sh
    #!/bin/bash

    EOF

    cat << EOF | sudo tee /tmp/postupload.sh
    #!/bin/bash

    sudo mv /var/log/nginx/access.log /var/log/nginx/access.log.backup
    sudo kill -USR1 `cat /var/run/nginx.pid`
    EOF

Step 4. 자동 업로드 환경 설정

  1. 로그 파일을 일정 시간마다 자동으로 업로드하기 위해 cron 패키지를 사용합니다.

    sudo apt update -y
    sudo apt install -y cron
  2. crontab에 매일 자정 업로드 스크립트를 실행하는 명령을 작성합니다.

    sudo rm /etc/logrotate.d/nginx
    cat << EOF > tmp_crontab
    0 0 * * * /bin/bash /tmp/upload.sh
    EOF
    sudo crontab tmp_crontab
    rm tmp_crontab
  3. 크론 작업이 등록되었는지 확인합니다. 그 다음 업로드 스크립트를 실행하여 로그를 Object Storage에 업로드합니다.

    sudo crontab -l
    bash /tmp/upload.sh
  4. Object Storage 콘솔에서 로그가 저장되었는지 확인합니다.