That's right, I've started with a pleonasm. AWS stands for Amazon Web Services ... so Amazon AWS is mostly redundant. Mea culpa.
Why is Digital Ocean missing? Digital Ocean is pretty great in that it's cheap. But their persistent storage is a new feature and they lack any management tools whatsoever (serverless, container platforms, metrics, logging, etc).
Why is Azure missing? I have to underline that this is my personal opinion, not an exhaustive "versus" meant to dazzle with graphs and numbers. Azure as a platform is quite development friendly, but at the same time it discreetly pushes Windows as a primary platform. Their pricing isn't all that attractive either.
So, let's have at AWS vs GCP from the perspective of the features I'm using. Apple seems to be ok with both of them!
Some general stuff first.
GCP tops AWS on latency. Choose any region, launch a web application, you'll get top speed from GCP. Google has its own low latency network that speeds up internal works of the cloud. Any VPC (yes, both platforms use the same name for their private cloud) comes with latency associated with security (usually) and all the hoops requests have to go through but Google has successfully minimized theirs.
GCP tops AWS on UI and functionality of their management console. You also get a CLI in brower with all the functionality of any Unix-like terminal. In addition, any configuration screen ends with the option to copy CLI commands to reuse, in addition to the "apply" button to save whatever you were doing. AWS CLI tools are a pain from this perspective as you get only a couple of examples in docs and you need to learn by trying.
AWS tops GCP on support. Yes, on GCP you get a very nice feature in that regardless of where you are in the console, you can grab a screenshot, throw a description and send it away. But professional support is much more expensive than AWS' plans (probably also quite necessary as on AWS you can get away with many things by just asking on StackOverflow).
- Source control:
- AWS: shamelessly promotes CodeCommit as if it were a real tool. It integrates seamlessly into everything so code there can go through Amazon's CI/CD tools and you can have a pretty strong and stable system. But it's not Git and if you'd like to integrate with Git, your options are limited and requiring more effort than it's reasonable.
- GCP: works with almost everything, though possibilities in integration vary. Git is used for most of their tutorials, but integration value comes in the form of their support for CI/CD tools (none proprietary as opposed to AWS).
- Infrastructure as a service:
- AWS: You have EC2, which is a de-facto gold standard in the industry. Aside from a UI that comes from a 90's web nightmare, EC2 is great (particularly through the use of AWS CLI tools). If you look for sheer power, EC2 is ready to deliver as they have the most powerful instances currently on the market. But don't hope to be able to customize anything.
- GCP: their Compute Cloud is a decent answer to EC2. Better pricing than EC2 but their top offering can't hold a candle to EC2 in terms of CPU/memory quantities. On the other hand, their have an amazing UI that's a pleasure to use, every action you do is accompanied by the option to copy an equivalent CLI command to use as a template and most importantly, you can customize instances. No default VM with 2 CPUs and 2Gb of RAM? Just click customize and define your own!
- Platform as a service:
- AWS: There's ElasticBeanStalk, awkwardly abbreviated EBS just like their elastic storage. It's clunky to use via a tired old UI, but it's a great an inexpensive way to kickstart stuff, getting load balancing and autoscaling. Just make sure you don't provision on the fly, or your autoscaling is doomed to die.
- GCP: Google App Engine is the answer here. It's a bit more complex to setup that the AWS equivalent, but it's much more powerful and more stable. Also, there's a great wizard that's actually helpful (AWS is a bit of a pain here, with simply too many caveats to be truly seamless).
- Databases as a service:
- AWS: RDS is pretty great and tops GCP by a mile. You get a nice selection of database engines, including Amazon's own Aurora mySQL drop-in. To me, it's great to see the latest MariaDB offered as I find it to be the best and most versatile choice (even for NoSQL engines)
- GCP: offers CloudSQL whose only 2 options are PostgreSQL and mySQL. Meh.
- Serverless execution:
- AWS: Lambda is nice and goes great with CloudWatch and generally any component. Its cold start requirements aren't the most appealing for speed critical applications but the selection of languages is great.
- GCP: has Google Functions. They have a very nice API to work with, significantly better than Lambda. Lower latency across GCP means it's quite more usable for speed critical applications.
- AWS: being a gold standard, it's supported by any tool but Amazon shamelessly pushes OpsWorks and CloudFormation as infrastructure management tools. CF is clunky but well supported, OpsWorks is Chef oriented but very usable.
- GCP: Google Deployment is the CloudFormation counterpart, a much more friendly tool but not as well supported in the industry. I do like it much more than CF though.
- AWS: ECS stands for Elastic Container Service, which to me feels like a poor man's Docker Swarm. It's literally a UI wrapper over what Docker Swarm does, making it much more difficult to interact with. You get some JSON definitions to push over AWS CLI tools, just to throw in more confusion. It's clunky, annoying but somewhat usable.
- CGP: Kubernetes Engine is, well, Kubernetes. There's no mistery here, just a bit of UI add-ons that are helpful and in the worst case, not intrusive.
- Continuous Integration:
- AWS: You get CodePipeline which is very nice as long as you buy into CodeCommit. Otherwise, you get a few other options (Github, for example) or you can hook into external tools like Jenkins. You get little to no aid from AWS on this, a clear signal that you should buy into their tooling.
- GCP: really shines here. You get Google Container Builder which is absolutely perfect for managing containerised applications and deliver them anywhere. Both AWS and GCP offer Docker repositories but GCP also helps manage builds (of containers and of applications that need containers during their build). Aside from this, GCP holds your hand in integrating delivery with some tools provided as a service: Jenkins (you get tutorials on setting it up to integrate with everything GCP), CircleCI, Semaphore and most of all Spinnaker.
- Logging and metrics:
- AWS: has CloudWatch which used to be a pretty good standard. Aside from its ugly UI, CW is great in providing metrics and allowing you to act on them via alarms. However, it's not very transparent at that (for example you can define your alarms, but not every component gets to be able to act on them - for instance you can decide on scaling instances but not containers on the same alarm).
- GCP: has Stackdriver. While being just as comprehensive in terms of features, Stackdriver has a more complete integration inside its own cloud. Anything GCP needs just one click to deliver info to Stackdriver, including applications you want to run in the cloud. You start an instance running RabbitMQ or Jenkins (started through their offering of services)? Their logs are already in Stackdriver. Unfortunately there's less integration with custom tools (thinking Telegraf here) than CloudWatch. ALso, its UI is amazing and looks great on your phone as well ... as long as you run Android and don't mind being alerted on the fly. Hell, you can even monitor AWS stuff here!