Header

How to Implement Server Backups with AWS S3

Open Source, Security, Tips & Tricks, and Tutorials

Post Image

Data loss can be catastrophic for any business. Whether it's due to hardware failure, human error, or cyber attacks, losing critical data can result in significant downtime, financial losses, and damage to your reputation. That's why implementing a reliable backup strategy is crucial when managing your own servers.

Why Backups are Essential

  1. Disaster Recovery: Hardware failures, natural disasters, or data center issues can happen anytime.
  2. Protection Against Human Error: Accidental deletions or misconfiguration can wipe out important data.
  3. Security: Backups provide protection against ransomware and other cyber attacks.
  4. Compliance: Many industries require regular backups as part of regulatory requirements.

Using AWS S3 for Backups

Amazon S3 (Simple Storage Service) is an excellent choice for storing backups because:

  • High durability (99.999999999%)
  • Cost-effective
  • Scalable
  • Supports versioning
  • Multiple storage classes for different needs

Implementation Guide

1. Prerequisites

First, install the AWS CLI and configure it with appropriate credentials:

apt-get install awscli
aws configure

2. Create a Backup Script

Create a file named backup.sh:

#!/bin/bash

# Set variables
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="/var/www"
BACKUP_NAME="website_backup_$TIMESTAMP.tar.gz"
S3_BUCKET="your-backup-bucket"

# Create backup
tar -czf /tmp/$BACKUP_NAME $BACKUP_DIR

# Upload to S3
aws s3 cp /tmp/$BACKUP_NAME s3://$S3_BUCKET/backups/$BACKUP_NAME

# Clean up local backup
rm /tmp/$BACKUP_NAME

# Delete backups older than 30 days
aws s3 ls s3://$S3_BUCKET/backups/ | \
  awk '{print $4}' | \
  while read -r KEY; do 
    if [[ $KEY < $(date -d "30 days ago" +"%Y%m%d") ]]; then
      aws s3 rm s3://$S3_BUCKET/backups/$KEY
    fi
  done

Make the script executable:

chmod +x backup.sh

3. Database Backup Script

For MySQL/MariaDB, create backup_db.sh:

#!/bin/bash

# Set variables
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
DB_NAME="your_database"
BACKUP_NAME="db_backup_$TIMESTAMP.sql"
S3_BUCKET="your-backup-bucket"

# Create backup
mysqldump -u root -p[password] $DB_NAME > /tmp/$BACKUP_NAME

# Compress backup
gzip /tmp/$BACKUP_NAME

# Upload to S3
aws s3 cp /tmp/$BACKUP_NAME.gz s3://$S3_BUCKET/database_backups/$BACKUP_NAME.gz

# Clean up local backup
rm /tmp/$BACKUP_NAME.gz

4. Setting Up Cron Jobs

Edit your crontab:

crontab -e

Add these lines:

# Backup website files daily at 2 AM
0 2 * * * /path/to/backup.sh

# Backup database every 6 hours
0 */6 * * * /path/to/backup_db.sh

# Verify backups daily at 3 AM
0 3 * * * aws s3 ls s3://your-backup-bucket/backups/ --recursive | tail -n 1

5. Backup Verification

Create a verification script verify_backup.sh:

#!/bin/bash

# Check latest backup
LATEST_BACKUP=$(aws s3 ls s3://your-backup-bucket/backups/ | tail -n 1)

if [[ -z "$LATEST_BACKUP" ]]; then
    echo "No backups found!"
    exit 1
fi

# Check backup age
BACKUP_DATE=$(echo $LATEST_BACKUP | awk '{print $1}')
CURRENT_DATE=$(date +"%Y-%m-%d")

if [[ $BACKUP_DATE != $CURRENT_DATE ]]; then
    echo "Latest backup is not from today!"
    exit 1
fi

echo "Backup verification successful"

Best Practices

  1. Test Your Backups: Regularly verify that your backups can be restored successfully.
  2. Multiple Backup Locations: Consider using multiple S3 regions or storage services.
  3. Encryption: Enable server-side encryption for your S3 bucket.
  4. Monitoring: Set up alerts for backup failures.
  5. Documentation: Keep detailed documentation of your backup and restore procedures.

Cost Optimization

Consider implementing a lifecycle policy in S3:

  • Keep recent backups in S3 Standard
  • Move older backups to S3 Infrequent Access
  • Archive very old backups to Glacier
  • Set up automatic deletion of backups older than your retention period
# Example lifecycle policy (AWS CLI)
aws s3api put-bucket-lifecycle-configuration \
    --bucket your-backup-bucket \
    --lifecycle-configuration file://lifecycle.json

Conclusion

Regular backups are not optional; they're a crucial part of any production system. By implementing automated backups to AWS S3 with proper monitoring and verification, you can ensure your data is protected against various types of failures and disasters.

Remember to regularly test your backup and restore procedures, and keep your backup scripts and documentation up to date. The small effort required to maintain a proper backup system is nothing compared to the potential cost of data loss.

Happy backing up!

A little bit about the author

Facundo is the CTO at DeployHQ. He oversees our software engineering team by day and, in his free time, enjoys hobbies such as cycling, spending time in nature, and the company of Bono 🐶

Tree

Proudly powered by Katapult. Running on 100% renewable energy.