소량의 설정과 스크립팅만으로 rclone과 AWS S3 Glacier Deep Archive를 사용해 매우 저렴하게 대용량 오프사이트 백업을 구축하는 방법을 소개합니다. IAM 사용자 생성, rclone 설정과 도커 실행, 주기적 자동 백업을 위한 크론 작업 설정까지 단계별로 안내합니다.
이 글에서는 데이터 백업 비용을 대폭 절감하는 방법을 소개합니다. 약간의 설정(과 스크립팅)만 하면, 오프사이트 백업 용도로 쓸 수 있는 엄청난 저장 공간을 아주 매우 합리적인 가격에 확보할 수 있습니다.
몇 년 전 직접 NAS(Network Attached Storage)를 만들어 그 위에 점점 더 많은 파일(그리고 엄청난 미디어)을 저장해 오다 보니, 이제야말로 중요한 파일(문서, 사진, 음악, 동영상 등)을 오프사이트로 백업해 두기에 가장 좋은 때입니다.
Odroid H2+ NAS를 만들 시간#odroidpic.twitter.com/Fzd3C6fMbp
— Ryan Southgate (@ryan_southgate) February 22, 2021
제 NAS에는 8TB HDD가 들어 있습니다. 백업이 없다면, 드라이브가 고장날 경우 모든 것을 잃게 될 수도 있죠. 곧 동일한 드라이브를 하나 더 추가해서 RAID 1(미러)로 구성할 계획입니다. 이는 어디까지나 단일 드라이브 고장에만 대비하는 것입니다. RAID는 백업이 아니며, 화재/홍수 또는 NAS와 두 드라이브 모두를 파괴할 수 있는 기타 치명적 사건에 대비해 오프사이트 백업을 갖추는 것이 필수입니다.
현재 저는 rclone을 사용해 NAS의 모든 파일을 AWS S3 Glacier에 백업하고 있습니다.
AWS S3 Glacier는 장기 데이터 아카이빙을 위한 저장소로, 제 오프사이트 백업 용도에 완벽합니다. 저는 가장 저렴한 티어인 S3 Glacier Deep Archive를 선택했는데, 1년에 1~2회 정도만 데이터에 접근하고, 복구에 12시간 정도 대기하는 것을 개의치 않는 사용자를 위해 설계되어 있습니다.
AWS S3는 인바운드 데이터 전송(S3로 업로드)에 대해서는 요금을 부과하지 않습니다. 다만 아웃바운드 데이터 전송(S3에서 다운로드)에는 비용이 들며, 이 글을 작성할 당시 GB당 $0.09였습니다. 그래서 만약 최악의 상황이 벌어져 NAS의 두 드라이브를 모두 잃게 되더라도, 전체 데이터를 복구하는 데 $14.04가 들 뿐입니다. 제게는 꽤 합리적인 비용이라고 생각합니다.
이건 어디까지나 오프사이트 백업입니다. 최악의 일이 벌어져 NAS의 모든 데이터가 사라진다(홍수/화재/폭발 등) — 즉 로컬 데이터가 모두 파괴되는 상황이라면, 데이터를 되찾기 위해 12시간을 기다리는 것은 큰 문제가 아닙니다. 부품을 주문하고 NAS를 재구성하는 데 더 오래 걸릴 테니까요. 데이터가 안전하게 보관되고 저장 비용이 저렴한 것이, 즉시 접근 가능한 것보다 제게는 더 중요합니다.
다음은 2023년 9월 제 최신 AWS 요금 청구서입니다.
AWS 계정에서 새 사용자를 만들고 적절한 이름을 지정하세요:
다음 화면에서 아래 두 가지 권한을 검색해 사용자에게 부여합니다:
다른 S3 버킷들을 이미 사용 중이라면, 오작동이나 키 유출 시의 잠재적 피해를 최소화하기 위해 위 사용자에게 특정 버킷만 접근하도록 제한하는 것을 고려하세요.
그다음 다음을 클릭합니다. 검토 화면은 다음과 같이 보일 것입니다:
그다음 “Create User”를 클릭합니다. 사용자 목록 화면으로 돌아와 방금 만든 사용자를 클릭한 다음 “Create Access Key”를 클릭합니다.
아래 페이지에서, rclone이 우리의 S3 버킷에 접근할 때 사용할 액세스 키를 만들고자 하므로 “Local Code”를 선택합니다. 그런 다음 “Next”를 클릭하세요.
다음 화면에서 선택적으로 description 태그 값을 설정할 수 있습니다(저는 생략합니다). 그리고 “Create Access Key”를 클릭합니다.
완료 화면에서, 액세스 키 표의 “Secret access key” 열에서 “Show”를 클릭합니다.
아래처럼 보일 것입니다:
액세스 키와 시크릿 액세스 키 두 가지 모두를 복사해 안전한 곳에 보관하세요(비밀번호 관리자를 쓰는 것을 강력히 추천). 절대 누구와도 공유하지 마세요. 공유하면 S3 버킷과 그 안의 모든 것에 대한 접근 권한을 넘겨주는 것입니다. (걱정 마세요. 이 글이 게시될 때쯤이면 이 IAM 사용자는 삭제되어 있을 겁니다.)
저는 rclone을 도커 컨테이너에서 사용합니다. 공식 컨테이너는 여기에서 찾을 수 있습니다: https://hub.docker.com/r/rclone/rclone
설치 페이지에는 여러 설치 방법이 있습니다. 저는 도커를 좋아하므로, 도커 설치 섹션 링크를 공유합니다: https://rclone.org/install/#docker
도커 이미지는 다음과 같이 가져옵니다:
docker pull rclone/rclone:latest
원하는 어떤 “원격/프로바이더”든 구성할 수 있습니다. 다만 저는 AWS S3 Glacier 설정을 선택했습니다. S3 Glacier를 사용하려면 AWS 계정이 필요합니다. rclone이 S3 Glacier에 파일을 저장할 수 있도록 rclone용 AWS “IAM 사용자”를 먼저 만들어야 합니다.
이제 AWS 사용자를 만들고 키를 확보했으니, rclone 설정 파일 생성을 안내받기 위해 다음 명령을 실행하세요. 컨테이너가 설정 파일을 저장할 수 있도록 Docker에 볼륨을 지정해야 합니다.
docker run --volume $(pwd):/config/rclone -it rclone/rclone config
이 과정을 마치면 현재 폴더에 rclone.conf라는 새 파일이 생깁니다. 제 파일은 AWS S3 Glacier(Deep Archive — 가장 저렴한 옵션)로 구성한 뒤 대략 다음과 같습니다:
[aws-glacier-da]
type = s3
provider = AWS
acl = private
storage_class = DEEP_ARCHIVE
access_key_id = **the_secret_access_key_id_from_aws**
secret_access_key = **the_secret_access_key_from_aws**
제 NAS 데이터 디렉터리는 파일시스템에 마운트된 HDD의 /dev/sda1/Backup/Photos에 있습니다. 백업을 위한 rclone 명령을 실행하려면 먼저 rclone.conf 파일이 있는 디렉터리로 cd 하세요. CLI에서 백업 명령을 실행할 때, 해당 디렉터리를 rclone이 접근할 수 있도록 Docker에 그 볼륨을 마운트해야 합니다. 전체 백업 명령(주석 포함)은 다음과 같습니다:
docker run \
--volume $(pwd):/config/rclone \ # 설정 파일이 들어 있는 디렉터리를 마운트
--volume /dev/sda1/Backup/Photos/:/data \ # 데이터가 있는 디렉터리를 마운트
-it rclone/rclone \ # 인터랙티브 모드로 "rclone" 컨테이너 실행
sync /data/ \ # "sync" 명령(다른 명령도 있으니 문서를 확인해 목적에 맞는 것을 선택하세요)은 이전 실행 이후 새로 생기거나 변경된 파일만 업로드합니다
aws-glacier-da:Photos-Backup -P -v # rclone.conf의 "aws-glacier-da" 설정 블록 사용. 콜론 오른쪽은 AWS의 버킷 이름. -P = 진행률 표시, -v = 상세 로그로 동작 상황 확인
제가 좋아하는 또 다른 커맨드라인 옵션은 --dry-run입니다. 이 옵션은 명령을 시뮬레이션만 하고 실제로는 아무것도 업로드하지 않습니다. 새로운 원격에 파일을 업로드하기 전에, 무엇이 전송될 것으로 예상하는지 확인하고 설정/명령이 올바른지 재차 점검하기 위해 저는 항상 먼저 이 옵션으로 실행합니다(아주 소액이지만 비용이 드니까요).
확인이 끝났다면 명령을 실행하세요. 업로드 양과 인터넷 속도에 따라 시간이 좀 걸릴 수 있습니다.
완료되면, 파일이 안전하게 오프사이트로 백업되었다는 사실을 마음껏 누리세요.
S3 콘솔에서 확인할 수 있습니다. docker run 명령에서 지정한 버킷 이름을 클릭하고, 업로드된 디렉터리/파일을 탐색해 보세요.
파일은 추가/수정/삭제될 수 있습니다. 매시간/매일/매주/매월 이 명령을 직접 실행하는 것을 기억하고 싶지는 않겠죠.
자신의 파일에 어떤 백업 주기가 적절한지 충분히 고민해 보세요. 제 경우에는 주 1회 백업이면 충분합니다. 그러니 rclone 백업 명령을 주 1회 실행하는 크론 작업을 작성해 봅시다.
rclone.conf가 있는 폴더에 파일을 하나 만듭니다. 저는 perform-backup.sh라고 이름을 지었습니다. 도커 명령을 복사해 텍스트 파일에 붙여 넣고 저장하세요. 스크립트 파일이므로 대략 아래와 같을 것입니다:
#! /bin/bash
echo "Starting Backup"
docker run \
--volume $(pwd):/config/rclone \
--volume /dev/sda1/Backup/Photos/:/data \
-it rclone/rclone \
sync /data/ \
aws-glacier-da:Photos-Backup -P -v
echo "Finished Backup"
다음으로 파일에 실행 권한을 부여합니다:
sudo chmod +x perform-backup.sh
이제(crontab이 설치되어 있다면) 다음을 실행하세요:
crontab -e
crontab을 편집한 다음 다음을 입력합니다:
0 5 * * sun /path/to/perform-backup.sh
이는 “매주 일요일 오전 5시”를 의미합니다. _crontab 표현식을 편집할 때 도움이 필요하면 훌륭한 [crontab guru](https://crontab.guru/#0\_17\_*\