Ban đầu được đăng trên blog của tôi: http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/
Đồng bộ hóa Nhóm S3 của bạn với Máy chủ EC2 Định kỳ
Điều này có thể dễ dàng đạt được bằng cách sử dụng nhiều tiện ích dòng lệnh để có thể đồng bộ nhóm S3 từ xa với hệ thống tệp cục bộ.
s3cmd
Lúc đầu, s3cmd
trông rất hứa hẹn. Tuy nhiên, sau khi thử nó trên thùng S3 khổng lồ của tôi - nó không thể mở rộng quy mô, lỗi với a Segmentation fault
. Tuy nhiên, nó hoạt động tốt trên các thùng nhỏ. Vì nó không hoạt động với những thùng lớn, tôi bắt đầu tìm một giải pháp thay thế.
s4cmd
Giải pháp thay thế mới hơn, đa luồng cho s3cmd
. Tuy nhiên, trông có vẻ hứa hẹn hơn, tôi nhận thấy rằng nó liên tục tải xuống lại các tệp đã có trên hệ thống tệp cục bộ. Đó không phải là loại hành vi mà tôi mong đợi từ lệnh đồng bộ. Nó sẽ kiểm tra xem tệp từ xa đã tồn tại cục bộ hay chưa (kiểm tra kích thước băm / tệp sẽ gọn gàng) và bỏ qua nó trong lần chạy đồng bộ tiếp theo trên cùng một thư mục đích. Tôi đã mở một vấn đề ( bloomreach / s4cmd / # 46 ) để báo cáo hành vi kỳ lạ này. Trong khi chờ đợi, tôi bắt đầu tìm một giải pháp thay thế khác.
awscli
Và sau đó tôi tìm thấy awscli
. Đây là giao diện dòng lệnh chính thức của Amazon để tương tác với các dịch vụ đám mây khác nhau của họ, bao gồm S3.
Nó cung cấp một lệnh đồng bộ hữu ích giúp tải các tệp nhóm từ xa xuống hệ thống tệp cục bộ của bạn một cách nhanh chóng và dễ dàng .
$ aws s3 sync s3: // your-bucket-name / home / ubuntu / s3 / your-bucket-name /
Những lợi ích:
- Có thể mở rộng - hỗ trợ nhóm S3 khổng lồ
- Đa luồng - đồng bộ hóa các tệp nhanh hơn bằng cách sử dụng nhiều luồng
- Thông minh - chỉ đồng bộ hóa các tệp mới hoặc cập nhật
- Nhanh chóng - nhờ tính chất đa luồng và thuật toán đồng bộ thông minh
Xóa do tình cờ
Thuận tiện, sync
lệnh sẽ không xóa các tệp trong thư mục đích (hệ thống tệp cục bộ) nếu chúng bị thiếu trong nguồn (nhóm S3) và ngược lại. Điều này là hoàn hảo để sao lưu S3 - trong trường hợp các tệp bị xóa khỏi thùng, việc đồng bộ hóa lại sẽ không xóa chúng cục bộ. Và trong trường hợp bạn xóa một tệp cục bộ, nó cũng sẽ không bị xóa khỏi nhóm nguồn.
Thiết lập awscli trên Ubuntu 14.04 LTS
Hãy bắt đầu bằng cách cài đặt awscli
. Có một số cách để thực hiện việc này, tuy nhiên, tôi thấy dễ nhất là cài đặt nó qua apt-get
.
$ sudo apt-get cài đặt awscli
Cấu hình
Tiếp theo, chúng ta cần định cấu hình awscli
với ID Khóa truy cập & Khóa bí mật mà bạn phải lấy từ IAM , bằng cách tạo người dùng và đính kèm chính sách AmazonS3ReadOnlyAccess . Điều này cũng sẽ ngăn bạn hoặc bất kỳ ai có quyền truy cập vào các thông tin xác thực này xóa các tệp S3 của bạn. Đảm bảo nhập vùng S3 của bạn, chẳng hạn như us-east-1
.
cấu hình $ aws
Sự chuẩn bị
Hãy chuẩn bị thư mục sao lưu S3 cục bộ, tốt nhất là trong /home/ubuntu/s3/{BUCKET_NAME}
. Đảm bảo thay thế {BUCKET_NAME}
bằng tên nhóm thực của bạn.
$ mkdir -p / home / ubuntu / s3 / {BUCKET_NAME}
Đồng bộ ban đầu
Hãy tiếp tục và đồng bộ hóa nhóm lần đầu tiên với lệnh sau:
$ aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
Giả sử nhóm tồn tại, thông tin đăng nhập AWS và khu vực là chính xác và thư mục đích hợp lệ, awscli
sẽ bắt đầu tải toàn bộ nhóm xuống hệ thống tệp cục bộ.
Tùy thuộc vào kích thước của nhóm và kết nối Internet của bạn, có thể mất từ vài giây đến hàng giờ. Khi việc đó hoàn tất, chúng tôi sẽ tiếp tục và thiết lập cron job tự động để cập nhật bản sao cục bộ của nhóm.
Thiết lập công việc Cron
Hãy tiếp tục và tạo một sync.sh
tệp trong /home/ubuntu/s3
:
$ nano /home/ubuntu/s3/sync.sh
Sao chép và dán mã sau vào sync.sh
:
#! / bin / sh
# Gọi ngày và giờ hiện tại
echo '-----------------------------'
ngày
echo '-----------------------------'
echo ''
# Khởi tạo tập lệnh Echo
echo 'Đang đồng bộ hóa bộ chứa S3 từ xa ...'
# Trên thực tế, hãy chạy lệnh đồng bộ hóa (thay thế {BUCKET_NAME} bằng tên nhóm S3 của bạn)
/ usr / bin / aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
# Hoàn thành tập lệnh Echo
echo 'Hoàn tất đồng bộ hóa'
Đảm bảo thay thế {BUCKET_NAME} bằng tên nhóm S3 của bạn, hai lần trong suốt tập lệnh.
Mẹo chuyên nghiệp: Bạn nên sử dụng /usr/bin/aws
để liên kết với aws
tệp nhị phân, vì crontab
thực thi các lệnh trong môi trường trình bao hạn chế và sẽ không thể tự tìm thấy tệp thực thi.
Tiếp theo, hãy đảm bảo chmod
tập lệnh để nó có thể được thực thi bởi crontab
.
$ sudo chmod + x /home/ubuntu/s3/sync.sh
Hãy thử chạy tập lệnh để đảm bảo rằng nó thực sự hoạt động:
$ /home/ubuntu/s3/sync.sh
Đầu ra phải tương tự như sau:
Tiếp theo, hãy chỉnh sửa người dùng hiện tại crontab
bằng cách thực hiện lệnh sau:
$ crontab -e
Nếu đây là lần đầu tiên bạn thực thi crontab -e
, bạn sẽ cần chọn một trình soạn thảo ưa thích. Tôi khuyên bạn nên chọn nano
vì nó là dễ dàng nhất cho người mới bắt đầu làm việc.
Tần số đồng bộ hóa
Chúng ta cần cho biết crontab
tần suất chạy tập lệnh của mình và nơi tập lệnh nằm trên hệ thống tệp cục bộ bằng cách viết lệnh. Định dạng cho lệnh này như sau:
lệnh mh dom mon dow
Lệnh sau định cấu hình crontab
để chạy sync.sh
tập lệnh mỗi giờ (được chỉ định thông qua tham số phút: 0 và giờ: *) và để nó chuyển đầu ra của tập lệnh vào một sync.log
tệp trong s3
thư mục của chúng tôi :
0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log
Bạn nên thêm dòng này vào cuối crontab
tệp bạn đang chỉnh sửa. Sau đó, hãy tiếp tục và lưu tệp vào đĩa bằng cách nhấn Ctrl + W rồi nhấn Enter . Sau đó bạn có thể thoát ra nano
bằng cách nhấn tổ hợp phím Ctrl + X . crontab
bây giờ sẽ chạy tác vụ đồng bộ mỗi giờ.
Mẹo chuyên nghiệp: Bạn có thể xác minh rằng công việc cron hàng giờ đang được thực hiện thành công bằng cách kiểm tra /home/ubuntu/s3/sync.log
, kiểm tra nội dung của nó để biết ngày và giờ thực hiện và kiểm tra nhật ký để xem tệp mới nào đã được đồng bộ hóa.
Tất cả các thiết lập! Nhóm S3 của bạn giờ đây sẽ tự động được đồng bộ hóa với máy chủ EC2 của bạn mỗi giờ và bạn nên thực hiện. Xin lưu ý rằng theo thời gian, khi bộ chứa S3 của bạn lớn hơn, bạn có thể phải tăng kích thước âm lượng EBS của máy chủ EC2 để chứa các tệp mới. Bạn luôn có thể tăng kích thước khối lượng EBS của mình bằng cách làm theo hướng dẫn này .