Designing an Operationally Excellent Architecture
Solution Design

In this module, we will apply the skills we have learned thus far to select and combine AWS services together to create a highly available web site. First, we will create a strawman design based on the requirements we are given. Then we will implement the solution design in the AWS console setting up the services we have selected.  Then we will review our solution architecture looking for possible improvements and optimizations, aiming to create the most operationally excellent architecture possible.


- [Instructor] Now let's launch a highly available, fault tolerant, cost efficient application infrastructure. So, let's start with our design. Our customer, Acme Widgets, is a successful widget maker with a growing global customer base. The widget support page they offer has very high traffic when they release new widgets. Our brief is to launch a highly available support application which will ensure a reliable, always-on customer experience for Acme Widgets' end customers. The customer has used a local data center for their first two years of operation which unfortunately did not scale well when they launched a successful widget. People tried to view the support page for a widget in the first hour of a widget release and the web server hosted in the data center did not scale to meet that burst activity requirement. As the web servers in question did not recover quickly, the client lost a number of customers. Acme Widgets wants a better solution and we need to ensure what we propose will deliver a scalable, highly available, fault tolerant environment for the lowest possible cost. We look for opportunities to use our top 10 highly available services that we've been discussing as a way to help us check point every opportunity to improve availability, scalability and fault tolerance. And of course, we'll be looking for options that deliver on our requirements in the most cost-efficient way. Let's take it step by step so we have time to discuss some of the design principles relevant to the Solution Architect Associate exam. So, first off, it's a key priority that this system is always available, so we need to consider deploying into multiple availability zones. Having reviewed the current and projected user stats, we've determined that if we use CloudFront as a CDN, launching services in one region should meet requirements. It's easy to deploy in other regions if we need to so that can be our first cost-optimization design decision. We'll deploy DNS services on route 53 using failover so services can continue running in one AZ if the other AZ suffers some kind of incident or outage. To achieve our high availability, we'll launch multiple instances in our application layer. Our application instances we'll put behind an elastic load balancer to ensure effective and evenly distributed use of all our instances and to add that additional layer of security as we'll terminate SSL connections at the elastic load balancer. So, we're going to need a resilient database layer as well. To ensure high availability in our database layer, we'll run an RDS database instance. We'll deploy CloudWatch alarms using SNS alerts to notify us when there's a change to our auto scaling group size and database metrics to notify us if our database's performance exceeds our performance criteria. Keep in mind, CloudWatch notifies us of changes in state and the alarm states are, that's right, OK, alarm and insufficient data. Okay, so that's our proposed high-level straw man design. Is there anything we could add to improve our availability and security before we stand this up and test out our hypothesis? Let's think through our list of high availability services that AWS provides to help us design highly available, cost-efficient, fault tolerant solutions. Regions, AZs, VPC, ELB, SQS, EC2, EIPs, route 53, CloudWatch and auto scaling. So, we've got nine out of our 10 already and we can look for opportunities to decouple our layers using SQS in our next optimization stage. Another improvement will be CloudFront. As a distributed content delivery network, CloudFront will add another layer of resilience to our design. It's reasonably cheap to deploy and as a distributed network, it adds another layer of redundancy and security while ensuring we have the fastest possible response times for our end users plus we have the option to provide paid for content using CloudFront security to deliver private content to known users. Okay, so let's build a straw man so we can test out our hypothesis. One of the great benefits of AWS is that we can literally stand up the environment to test out that our design is meeting the requirements that we have. So, let's get started on that.

About the Author
Learning Paths

Andrew is fanatical about helping business teams gain the maximum ROI possible from adopting, using, and optimizing Public Cloud Services. Having built  70+ Cloud Academy courses, Andrew has helped over 50,000 students master cloud computing by sharing the skills and experiences he gained during 20+  years leading digital teams in code and consulting. Before joining Cloud Academy, Andrew worked for AWS and for AWS technology partners Ooyala and Adobe.