As a start, let's look at the core services that AWS has to offer, which will be relevant to creating your applications in a cloud-native way.
AWS offers a very rich portfolio of services that includes core components around infrastructure capabilities, such as Amazon EC2 (virtual servers in the cloud), Amazon EBS (block storage for EC2), Amazon S3 (cloud-based object storage), and Amazon VPC (isolated cloud resources using virtualized networks). These services have existed for multiple years now and are pretty mature for an enterprise-scale deployment level as well. Apart from scale, these services have very deep feature sets that provide ample options to the end customers to pick and choose configurations as per their specific business requirements. As an example, Amazon EC2 offers more than 50 different types of instances to cater to various possible workloads and use cases. So, if a customer to host a high-performance computing (HPC) workload, then there's an option to use compute optimized instances, whereas if you have a NoSQL database that is hungry for high IOPS with low storage latency, then storage optimized instances come in handy.
In fact, AWS has been adding newer instances types as well as updating to newer, faster processors with larger memory footprints every year, which makes it easier for the customers to leverage the latest and greatest compute configurations without having to worry about typical data center procurement and upgrade cycles. Likewise, on the storage and networking front, Amazon EBS, Amazon S3, and Amazon VPC provide multiple configuration options that can provide flexibility when required.
Couple of the biggest benefits that cloud provides are Elasticity and Agility, which basically means that you can spin up and down your infrastructure in lines with your application's needs. This is very different from the traditional data center approach, where everything had to provisioned for peaks, because of which the infrastructure resources were either way too underutilized or were not scalable for some unpredictable peaks. This has radically changed with the cloud, where providers such as AWS have come up with innovative services such as Auto Scaling, wherein you can automatically change your compute fleet size based on certain application behaviors, such as increased CPU utilization or even custom application monitoring metrics. Apart from triggers based on scaling, you can also autoscale the compute capacity based on time-based usage patterns, for example, hourly, daily, or weekly variability in usage. Very similar to compute autoscaling, AWS also offers Elastic EBS volumes, wherein you can increase volume size, adjust performance, or change the volume type while the volume is in use. These types of services and capabilities are definitely differentiators for the cloud and have in fact become the new normal to build web-scale applications. However, in order to use some of these autoscaling features, applications also need to be ready from an architecture standpoint. As an example, if you want to use autoscaling capabilities for your web server fleet to accommodate increased load on your website, then one of the core changes needed from an application standpoint is that you should not have session state information stored locally on any web server. The same should be externalized in a cache (such as Amazon ElastiCache) or even a database (such as Amazon DynamoDB), so that you can seamlessly scale up or down your webservers fleet without having to worry about a users' session disruption because of that.
The following is a sample architecture that AWS publishes for auto-scalable web applications using various core services:
Web application hosting setup (Source – http://media.amazonwebservices.com/architecturecenter/AWS_ac_ra_web_01.pdf)
Now, over and above the core building blocks, such as the ones mentioned in the preceding diagram, AWS offers various higher-level managed services that make it easier for the end user to quickly start deploying their applications without having to worry too much about the underlying infrastructure. As an example, there's Amazon RDS, which is a managed relational database service for MySQL, PostgreSQL, Oracle, SQL Server, and MariaDB. Amazon RDS provides flexibility to set up and operate a relational database while automating time-consuming administration tasks, such as hardware provisioning, database setup, patching, and backups. So, by using this service, you can quickly get started with your database deployments without requiring any specific database administrator level skills. Apart from this, AWS also offers many other services, such as AWS Elastic Beanstalk (to run and manage web apps) and Amazon OpsWorks (to automate operations with Chef), which are like higher-level services in the category of PaaS.
Using these services, you can quickly get your applications running on AWS without getting into the nitty-gritty of the underlying infrastructure. With Amazon OpsWorks, you get an extra set of controls as well, wherein if you want to automate a specific application setup/launch procedure, then you have the capabilities to do that using your own custom Chef recipes.
Other than the preceding points, AWS also offers PaaS services in the big data / analytics and AI space, such as Amazon EMR (hosted Hadoop framework), Amazon Kinesis (works with real-time streaming data), Amazon Lex (builds voice and text chatbots), Amazon Rekognition (searches and analyzes images), and Amazon Polly (turns text into lifelike speech). Using these types of service, developers and data architects can easily create their applications by focusing more on the business logic than the underlying infrastructure management aspects.
Over the last few years, AWS has aggressively moved much further in terms of offering totally newer types of services, which are closer to SaaS. These are mainly the services as part of its business productivity category, such as Amazon Chime (a managed service for video calls and chat), Amazon WorkDocs (enterprise storage and sharing service), and Amazon Connect (managed contact center service). This is a fairly new area for AWS as well, but as these services along with the ecosystem matures, it will create new possibilities for end users to look at the cloud, not just from an infrastructure or platform perspective, but to also utilize productivity software in a pay-as-you-go model.
As mentioned in Chapter 1, Introducing Cloud Native Architecture, CNMM is a maturity model wherein if you are using only core building blocks from the cloud (such as, infrastruct...