DevOps can be a handful. Between choosing the correct products and getting your idea out there; it is a necessary evil. Before starting to use AWS, or any Platform As A Service, I had only experience with a couple of VPS providers. Simple servers where I create and configure all the functionality. A lot of developers try to create all of the functionality they need buy either programming it themselves or installing and configuring an app to assist in certain tasks. AWS has a number of products that can by pass all of that effort and can be ready to go right out of the box.
Amazon Web Services welcomes new users to try out its services with many free services. Some are free indefinitely and some have a year limitation. You can view all their free tier and limitations on their website. The most notable services for me were DynamoDB (25GB always free), 750 hours of EC2 VPS(12 month free), RDS (managed relational database storage 750 hours 12 months free), and Lambda Serverless (1M calls per month always free). These couple of services being free allows you to very easily get up and running and be able to execute on your ideas with minimal start up cost. It also gives you the opportunity to explore different architectures for how you want to structure your application. I will only cover the various services I used and my implementations.
AWS Lambdas: Serverless Computing
Serverless is easily the coolest idea that has come to help development. The concept is simple: you write a function that does one job and it is executed anytime the serverless function is activated via various methods. Nothing to manage and nothing persists. An AWS Lambda has a list of triggers that can be used to activate your function. The most notable uses are Alexa skills, API Gateway(turn them into REST calls), various messaging queues, and Cognito (identity system) uses them for the authentication/authorization flow. AWS Lambas have one big selling point over there competition as they support the most languages out of any other serverless provider. NodeJS is the most common between them all but AWS expands this to Go, Java, C#, and Python.
I experimented with Lambdas pretty extensively. Creating simple API calls even authenticated ones was simple once you understand the ecosystem including Lambda Event Sources. Nin.codes was entirely built using Lambdas and API Gateway. After learning about environment vs stage variables and how to separate a development and production environment the work flow kept getting easier.
Beyond APIs, I wanted to use lambdas as a way to send emails with attachments at any scale. The biggest concern was if many users sent emails with 10MB pictures then I could exhaust all my ram, but this isn't a concern if each web cal was isolated to a single Lambda instance. The main server would send an SNS, Simple Notification Service, like a queue and that would be my Lambda trigger. If 2,000 emails were sent at once the main server would need 20GB ram but Lambdas allow me to break this down into 2,000 instances of 128MB ram computing processes. Fantastic way to keep costs low.
Authentication and Authorization Flows
Cognito has a series of processes that are executed for authentication and authorization flows that are 100% powered by Lambdas. My specific use for these were to populate JWTs with essential user data and populating the database with new users when they sign up. There are several other was to customize the Cognito flow that I did not experiment with but it is nice to know the flexibility exists.
New Tech Is Fun
After using AWSs serverless solution is many different ways I can say this is easily their best product and is ahead of the competition. If I need something done in serverless this will definitely be my first choice unless I am exploring another services product line in the future.
DynamoDB and Relational Database Service(RDS)
Database as a service, DBaaS, is not something I have had a privileged to play with before. Like most others starting with relational databases, I am used to installing MySQL and manually configuring it for my needs and using some type of tool to interact with the database if needed. The thought of having a provider set up everything and controlling through a web interface did not really seem necessary until you realize the convenience. I can still open a port to allow my favorite utilities to connect to the DB instance or I can used the AWS Console from any browser and not worry about firewall rules. The RDS instance runs on top of a server you pay for plus a premium for the RDS software. This can instantly double the cost of a small app. For a cost consciences person like myself, I would rather have my database instance sit on my main server until it grow out of it.
AWS has a fantastic NoSQL solution and it is called DynamoDB. It is litterally as simple as creating a table. The free tier of DynamoDB gives you a decent amount of room and the price after the free tier is minimal and pay as you use unlike the fixed cost associated with the RDS instances. My implementation of DynamoDB is a simple key/value store that powers Nin.codes. I have received some major spikes such as 15 reads/writes a second during peak traffic times and havent seen any issues.
S3: Object Storage
S3 is great. AWSs implementation of object storage helps you keep your starting costs as low as possible as you only pay for the storage in use and not a starting flat cost. This was a prime service that I used to power most of my ideas. Storing images or other kinds of fails is super easy and fast. There were not noticable performance issues while I was experimenting. There is built in redundency and they even recently started offering a lower cost single zone plan. Also available are lower frequent access tiers to drop you costs even lower if you are storing large amounts of data over extended periods of time. Check out all of the S3 pricing for more info.
Man is this the low point. All of the products tend to have a learning curve even if you fully understand what the product is doing. Configuration is a step in every single step of AWS work. From setting up IAM rules to allow two services to speak to making sure a VPS is set up to allow you access to your database, there is a lot of headache and heart ache to be had. Great when you truly use all of the power available from everything; awful when you need something simple to just get out the door.
The console is antiquated. Eventually you understand the flow of how to get around and how to use the various dashboards but there is a lot to be desired.
Amazon Web Services gives you a ton of products to get as creative as you want to build the architecture of your dreams. No other rival comes close to their catalog of products. If you have a simple single server that doesn't need to scale the complexity of everything adds a thick layer of needless headache and other no-frills VPC providers might be a better choice. If you need some basic features like load balancing, firewalls, CDNs, etc there are smaller some great providers out there. If you have need for all the bells and whistles while wanting to learn AWSs lingo: GO FOR IT! You might get locked into the AWS ecosystem making it difficult to move. Starting out as simple as possible is the best idea unless your product and greatly benefit from so of their offerings.