Backup tự động EC2 linux với S3

 

Backup EC2 instance trên AWS thì có rất nhiều cách, ví dụ: AWS Backup, Lambda, ... Những cách này đều có hướng dẫn chi tiết trong document của AWS, tuy nhiên sau bài Backup tự động Server, VPS Linux và lưu lên Google drive có nhiều bạn hỏi tôi có thể áp dụng cách này cho AWS EC2 được không ? Câu trả lời là : Hoàn toàn được. Ưu điểm của phương pháp này so với những phương pháp được giới thiệu của AWS là không cần thiết phải Backup toàn bộ Instance ( thường có dung lượng lớn, gây tốn chi phí) mà chúng ta chỉ backup những phần cần thiết như: MySQL data, Upload file.

Ở bài trước tôi sử dụng RClone để tự động lưu data lên Google Drive, hôm nay tôi muốn giới thiệu tới các bạn phương pháp sử dụng AWS CLI để lưu dữ liệu lên S3. 

Trong hướng dẫn này,  chúng ta sẽ backup database và upload data và lưu vào Amazon S3.

Chúng ta sẽ lưu trữ các bản backup vào S3 Glacier sau 30 ngày sử dụng 3 Lifecycle policy và sau đó lên lịch xóa vĩnh viễn sau 90 ngày kể từ ngày hết hạn.

Todo:
- Tạo 1 IAM User và S3 Permission.
- Install AWS CLI.
- AWS S3 List Verification.
- Install S3fs và Mount S3 Bucket.
- Tạo Backup Script.
- Lưu data lên S3 Bucket.
- Tự động xoá file hết hạn trên 
S3 Bucket

Step 1: Tạo IAM User và S3 Permission


Đăng nhập vào AWS Management Console => IAM service.

Tạo 1 IAM user mới và attach permission sử dụng AmazonS3FullAccess policy hoặc sử dụng custom policy nếu bạn chỉ muốn set một quyền truy cập cụ thể nào đó trên S3 bucket.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::MyS3Bucket"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Resource": ["arn:aws:s3:::MyS3Bucket/*"]
    }
  ]
}


Step 2. Install AWS CLI và Config


SSH remote và EC2 Instance (Trong trường hợp của tôi sử dụng Centos) và sau đó chạy lệnh update để cài đặt các bản cập nhật:

sudo yum update


Install AWS CLI:

sudo yum install awscli -y

Chạy command sau:

aws configure

AWS CLI sẽ yêu cầu bạn nhập AWS Access ID và Secret Key của bạn. Sau đó bạn cần cung cấp Region của EC2 instance, và để default cho [Default output format], Ví dụ:

AWS Access Key ID [None]: xxxxxxxxxxxxxx
AWS Secret Access Key [None]: yyyyyyyyyyyyyyy
Default region name [None]: us-west-2
Default output format [None]:


Step 3. Verify AWS S3


- Đăng nhập vào AWS Management Console => S3 service.

- Tạo mới một S3 Bucket, ví dụ: mbc-backup-bucket


Xác minh danh sách S3 bucket sau khi hoàn tất cài đặt AWS CLI, chạy command:

aws s3 ls
On the screen, you will see the list of your bucket printed:

2022-08-06 08:02:56 testbucket1
2022-09-13 14:21:09 testbucket2

Nếu danh sách S3 bucket không được in ra => Check IAM User và chắc chắn rằng IAM policy ở step 1 được gắn vào IAM User của bạn.


Step 4. Install S3fs và Mount S3 Bucket


Bạn có thể đưa bản backup của bạn tới Amazon S3 mà không tốn thời gian config. Điều này có thể thực hiện được bằng cách cài đặt S3fs trên EC2 instance của bạn và mount S3 bucket vào 1 thư mục cụ thể.


sudo yum install s3fs-fuse
Tạo 1 file dành cho S3fs credential, nhập IAM User ACCESS_KEY_ID và SECRET_ACCESS_KEY:
echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ~/.passwd-s3fs
chmod -v 600 ~/.passwd-s3fs

Tạo mới thư mục để chứa bản Backup:
mkdir /home/ec2-user/s3_uploads

Mount S3 bucket vào folder chứa bản Backup mà bạn đã tạo bằng lệnh sau, thay thế S3_BUCKET_NAME bằng S3 Bucket của bạn:
s3fs S3_BUCKET_NAME /home/ec2-user/s3_uploads -o passwd_file=~/.passwd-s3fs

Tiếp theo, kiểm tra kết quả Mount bằng cách:

df -h

Kết quả sẽ tương tự như vậy:


Giờ đây tất cả những gì bạn upload trong thư mục /home/ec2-user/s3_uploads đều được đồng bộ lên S3 Bucket


Step 5. Tạo Backup Script.


Tạo backup script backup.sh

vi /home/backup.sh
Nội dung như sau:
# Backup Server and Upload to S3

# Config constant.
TIMESTAMP=$(date +"%F")
BACKUP_DIR="/home/ec2-user/s3_uploads/$TIMESTAMP"
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
MYSQL_USER="root"
MYSQL_PASSWORD="[Input your mysql password here]"
SECONDS=0

# Begin run backup.
mkdir -p "$BACKUP_DIR/mysql"

echo "Starting Backup Database";
databases=`$MYSQL -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)"`

for db in $databases; do
 $MYSQLDUMP -u $MYSQL_USER -p$MYSQL_PASSWORD --force --opt $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
done
echo "Finished";
echo '';

echo "Starting Backup Nginx Configuration";
cp -r /etc/nginx/ $BACKUP_DIR/nginx/
echo "Finished";
echo '';

size=$(du -sh $BACKUP_DIR | awk '{ print $1}')
duration=$SECONDS
echo "Done backup with: Total $size, In $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."
Sau đó chạy lệnh sau để chắc chắc file vừa tạo có thể chạy:
sudo chmod +x /home/backup.sh

Để có thể  thực hiện tự động việc Backup hằng ngày,  bạn cần đưa backup.sh vào cron jobs. Nếu bạn chưa cài đặt Cron Job, vui lòng cài đặt dòng lệnh sau:

sudo yum install cronie

Sau đó start service và cài đặt cho cronjob tự động start khi khởi động VPS:

sudo service crond start
sudo chkconfig crond on

Chạy lệnh sau để tạo mới 1 cronjob chạy backup tự động hằng ngày vào 1 giờ sáng:

crontab -e

Bạn nhập đoạn cronjob sau và lưu lại:

* 1 * * * sh /root/backup.sh


Step 6. Tự động xoá file hết hạn trên S3 Bucket


- Đăng nhập vào AWS Management Console => S3 service => Chọn S3 bucket đã tạo để backup.

- Tạo 1 S3 Lifecycle policy để tự động xoá hoặc di chuyển Backup của bạn sang Glacier storage sau một thời gian nhất định.


0 Nhận xét:

Đăng nhận xét

Rất mong các ý kiến của các bạn khi đọc bài viết này !