My First Shot at an AWS WordPress Site

I’ve had a goal of moving my server for gabesimagination.com off of bluehost. I pay Bluehost a little over $500/year to host my site, as well as 6 other small wordpress sites for friends and family. It’s not bad for what I get, but their customer service is absolutely terrible, the websites cannot be scaled, and the whole thing feels like it’s teetering on the brink of disaster. As a result, I gave myself this goal, which required me to learn a bunch of new stuff, most notably, how to set up a web server instead of paying someone else to do it for me.

This website is my first AWS WordPress site, built out (mostly) from scratch. It uses an EC2 instance (t2 small for now) with AWS Linux, Apache, PHP, PHP-MYSQL, and Git.

The instance has an Elastic IP address in front of it, as well as a load balancer.

The /var/www/html directory is a mounted EFS device and contains the wordpress application files.

I’m using a MYSQL database in RDS for the database, which I configured in the wp-config.php file.

For the uploads, I’m using an S3 bucket. I’m relying on two plugins to replace the media uploads folder that would normally be on the same server. The first plugin creates an IAM role for a user who can access S3 programatically. The credentials for that user are also stored in wp-config.php. The second plugin does the heavy lifting, by filtering wordpress functions that handle saving and retrieving images – it swaps the default wp-content/uploads url out with the s3 bucket. I have a Cloudfront CDN in front of my S3 bucket.

I have SSH and FTP access setup for the server, and the whole thing is under version control with git and has a repository on github.

I’m using Route 53 for DNS, with a root domain of gabeshaughnessy.com, an alias for www.gabeshaughnessy.com and ftp.gabeshaughnessy.com as well as uploads.gabeshaughnessy.com for the s3 bucket.

TODO:

  • Setup SES for sending email, instead of relying on the EC2 instance.
  • Setup automatic backups into an S3 bucket with lifecycle management.
  • Setup object caching with Elasticache.
  • Setup SSL