내 블로그에 원래 게시 됨 : http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/
정기적으로 S3 버킷을 EC2 서버에 동기화
이는 원격 S3 버킷을 로컬 파일 시스템에 동기화 할 수있는 여러 명령 줄 유틸리티를 사용하여 쉽게 수행 할 수 있습니다.
s3cmd
처음에는 s3cmd
매우 유망 해 보였습니다. 그러나 엄청난 S3 버킷에서 시도한 후 확장에 실패하여 Segmentation fault
. 그러나 작은 양동이에서는 잘 작동했습니다. 거대한 양동이에는 효과가 없었기 때문에 대안을 찾기 시작했습니다.
s4cmd
에 새로운 멀티 스레드 대안을 s3cmd
. 훨씬 더 유망 해 보였지만 이미 로컬 파일 시스템에있는 파일을 계속 다시 다운로드하는 것으로 나타났습니다. 그것은 내가 sync 명령에서 기대했던 종류의 행동이 아닙니다. 원격 파일이 이미 로컬에 있는지 확인하고 (해시 / 파일 크기 확인은 깔끔 할 것임) 동일한 대상 디렉터리에서 다음 동기화 실행시이를 건너 뜁니다. 이 이상한 동작을보고하기 위해 문제 ( bloomreach / s4cmd / # 46 )를 열었습니다 . 그 동안 나는 다른 대안을 찾기 시작했습니다.
awscli
그리고 나는 awscli
. 이것은 S3가 포함 된 다양한 클라우드 서비스와 상호 작용하기위한 Amazon의 공식 명령 줄 인터페이스입니다.
원격 버킷 파일을 로컬 파일 시스템에 빠르고 쉽게 다운로드 하는 유용한 동기화 명령을 제공합니다 .
$ aws s3 sync s3 : // your-bucket-name / home / ubuntu / s3 / your-bucket-name /
혜택:
- 확장 가능-거대한 S3 버킷 지원
- 다중 스레드-다중 스레드를 활용하여 파일을 더 빠르게 동기화합니다.
- 스마트-새 파일 또는 업데이트 된 파일 만 동기화
- 빠름-다중 스레드 특성과 스마트 동기화 알고리즘 덕분에
실수로 인한 삭제
편리하게도이 sync
명령은 소스 (S3 버킷)에서 누락 된 경우 대상 폴더 (로컬 파일 시스템)의 파일을 삭제하지 않으며 그 반대의 경우도 마찬가지입니다. 이는 S3 백업에 적합합니다. 파일이 버킷에서 삭제 된 경우 다시 동기화해도 로컬에서 삭제되지 않습니다. 로컬 파일을 삭제하는 경우 소스 버킷에서도 삭제되지 않습니다.
Ubuntu 14.04 LTS에서 awscli 설정
먼저 awscli
. 이를 수행 하는 방법 에는 여러 가지 가 있지만을 통해 설치하는 것이 가장 쉽다는 것을 알았습니다 apt-get
.
$ sudo apt-get install awscli
구성
다음으로, 사용자를 생성하고 AmazonS3ReadOnlyAccess 정책을 연결하여 IAM 에서 awscli
획득해야하는 액세스 키 ID 및 보안 키로 구성 해야합니다 . 이렇게하면 이러한 자격 증명에 액세스 할 수있는 사용자 나 다른 사람이 S3 파일을 삭제할 수 없습니다. S3 지역 (예 : .us-east-1
$ aws 구성
예비
로컬 S3 백업 디렉터리 (가급적 /home/ubuntu/s3/{BUCKET_NAME}
. {BUCKET_NAME}
실제 버킷 이름 으로 바꾸십시오 .
$ mkdir -p / home / ubuntu / s3 / {BUCKET_NAME}
초기 동기화
계속해서 다음 명령을 사용하여 버킷을 처음으로 동기화 해 보겠습니다.
$ aws s3 sync s3 : // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
버킷이 있고 AWS 자격 증명 및 리전이 올 바르고 대상 폴더가 유효하다고 가정 awscli
하면 전체 버킷을 로컬 파일 시스템에 다운로드하기 시작합니다.
버킷의 크기와 인터넷 연결에 따라 몇 초에서 몇 시간까지 걸릴 수 있습니다. 완료되면 버킷의 로컬 사본을 최신 상태로 유지하기 위해 자동 크론 작업을 설정합니다.
Cron 작업 설정
계속해서 다음 위치에 sync.sh
파일을 만듭니다 /home/ubuntu/s3
.
$ nano /home/ubuntu/s3/sync.sh
다음 코드를 복사하여에 붙여 넣으십시오 sync.sh
.
#! / bin / sh
# 현재 날짜와 시간을 에코
에코 '-----------------------------'
데이트
에코 '-----------------------------'
에코 ''
# 에코 스크립트 초기화
echo '원격 S3 버킷 동기화 중 ...'
# 실제로 sync 명령을 실행합니다 ({BUCKET_NAME}을 S3 버킷 이름으로 대체)
/ usr / bin / aws s3 sync s3 : // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
# 에코 스크립트 완성
echo '동기화 완료'
스크립트 전체에서 {BUCKET_NAME} 을 S3 버킷 이름으로 두 번 바꿔야 합니다.
전문가 팁 : 제한된 셸 환경에서 명령을 실행하고 자체적으로 실행 파일을 찾을 수 없으므로 바이너리 /usr/bin/aws
에 연결 하려면 을 사용해야 합니다 .aws
crontab
다음으로 chmod
스크립트가 crontab
.
$ sudo chmod + x /home/ubuntu/s3/sync.sh
실제로 작동하는지 확인하기 위해 스크립트를 실행 해 보겠습니다.
$ /home/ubuntu/s3/sync.sh
출력은 다음과 유사해야합니다.
다음으로 crontab
다음 명령을 실행하여 현재 사용자를 편집 해 보겠습니다 .
$ crontab -e
를 처음 실행 crontab -e
하는 경우 선호하는 편집기를 선택해야합니다. nano
초보자가 작업하기 가장 쉬운 방법을 선택 하는 것이 좋습니다 .
동기화 주파수
crontab
명령을 작성하여 스크립트를 실행하는 빈도와 스크립트가 로컬 파일 시스템에있는 위치 를 알려야 합니다. 이 명령의 형식은 다음과 같습니다.
mh dom mon dow 명령
다음 명령 crontab
은 sync.sh
매시간 스크립트 를 실행하고 (minute : 0 및 hour : * 매개 변수를 통해 지정됨) 스크립트의 출력을 디렉토리 의 sync.log
파일로 파이프하도록 구성합니다 s3
.
0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log
이 줄을 crontab
편집 중인 파일 의 맨 아래에 추가해야합니다 . 그런 다음 Ctrl + W 를 누른 다음 Enter 키 를 눌러 파일을 디스크에 저장 하십시오 . 그런 다음 Ctrl + Xnano
를 눌러 종료 할 수 있습니다 . 이제 매시간 동기화 작업을 실행합니다.crontab
전문가 팁 : 을 검사 /home/ubuntu/s3/sync.log
하고 실행 날짜 및 시간에 대한 내용을 확인하고 로그를 검사하여 동기화 된 새 파일을 확인하여 시간별 크론 작업이 성공적으로 실행되고 있는지 확인할 수 있습니다 .
모든 설정! 이제 S3 버킷이 매시간마다 EC2 서버에 자동으로 동기화되므로 잘 사용할 수 있습니다. 시간이 지남에 따라 S3 버킷이 커지면 새 파일을 수용하기 위해 EC2 서버의 EBS 볼륨 크기를 늘려야 할 수 있습니다. 이 가이드 에 따라 언제든지 EBS 볼륨 크기를 늘릴 수 있습니다 .