Having already setup automatic S3 snapshots for Kibana, the next item on the list is to automate MySQL backups. There are a couple of services like Snapshooter that can do this but I prefer doing it on my own.

To automate MySQL backups to AWS S3 with Laravel, I’m using Laravel Backup package by Spatie.

Setup

  • Install the package using  composer require spatie/laravel-backup

    If you see a similar error message like this, your PHP version is probably not supported by the package / dependencies. You might want to use composer require spatie/laravel-backup ^6

Argument 2 passed to SymfonyComponentTranslationTranslator::addResource() must be an instance of SymfonyComponentTranslationmixed, array given, called in /var/www/html/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php on line 165
  • To publish the configuration file, run php artisan vendor:publish --provider="SpatieBackupBackupServiceProvider" – this will create a file under config called backup.php
  • Go to your AWS Console, create a new IAM User (you can see the steps linked on the Kibana guide) and add  AmazonS3FullAccess to the permissions attached to the user.
  • Grab the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
  • Create a S3 Bucket from AWS console (the bucket name goes under AWS_BUCKET and your default region under AWS_DEFAULT_REGION)
  • On the configbackup.php file, under destination key, change the value of disks array to include s3
'disks' => [
	's3',
],
  • Ensure that the default database is set to mysql
'databases' => [
	'mysql',
],
  • Now if you run the command on your command line php artisan backup:run --only-db --only-to-disk=s3 the process should kick off and you should see similar messages.
Starting backup...
Dumping database database_name...
Determining files to backup...
Zipping 1 files and directories...
Created zip containing 1 files and directories. Size is 900 MB
Copying zip to disk named s3...
Successfully copied zip to disk named s3.
Backup completed!
  • Once this is done, you can setup to run it using the scheduler on a frequency that you prefer. Go to your ConsoleKernel.php and add an entry
protected function schedule(Schedule $schedule)
{        
    $schedule->command("backup:run --only-db --only-to-disk=s3")->weeklyOn(6, '7:00');

    //Other commands
}

StorageClass for S3 in Laravel Backup

On your configfilesystems.php, under s3 group add an array key under backup_extra_options called StorageClass

's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'url' => env('AWS_URL'),
    'endpoint' => env('AWS_ENDPOINT'),
    'backup_extra_options' => [
    	'StorageClass' => 'Standard-IA' //Set the Storage Class value
    ]
],

Error messages

The problem was incorrect permissions assigned to the IAM User

Copying zip failed because: There was an error trying to write to disk named s3.
Copying zip failed because: Error executing "ListObjects" on....
AWS HTTP error: cURL error 6: Could not resolve host: