Cloud computing is a buzzing word nowadays. It appeared as early as 1996, with the first known mention in a Compaq internal document (per Wiki). Many companies are joining the cloud computing journey and archived a lot of benefits.
I have been working on various cloud computing projects from start to finish; involved in the full project lifecycle, including design, planning, development, deployment, testing, maintenance, and support. Some clients prefer to use their on-premise data centers, but most of my projects used the cloud – Amazon Web Services, Microsoft Azure and Heroku. So, I wanted to write this post to share my cloud computing journey. My hope is to encourage you to build secure, scalable, highly available and cost-effective cloud applications. Learn to share and share to learn will help us all grow, don’t you agree?
If you are new to the cloud and wanted to explore more information, check out some articles as below:
- Why are so many businesses are moving to the cloud?
- Who Coined ‘Cloud Computing’?
- History of Cloud computing
- Check out 15 Top Cloud Computing Services Provider Companies
This is a lengthy article. So, if you prefer to simply view a particular topic, you can use the table of contents below.
Who am I?
Firstly, I’d like to introduce myself. My name is Hoang, I am the Co-founder and CTO of InnomizeTech. My title is CTO but I am a full-stack developer and software architect, passionate about Cloud Computing, Serverless, DevOps, Machine Learning, and IoT.
With 7+ years of experience in software development (web, desktop, and mobile), systems integration, Cloud computing, DevOps engineering, project management, and agile methodology, I thrive working both independently and collaboratively in a team, and have strong leadership and communication skills from working directly with both technical and non-technical stakeholders.
Starting my career as a software developer
- For the first two years, the primary programming language I used was C# (AWS .NET WebForm and AWS .NET MVC).
- For the next year, I transitioned to another role, leading a team working with system integration stuff using WSO2 and BizTalk, among other tools. I had a chance to work with our client’s CTO. We had a lot of fun and we did a great job.
The beginning of my cloud computing journey
In the third year, I started my first Cloud computing project. We had a project from a US-based client to build an application for activating mobile devices for various carriers. I was the technical lead of that project. After studying the requirements, we selected the following technology stack:
- Node.js for back-end, using the Sails.js framework
- MySQL database and using Sequelize for ORM. We used Liquibase generate, migrate database schema using source control.
- Angular for the front-end application
Actually, it isn’t a real cloud-based application, since we used only a few cloud services to build the app. We have built the app and used the Elastic Beanstalk service for hosting. I have studied Jenkins and built a Jenkins job for analyzing code, building, testing, and deploying to the Elastic Beanstalk app. Here is the diagram of the CI/CD I’ve built at that time:
We initially hosted the application on Elastic Beanstalk apps in order to apply our CI/CD script using AWS Beanstalk plugin on Jenkins for deployment. However, our client wanted to host it on their data center. Then we still use Beanstalk for our SIT/UAT environments, but we had to write documentation around 10 pages to describe how to set up Web Servers, App Servers, NGINX, Node.js, RDS, etc. A lot of back and forth communications between our development team and infra team because of issues and errors. But finally, we have successfully deployed, the app is up and running.
We kept working on that project for around a year. While developing new features, I also learned Ansible and built some playbooks to allow my client to deploy the app automatically without manual steps.
At that time, I and my co-workers have established a technical club to study and share about cloud computing. We learning cloud computing concepts, doing some hand-on exercises with AWS and Microsoft Azure. You can visit our Facebook page to see our activities and great memories.
Before leaving the company, I have studied and shared my CI/CD experiences. I have presented this presentation for my promotion to the Senior Engineer position (I have changed a few things to share with everyone).
My startup journey is just started
In August 2017, I have started my own job. We had a project for building a core/shared backend API for various client applications including SPA, Mobile App, Integration services. After clarifying requirements with our clients, we have selected the below technology stack:
- AWS Lambda using Node.js runtime and Amazon API Gateway that utilize Auth, Caching, Logging, Monitoring Throttling, Bursting Elastic features for backend services.
- Amazon Cognito User Pool for authentication and authorization.
- Amazon Aurora for the relational database. We keep using Sequelize and Liquibase.
- Amazon Elastic Cache (Redis) for in-memory caching.
- Other AWS services we have used such as VPC, S3, SNS, SQS, CloudWatch, Route53, Certification Manager, AWS System Manager, AWS Parameter Store, X-Ray
- Angular for the frontend app. Static hosting with S3 and CloudFront.
- Jasmine, Protractor for unit test, integration test and E2E test.
- We still use Jenkins for our DevOps server. But instead of defining the job manually on the admin console page, we wrote a Jenkinsfile that using the Mutliplebranch pipeline.
- And more…
We kept applying the same stack to a few projects for other clients and continuously improve and refactoring our core modules/libraries. We have delivered and received positive feedback from our clients. The applications were running well, lower cost, high availability, secured.
In relation to DevOps, we have all the stuff scripted and provided CLIs to allow build and deploy applications automatically. We’ve used CloudFormation to provision and configure infrastructure components such as VPC, RDS. We outlined steps to deploy/remove and send it over to our client, DevOps engineers, they can deploy a new environment using a few commands then remove completely without manually step. Automation reduces human mistakes and increases productivity and quality.
My own company is officially established
In October 2018, we officially established InnomizeTech, our mission is to create awesome products that will make your everyday life easier. My aim is to build a professional team with passion, enthusiasm, and talent that can help bring more value to our customers, help them moving fast and right direction.
Experienced engineering and development team at Innomize are committed, passionate, and continually challenge themselves on the advancements and changes of the technologies we utilize to deliver the most up-to-date and innovative solutions.
We got the first AWS certification
I and my team have been learning, building a lot of real-world cloud-based applications for many years. To prove with our clients that we had experiences to do their jobs, we have studied and taken some AWS exams and finally, our team got AWS certifications:
- 02 AWS Certified Solution Architecture – Associate
- 02 AWS Cloud Practioner
- 01 AWS Certified Developer – Associate
We have been with The Coral Edge our partner and primary client. Recently, they officially became the Select Consulting Partner with AWS and we are their Development Team.
A few more serverless projects
Early 2019, we had a contract with another client from the US, we will help their development team maintenance and build new features for their micro-services (the integration component for their e-commerce system). They used Scala as their programming language, Gradle for the build tool, their developer implemented some Gradle tasks to deploy Lambda function, create the API gateway, and other required AWS resources. Here is the technology stack I can summary:
- Each microservice has its own Lambda function and API Gateway as the original design. They had an NGINX server as a reserved proxy server that will route traffic to AWS API gateways based on the request path.
- http4s as the interfaces for Restful API.
- They used the Postgres database and also using Liquibase to manage their database schema and versioning. They used Doobie for functional JDBC for Scala.
- Sentry for error monitoring and reporting.
- They do use AWS CodeBuild, AWS CodeDeploy, and AWS CodePipeline to implement CI/CD but it isn’t fully implemented when we join their team.
When our developers working with their team, we have proposed some approaches to enhance and refactor their design:
- To remove their NGINX server and cost, we suggest they apply the Robust API pattern.
- We helped design and built a project template in order to add a new microservice easily. Here are some of our ideas:
- Defining a project template that uses AWS CodeStart which will allow us creating CodeCommit repository, define CodeBuild projects, CodePipelines automatically when creating a new project. New microservices can be up and running by using a single command.
- We suggest using AWS SAM framework for building Lambda function and defining required AWS resources (i.e. Queue, Bucket, Topic, etc.). Previously, they deployed Lambda and other resources by implementing custom Gradle tasks.
Our most recent cloud computing projects
Recently, we have been working on some projects that apply Micro-service architecture. We continue the above technology stacks with some changes/improvements:
- We used NX Dev Tool to define our workspace on a Monorepo. We built our CI/CD pipeline that supports deploy only affected apps by a change instead of redeploying all services. Thanks to the NX team for their idea and awesome tool.
- Step Functions for our micro-service communication, automated workflow.
- NestJS for our Restful API that running on AWS Lambda.
- AWS CDK to provision and configure our infrastructure as code (IoC)
- Jest, Cypress for unit test, integration test, and E2E testing.
- Along with using Cognito we also using Okta, AuthO for authentication and authorization.
- CI/CD with AWS Develop Tools, Jenkins, Azure DevOps.
- Along with using Node.js runtime, we also using Java/Scala, .NET Core runtime.
We focused on AWS as the primary cloud vendor and wanted to become an active development service as partnering with them. Along with cloud computing, our team also has experience in other technologies. We work with the latest technologies specializing in Web Development, Mobile Development, Cloud Computing (AWS, Azure), DevOps, and Automation Testing. Refer to our Services section on our website for more information.
We continue working on some other projects such as:
- DevOps using CloudFormation, AWS CDK, Ansible
- Amplify framework: hosting, authentication, Mobile App with AppSync.
- Ruby on Rails app on AWS ECS.
- Headless upload bills to various sites with AWS ECS and Protractor (End to end automation test with Protractor).
- Serverless web crawler with Puppeteer on AWS Fargate that I recently wrote that post.
- React, Amplify, AppSync.
- Work with other AWS services such as AWS WAF, AWS Shield, Glue, ElasticSearch, Kenesis, Athena.
- We helped some clients design and define DevOps, CI/CD pipeline using AWS Developer Tools, Azure DevOps.
My future plan
My quote is “Learn to share and share to learn”, I am continually challenging myself on the advancements and changes of the technologies. I wanted to meet more people, talk, work and help them. I do have a few things in my list to I am going to do:
- Build InnomizeTech stronger, work with more clients and collaborate with more people.
- Learn more things such as Machine Learning, Deep Learning, Transfer Learning, Convolution Neural Network, IoT.
- Build my own product.
I cannot describe anything about myself on this post, if you wanted to know more about me and our team, then you can get in touch with me via:
If you are looking for developers, offshore team, or need consulting about the AWS cloud, Serverless architecture, and so on, then hire us, we can help you!
Thank you for reading!