Build a resilient website with Amazon EC2 and S3

In some instances, there may be failure from your EC2 instances web server to serve your website to your users unknown to you.

During this period you might serve your user with static web pages from Amazon Simple Storage Service(S3) that display necessary contents from your main web server while you fix the EC2 instance issue.

This blog explain how you can create a failover to a static S3 website in event of failure of EC2 web server and get notified of the EC2 failure for immediate remediation.

Required Resources
Amazon Elastic Compute Cloud(EC2)
Amazon Simple Storage Service (S3)
Registered Domain name
Elastic IP
Security Group
Amazon Simple Notification Service(SNS)

Severity Level: Beginner

step1 : Spin up EC2 instance web server with elastic IP address.

NB: If you don’t know how to do that, check this tutorial https://codysense.com/launch-free-amazon-cloud-server-with-public-ip/

Step 2 : Configure alternate web page using S3

Amazon S3 enable you to host static website which is our failover website incase of main web server failure.

You can learn how to do that from this tutorial :https://codysense.com/create-a-static-website-with-s3/

NB: The domain name you intend to use for your dynamic website must be your bucket name.

Step 3: Configure Route53 to link your websites to your domain

Search for Route53 from the services

Click Create Hosted zone.

Hosted zone name is your domain or subdomain name you have registered

Select public hosted zone as Type

Click Create hosted zone

When you create Hosted zone Start Of Authority (SOA) and Nameserver record are created automatically.
If your domain is registered with aws, you can go ahead and create first record but if your domain is registered with third party registrar.

Click on the checkbox for NS record and click Edit.
Copy each record and paste it in the nameserver of your domain registrar.

Choose Health Check in the left pane of the Route53

This health check will be monitoring your EC2 web server for reachability check. This would be use to determine when the server is not reachable to failover to  another server, It also include SNS notification to alert the server administrator of the server failure.

Name the health check

What to monitor – Endpoint

Specify Endpoint by – IP address

IP address – The server Elastic IP address

Port – 80

Click Next

Create alarm – Yes

Send Notification to – New SNS Topic

Topic name – name your SNS

Recipient email address – you personal email address

Click Create health check

record name – type the subdomain name or leave it blank if you are using the domain name

Value – EC2 elastic IP address

Routing policy – failover

Failover record type – primary

Health check Id – choose the health check created earlier (click the refresh button if not showing)

Record ID – give it a unique name

Click save

type the domain or subdomain name in the browser – web server from your EC2 should display in the browser

Click create record again

Now Let’s create a secondary failover to S3 static website

Record name – same as first record name

Alias – switch it ON

Route traffic to – Alias to S3 Endpoint

Region – choose region the S3 bucket was created (preferably same region the EC2 was created)

Endpoint – choose the S3 bucket

Routing policy – failover

Failover record type – secondary

Record ID – give it a unique name

Click Save

Refresh the url in the browser to be sure the EC2 web server is still reachable.

Go to the EC2 instances page

Click Instance State

Click stop instances

wait for  3 mins and refresh the browser again, the S3 web page will display.


Thank you

Happy learning!

In my next post, I will provide a means make the system repair itself by automatically start EC2 instance if a stop attempt is made to it or alert the administrator if security group is modified.

For question on this tutorial, you can connect with me on these channels and let’s learn from each other.

Linkedin : https://www.linkedin.com/in/jeleel-kolapo-abidemi-899418a2/

Twitter: https://twitter.com/Jakolapo