클라우드 스토리지 비용 최적화 – Git과 Rclone을 활용하여

·

·

,

작업 수에 따라 부과되는 클라우드 스토리지 비용

아마존, 구글 등에서 제공하는 클라우드 스토리지는 저장된 용량과 행동(Action)에 따라서 비용이 부과된다. 파일 수가 많아지면, 단순히 전체 리스트를 불러오는 작업도 비용이 부담될 수 있다.

GCP의 작업 종류에 따른 비용 예시

필자는 쇼핑몰에 사용하는 이미지를 클라우드 스토리지에 업로드해서 호스팅하고 있는데, 간단하게 작업 수를 줄일 수 있는 방법을 고민해봤다.

작업 수를 줄여서, 클라우드 스토리지 비용 아끼기

💡 이 작업은 이미지나 파일을 클라우드 스토리지로 호스팅하는 것이 목적이다. 그래서, 개인 저장소에 있는 폴더를 클라우드 스토리지에 미러링하고, 변경된 사항만 핀포인트로 업데이트 하는 방법이다.

클라우드 스토리지 비용을 줄이는 가장 빠른 방법은 작업 수를 줄이는 것이다. 방법은 다음과 같다.

  1. 로컬 스토리지에서 Git으로 변경점을 찾는다.
  2. 변경점만 클라우드 스토리지에 업데이트한다.

1. 로컬 스토리지에서 Git으로 변경점을 찾는다.

Git에는 git diff라는 명령어가 있다. 이를 통해 삭제, 수정, 추가 등 변경된 내용을 찾을 수 있다. git diff --name-only --diff-filter=ACM HEAD~1 HEAD라는 명령어는 HEAD와 HEAD~1 사이의 변경된 항목 중 A, C, M에 해당하는 것을 나열하는 명령어다.

2. 변경점만 클라우드 스토리지에 업데이트한다.

git diff로 변경된 항목을 찾으면, 이제 변경된 항목만 클라우드 스토리지에 업데이트하면 된다. A(adding), C(copied), M(modified)에 해당하는 것들은 클라우드 스토리지로 업로드하고, R(renamed)에 해당하는 항목은 클라우드에서는 지우고 새로 업로드하면 된다. 마지막으로 D(removed)에 해당하는 파일은 클라우드에서 지우면 된다.

필자는 클라우드 스토리지는 CloudFlare의 R2를 이용했고, 클라우드 스토리지에 업데이트 하는 과정은 Rclone를 이용했다.

해당 내용을 Bat 파일로 만들어서 실행하기

해당 내용을 bat 파일(윈도우 기준)로 만들어서 원할 때 마다 실행시켜주면 된다. 참고로 git diff에서 한글은 깨지기 때문에 ignorecase = true 문구를 config 파일에 추가해야 한다.

bat 파일은 아래와 같다.

@echo off
chcp 65001
set REMOTE_PATH=R2:
set RCLONE_PATH=C:\\rclone\\rclone.exe
set COMMIT_MESSAGE=auto commit

echo.
echo [1/6] Adding changes to Git...
echo git add .
git add .

echo.
echo [2/6] Committing changes...
echo git commit -m "%COMMIT_MESSAGE%"
git commit -m "%COMMIT_MESSAGE%"

echo.
echo [3/6] Uploading added, copied, modified files...
for /f "tokens=*" %%A in ('git diff --name-only --diff-filter=ACM HEAD~1 HEAD') do (
    echo "%RCLONE_PATH%" copyto "%%A" "%REMOTE_PATH%/%%A" -v 
    "%RCLONE_PATH%" copyto "%%A" "%REMOTE_PATH%/%%A" -v 
)

echo.
echo [4/6] Deleting renamed files from remote...
for /f "tokens=*" %%A in ('git diff --name-only --diff-filter=R HEAD HEAD~1') do (
    echo "%RCLONE_PATH%" deletefile "%REMOTE_PATH%/%%A" -v
    "%RCLONE_PATH%" deletefile "%REMOTE_PATH%/%%A" -v
)

echo.
echo [5/6] Uploading renamed files...
for /f "tokens=*" %%A in ('git diff --name-only --diff-filter=R HEAD~1 HEAD') do (
    echo "%RCLONE_PATH%" copyto "%%A" "%REMOTE_PATH%/%%A" -v 
    "%RCLONE_PATH%" copyto "%%A" "%REMOTE_PATH%/%%A" -v 
)

echo.
echo [6/6] Deleting removed files from remote...
for /f "tokens=*" %%A in ('git diff --name-only --diff-filter=D HEAD~1 HEAD') do (
    echo "%RCLONE_PATH%" deletefile "%REMOTE_PATH%/%%A" -v
    "%RCLONE_PATH%" deletefile "%REMOTE_PATH%/%%A" -v
)

echo.
echo Done! Changes have been synced to the remote server.

pause
Code language: PHP (php)

댓글 남기기