Some time ago I started learning Cloud infrastructure fundamentals and integrated a few Cloud services in my development graduation work. At some point I thought it would be fun to deploy my application, trying the different Cloud providers to see if one is more fitted for Java applications (one would think Oracle Cloud is more suited and Microsoft Azure absolutely not, will it be the case? follow me to find out!), if there are big price differences, how easy it is (or how complicated), and so on.
This article was mentioned in JetBrains’ Java Annotated Monthly (January 2022)
How difficult and expensive is it to deploy a Java application on Azure, AWS, Google or Oracle clouds?
So here we are friends! In this series of articles, I will try to deploy my Java/Spring Boot and Angular application to 4 Cloud providers:
- Microsoft Azure
- Oracle Cloud Infrastructure (OCI)
- Amazon Web Services (AWS)
- Google Cloud Platform (GCP)
Why this choice? AWS surely is the biggest player on the market right now, Azure is growing really fast, GCP is not doing too bad and I’m curious about it. Then there’s Oracle, which has fewer parts on the market, but since I’m deploying Java, I have to test with Oracle. And I know the 4 of them offer a 30-days offer with some credit to test their services, very important point.
Way of working of this challenge
My first attempt will be with Azure. I know quite a few things about Azure as I’ve already integrated some of their services and studied for the Azure Developer Associate certification. So there’s a high chance I’ll discover the services faster because I now their GUIs and I already know which services I want to use, although I never used these in particular. To balance a bit, it will be the first that I’ll try (I expect to face a lot of issues on the first try, that will serve as experience for the next ones).
Then I’ll work with Oracle. I know a little about Oracle cloud but never used it. Then I’ll randomly choose between Google and Amazon.
I will deploy my application exactly the same way on the 4 Cloud platforms (as I show below), in order to be able to compare some metrics and impressions like:
- Time spent per task and on the whole deployment
- Costs estimation
- Ease of use
- Documentation quality
If doable, I’ll make deployment templates available on my GitHub account (for example, the ARM templates from Azure). I might be tempted to test some specific services, like the Spring Cloud deployment service by Azure, but that would only be a bonus, and that’s only if I haven’t gone crazy by then.
The deployment schema of my application
The application I will try to deploy is a quite basic 3-Tier web app. The client is developed with Angular 11 and authenticated with Auth0 service (for the sake of simplicity I will keep it like this)(because security, am I right?), but it still means it has to be accessed through https.
The back-end is a Spring Boot application, the database is PostgreSQL.
I want to use an API management solution, including app authentication management (because security, am I right?).
To add a little complexity, I’ll have a message queue that receives messages from an external service, and use a function to make calls to the API when a new message arrives. Just to make it a bit spicier.
At least, this is how I imagine the deployment schema, but I have to admit it’s strongly influenced by what I know from the Azure services and which ones I intend to use. It could change over time or be slightly adapted case by case.
So that’s it for the introduction. The following articles will be my attempts at deploying on the various providers (if I don’t quit after doing it on Azure), so if you’re curious about how it goes, make sure to subscribe to the upcoming posts, or follow me on LinkedIn!