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 환경 설정 스크립트 작성
-
shell
에서json
포맷의 데이터를 쉽게 사용하기 위해jq
패키지를 설치합니다.sudo apt-get update -y
sudo apt-get install -y jq -
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}
사용자 보안 액세스 키 -
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 -
환경변수와 토큰 발급 스크립트를 이용하여 로그를 적재할 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 암호화 미사용 -
환경 변수 파일에 정의한 정보에 따라 로그 파일을 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 -
로그 파일을 업로드하기 전과 후에 실행할 스크립트를 작성합니다. 로그 파일을 업로드한 경우 백업 파일을 생성하고 새로운 로그파일을 작성하도록 설정합니다.
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. 자동 업로드 환경 설정
-
로그 파일을 일정 시간마다 자동으로 업로드하기 위해 cron 패키지를 사용합니다.
sudo apt update -y
sudo apt install -y cron -
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 -
크론 작업이 등록되었는지 확인합니다. 그 다음 업로드 스크립트를 실행하여 로그를 Object Storage에 업로드합니다.
sudo crontab -l
bash /tmp/upload.sh -
Object Storage 콘솔에서 로그가 저장되었는지 확인합니다.