Cloud/GCP

[GCP/OS] instance에서 gcp rsync를 이용하여 file sync 진행

달빛궁전- 2024. 2. 27. 13:34

쓰기도 애매하지만, VM (linux) 에서 GCS로 자동으로 로그 파일을 업로드하고, VM에 있는 기존 파일은 제거하는 요구사항이 생겨서 진행

 

목적 : Instance 에서 지속적으로 파일이 대량 생성되고 있어, 이것을 GCS로 저장하는 방안 중 하나
조건은 각 instance를 구분하기 위해 GCS상에 호스트명별로 디렉토리가 생성되며, GCS에 업로드 되고 난 뒤 최신의 파일을 제외하고서는 기존 instance내 파일은 삭제처리

 

GCS로 보내는거라 고민을 했는데, 다행인지 gcloud 명령어에 storage rsync가 있어 진행했다.

아.. 물론 엔딩은 rsync가 아닌 데몬으로 보내야한다고 해서 결국 Fluent Bit로 전환

 

 

이거 그림으로 그리기도 좀 애매하지만 / VM에서 rsync를 통해 GCS로 가게되는 구조

 

 

- GCS에 호스트명대로 저장하고, gcp rsync로 저장한 뒤 10개의 파일만 남기고 삭제하는 스크립트

#!/bin/bash

# 환경설정
# 호스트명 
HOSTNAME=$(hostname)

# gcs에서 호스트명대로 디렉토리 생성
GCS_PATH="gs://gcp-storage명/$HOSTNAME"

# 백업 디렉토리 설정
BACKUP_DIR="/home/result_os-performance"

# 남겨둘 파일 수
MAX_FILES=10

# gcloud rsync로 백업 수행
gcloud storage rsync "$BACKUP_DIR" "$GCS_PATH" --recursive

# 백업 디렉토리로 이동
cd "$BACKUP_DIR" || exit

# 각 디렉토리를 대상으로 반복
for dir in "$BACKUP_DIR"/*/; do

# 디렉토리 내 파일 목록을 최신 수정 시간 순으로 정렬하여 배열로 저장
    files=$(ls -t "$dir")
# 최신 파일을 제외하고 삭제
    i=0
    for file in $files; do
        if [ $i -ge $MAX_FILES ]; then
            rm -f "${dir}${file}"
        fi
        i=$((i+1))
    done
done

 

 

- 위의 스크립트는 압축을 안하기 때문에, 파일이 많으면 색인도 그렇고 어려워서

log파일들을 압축하고, GCS로 전송 후 삭제하는 스크립트도 작성하였다.

#!/bin/bash

#환경설정
HOSTNAME=$(hostname)

# gcs에서 호스트명대로 디렉토리 생성
GCS_PATH="gs://gcp-storage명/$HOSTNAME"

# 백업 디렉토리 설정
BACKUP_DIR="/home/result_os-performance"

# 삭제할 파일 수
MAX_FILES=5

# 압축할 파일 수
COMPRESS_LIMIT=5

# 압축 파일 이름
ARCHIVE_NAME="backup_$(date +%Y-%m-%d_%H-%M-%S).tar.gz"

# 압축 파일 디렉토리
ARCHIVE_DIR="/tmp"

# 백업 디렉토리로 이동
cd "$BACKUP_DIR" || exit

#스크립트 동작
for dir in */; do
# 디렉토리 내 파일 갯수를 세어 COMPRESS_LIMIT와 비교하여 처리
file_count=$(find "$dir" -maxdepth 1 -type f | wc -l)

# 파일 갯수가 COMPRESS_LIMIT를 초과하면 압축하여 전송
if [ "$file_count" -gt "$COMPRESS_LIMIT" ]; then

# 압축 파일 생성
tar -czf "${ARCHIVE_DIR}/${ARCHIVE_NAME}.gz" "$dir"

# 압축된 파일을 GCS로 전송
gcloud storage rsync "${ARCHIVE_DIR}" "${GCS_PATH}" 

# 압축된 파일 삭제
rm -f "${ARCHIVE_DIR}/${ARCHIVE_NAME}"

# 압축 후 디렉토리 비우기
rm -rf "$dir"/*
fi
done

 

 

GCP gcloud 명령어 중 rsync는 아래 링크를 참조하였다.

 

- gcloud storage rsync 

https://cloud.google.com/sdk/gcloud/reference/storage/rsync

 

gcloud storage rsync  |  Google Cloud CLI Documentation

Send feedback gcloud storage rsync Stay organized with collections Save and categorize content based on your preferences. NAME gcloud storage rsync - synchronize content of two buckets/directories SYNOPSIS gcloud storage rsync SOURCE DESTINATION [--additio

cloud.google.com