My Cloud computing journey
Tags: journey, cloudcomputing, clouddev, learning
Published: 2019-11-16 14:27:34

<!-- wp:paragraph -->
<p><em><strong>Cloud computing</strong></em> is a buzzing <em>word nowadays</em>. It appeared as early as 1996, with the first known mention in a Compaq internal document (<a href="https://en.wikipedia.org/wiki/Cloud_computing">per Wiki</a>). Many companies are joining the cloud computing journey and archived a lot of benefits. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>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 - <a href="https://aws.amazon.com/">Amazon Web Services</a>, <a href="https://azure.microsoft.com/en-us/">Microsoft Azure</a> and <a href="https://www.heroku.com/">Heroku</a>.  So, I wanted to write this post to share my <a href="https://en.wikipedia.org/wiki/Cloud_computing">cloud computing</a> journey. My hope is to encourage you to build secure, scalable, highly available and cost-effective cloud applications. <strong>Learn to share and share to learn </strong>will help us all grow, don't you agree?</p>
<!-- /wp:paragraph -->

<!-- wp:more {"customText":"READ MORE"} -->
<!--more READ MORE-->
<!-- /wp:more -->

<!-- wp:paragraph -->
<p>If you are new to the cloud and wanted to explore more information, check out some articles as below:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li><a href="https://www.bluesilvershift.com/why-are-so-many-businesses-moving-to-the-cloud-2/">Why are so many businesses are moving to the cloud?</a></li><li><a href="https://www.technologyreview.com/s/425970/who-coined-cloud-computing/">Who Coined 'Cloud Computing'?</a></li><li><a href="https://cloudcomputing521.wordpress.com/2017/05/01/history-of-cloud-computing/">History of Cloud computing</a></li><li>Check out <a href="https://www.softwaretestinghelp.com/cloud-computing-service-providers/">15 Top Cloud Computing Services Provider Companies</a></li></ul>
<!-- /wp:list -->

<!-- wp:image {"align":"center","id":303} -->
<div class="wp-block-image"><figure class="aligncenter"><img src="https://blog.innomizetech.com/wp-content/uploads/2019/11/Cloud_computing.svg_-1024x928.png" alt="Cloud Computing" class="wp-image-303"/><figcaption>Cloud Computing from Wiki</figcaption></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>This is a lengthy article. So, if you prefer to simply view a particular topic, you can use the table of contents below.</p>
<!-- /wp:paragraph -->

* [Who am I?](#chapter-1)
* [Starting my career as a software developer](#chapter-2)
* [The beginning of my cloud computing journey](#chapter-3)
* [My startup journey is just started](#chapter-4)
* [My own company is officially established](#chapter-5)
* [We got the first AWS certification](#chapter-6)
* [A few more serverless projects](#chapter-7)
* [Our most recent cloud computing projects](#chapter-8)
* [Other works](#chapter-9)
* [My future plan](#chapter-10)

<!-- wp:heading {"level":4} -->
<a name="chapter-1"/>
<h4>Who am I?</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Firstly, I'd like to introduce myself. My name is <strong>Hoang</strong>, I am the <strong>Co-founder and CTO </strong>of <a href="https://www.innomizetech.com/">InnomizeTech</a>. My title is <strong>CTO</strong> but I am a <strong>full-stack developer</strong> <strong>and software architect</strong>, passionate about <strong>Cloud Computing</strong>, <strong>Serverless</strong>, <strong>DevOps</strong>, <strong>Machine Learning</strong>, and <strong>IoT</strong>.  </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>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. </p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<a name="chapter-2"/>
<h4>Starting my career as a software developer</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Before transitioning to <a href="https://en.wikipedia.org/wiki/Cloud_computing">Cloud computing</a>, I worked for an <a href="https://en.wikipedia.org/wiki/Outsourcing">outsourcing</a> company in Vietnam for four years after I graduated from University. </p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li><strong>For the first two years</strong>, the primary programming language I used was <strong>C# (AWS .NET WebForm and AWS .NET MVC)</strong>. </li><li><strong>For the next year</strong>, I transitioned to another role, leading a team working with system integration stuff using <a href="https://wso2.com/">WSO2</a> and <a href="https://en.wikipedia.org/wiki/Microsoft_BizTalk_Server">BizTalk</a>, 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.</li></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":4} -->
<a name="chapter-3"/>
<h4>The beginning of my cloud computing journey</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><strong>In the third year</strong>, I started my first <strong>Cloud computing</strong> 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:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li><a href="https://nodejs.org/en/">Node.js</a> for back-end, using the <a href="https://sailsjs.com/">Sails</a><strong><a href="https://sailsjs.com/">.</a></strong><a href="https://sailsjs.com/">js</a> framework</li><li><a href="https://www.mysql.com/">MySQL</a> database and using <a href="https://sequelize.org/master/manual/getting-started.html">Sequelize</a> for ORM. We used <a href="https://www.liquibase.org/">Liquibase</a> generate, migrate database schema using source control.</li><li><a href="https://angular.io/">Angular</a> for the front-end application</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Actually, it isn't a real <a href="https://searchcloudcomputing.techtarget.com/definition/cloud-application">cloud-based application</a>, since we used only a few cloud services to build the app. We have built the app and used the <strong><a href="https://aws.amazon.com/elasticbeanstalk/">Elastic Beanstalk</a></strong> service for hosting. I have studied <a href="https://jenkins.io/">Jenkins</a> 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:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"center"} -->
<div class="wp-block-image"><figure class="aligncenter"><img src="https://lh6.googleusercontent.com/yOk8wjRhW5bKQWktKIM3ntmOZaW7hDoWWKoLHv11XJvapQoNolW9iCzhlaS5hGGEf2ZYp4HOQdt4Aqx1fjzoYoTy_5azOADKqbVmX1fB3G2duqN_gizSvh9KJfTUKy7IfYs2RepbzxGckPE8Bw" alt="C:UsersHoangDownloadsCI-CD With Jenkins + Docker Cloud (1).png"/><figcaption>CI/CD with Jenkins CI</figcaption></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>We initially hosted the application on <strong>Elastic Beanstalk</strong> 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 <strong>10 pages</strong> to describe how to set up <strong>Web Servers, App Servers</strong>, <strong>NGINX</strong>, <strong>Node.js,</strong> <strong>RDS</strong>, <strong>etc</strong>. A lot of back and forth communications between our <strong>development team</strong> and <strong>infra team</strong> because of issues and errors. But finally, we have successfully deployed, the app is up and running<strong>.</strong> </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>We kept working on that project for around a year. While developing new features, I also learned <a href="https://www.ansible.com/">Ansible</a> and built some playbooks to allow my client to deploy the app automatically without manual steps. </p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li><a href="https://blog.innomizetech.com/2019/10/24/continuous-deployment%">Continuous Deployment - Deploying A Node.Js App To AWS EC2 Using&nbsp;Ansible</a></li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>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 <strong>AWS</strong> and <strong>Microsoft Azure</strong>.  You can visit our <a href="https://www.facebook.com/groups/992679037443304/">Facebook page</a> to see our activities and great memories.  </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Before leaving the company, I have studied and shared my CI/CD experiences. I have presented <a href="https://www.slideshare.net/HoangLe84/introduction-to-cicd-190596305">this presentation</a> for my promotion to the <strong>Senior Engineer</strong> position (I have changed a few things to share with everyone).</p>
<!-- /wp:paragraph -->


<!-- wp:heading {"level":4} -->
<a name="chapter-4"/>
<h4>My startup journey is just started</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>In <strong>August 2017</strong>, I have started my<strong> own job</strong>. We had a project for building a core/shared backend API for various client applications including <strong>SPA</strong>, <strong>Mobile App</strong>,<strong> Integration services</strong>. After clarifying requirements with our clients, we have selected the below technology stack:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li><a href="https://aws.amazon.com/lambda/">AWS Lambda</a> using Node.js runtime and <a href="https://aws.amazon.com/api-gateway/">Amazon API Gateway</a> that utilize Auth, Caching, Logging, Monitoring Throttling, Bursting Elastic features for backend services.</li><li>We use the <a href="https://serverless.com/">Serverless</a> framework for building API, deploy and configure AWS resources such as S3 bucket, SNS topic, Queue, DynamoDB. At this time, we used <strong>JavaScript</strong> as the primary programming language. </li><li><a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html">Amazon Cognito User Pool </a>for authentication and authorization.</li><li><a href="https://aws.amazon.com/rds/aurora/">Amazon Aurora</a> for the relational database. We keep using <a href="https://sequelize.org/master/manual/getting-started.html">Sequelize</a> and <a href="https://www.liquibase.org/">Liquibase</a>.</li><li><a href="https://aws.amazon.com/elasticache/">Amazon Elastic Cache (Redis) </a>for in-memory caching.</li><li>Other AWS services we have used such as VPC, S3, SNS, SQS, CloudWatch, Route53, Certification Manager, AWS System Manager, AWS Parameter Store, X-Ray</li><li><a href="https://angular.io/">Angular</a> for the frontend app. Static hosting with<a href="https://blog.innomizetech.com/2019/10/25/how-do-we-host-our-static-website/"> S3 and CloudFront</a>.</li><li><a href="https://jasmine.github.io/">Jasmine</a>, <a href="https://www.protractortest.org/#/">Protractor</a> for unit test, integration test and E2E test.</li><li>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 <a href="https://jenkins.io/doc/tutorials/build-a-multibranch-pipeline-project/https://jenkins.io/doc/tutorials/build-a-multibranch-pipeline-project/">Mutliplebranch pipeline.</a></li><li>And more...</li></ul>
<!-- /wp:list -->

<!-- wp:image {"id":300} -->
<figure class="wp-block-image"><img src="https://i0.wp.com/blog.innomizetech.com/wp-content/uploads/2019/11/image-7.png?fit=640%2C231&amp;ssl=1" alt="" class="wp-image-300"/><figcaption>Jenkins Pipeline Execution</figcaption></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>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.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>In relation to <strong>DevOps</strong>, we have all the stuff scripted and provided CLIs to allow build and deploy applications automatically. We've used <a href="https://aws.amazon.com/cloudformation/">CloudFormation</a> 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. <strong>Automation reduces human mistakes and increases productivity and quality.</strong></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<a name="chapter-5"/>
<h4>My own company is officially established</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>In <strong>October 2018</strong>, we officially established <a href="https://www.innomizetech.com/">InnomizeTech</a>,&nbsp;our mission is to&nbsp;create awesome products that will make your everyday life easier.  <strong>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. </strong> </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Experienced engineering and development team at <strong>Innomize</strong> 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.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<a name="chapter-6"/>
<h4>We got the first AWS certification</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>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:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>02 AWS Certified Solution Architecture - Associate</li><li>02 AWS Cloud Practioner</li><li>01 AWS Certified Developer - Associate</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>We have been with <a href="https://www.thecoraledge.com/">The Coral Edge</a> our partner and primary client. Recently, they officially became the <strong>Select Consulting Partner</strong> with <strong>AWS</strong> and we are their Development Team. </p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<a name="chapter-7"/>
<h4>A few more serverless projects</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><strong>Early 2019</strong>, 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 <a href="https://www.scala-lang.org/">Scala</a> as their programming language, <a href="https://gradle.org/">Gradle</a> for the build tool, their developer implemented some <a href="https://gradle.org/">Gradle</a> tasks to deploy Lambda function, create the API gateway, and other required AWS resources.  Here is the technology stack I can summary:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Each microservice has its own <strong>Lambda</strong> function and <strong>API Gateway</strong> as the original design. They had an <a href="https://www.nginx.com/">NGINX</a> server as a <a href="https://en.wikipedia.org/wiki/Reverse_proxy">reserved proxy </a>server that will route traffic to AWS API gateways based on the request path.</li><li><a href="https://github.com/http4s/http4s">http4s</a> as the interfaces for Restful API.</li><li>They used the <strong>Postgres</strong> database and also using <strong>Liquibase</strong> to manage their database schema and versioning. They used <a href="https://github.com/tpolecat/doobie">Doobie</a> for functional JDBC for Scala.</li><li><a href="https://sentry.io/welcome/">Sentry</a> for error monitoring and reporting.</li><li>They do use <a href="https://aws.amazon.com/codebuild/">AWS CodeBuild</a>,  <a href="https://aws.amazon.com/codedeploy/">AWS CodeDeploy</a>, and <a href="https://aws.amazon.com/codepipeline/">AWS CodePipeline</a> to implement CI/CD but it isn't fully implemented when we join their team.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>When our developers working with their team, we have proposed some approaches to enhance and refactor their design:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>To remove their NGINX server and cost, we suggest they apply the <a href="https://www.jeremydaly.com/serverless-microservice-patterns-for-aws/">Robust API</a> pattern.</li><li>We helped design and built a <strong>project template</strong> in order to add a new microservice easily. Here are some of our ideas:<ul><li>Defining a project template that uses AWS CodeStart which will allow us creating <strong>CodeCommit</strong> repository, define <strong>CodeBuild</strong> projects, <strong>CodePipelines</strong> automatically when creating a new project. New microservices can be up and running by using a single command.</li><li>We suggest using <a href="https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html">AWS SAM</a> 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.</li></ul></li></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":4} -->
<a name="chapter-8"/>
<h4>Our most recent cloud computing projects</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Recently, we have been working on some projects that apply Micro-service architecture. We continue the above technology stacks with some changes/improvements:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>We used <a href="https://nx.dev/angular">NX Dev Tool</a> 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 <strong>NX</strong> team for their idea and awesome tool.</li><li><a href="https://aws.amazon.com/step-functions/">Step Functions</a> for our micro-service communication, automated workflow.</li><li><a href="https://nestjs.com/">NestJS</a> for our Restful API that running on AWS Lambda.</li><li>AWS CDK to provision and configure our infrastructure as code (IoC)</li><li><a href="https://jestjs.io/">Jest</a>, <a href="https://www.cypress.io/">Cypress</a> for unit test, integration test, and E2E testing.</li><li>Along with using <a href="https://aws.amazon.com/cognito/">Cognito</a> we also using <a href="https://www.okta.com/">Okta</a>, <a href="https://auth0.com/">AuthO</a> for authentication and authorization.</li><li>CI/CD with <a href="https://aws.amazon.com/products/developer-tools/">AWS Develop Tools,</a> <a href="https://jenkins.io/">Jenkins</a>, <a href="https://azure.microsoft.com/en-us/services/devops/">Azure DevOps</a>.</li><li>Along with using Node.js runtime, we also using <strong>Java/Scala</strong>, <strong>.NET Core</strong> runtime.</li></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":4} -->
<a name="chapter-9"/>
<h4>Other works</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>We focused on <strong>AWS</strong> 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 <a href="https://www.innomizetech.com/#services">Services</a> section on our website for more information.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>We continue working on some other projects such as:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>DevOps using <a href="https://aws.amazon.com/cloudformation/">CloudFormation</a>, <a href="https://docs.aws.amazon.com/cdk/latest/guide/home.html">AWS CDK</a>, <a href="https://www.ansible.com/">Ansible</a></li><li><a href="https://aws-amplify.github.io/">Amplify</a> framework: hosting, authentication, Mobile App with AppSync.</li><li>Ruby on Rails app on AWS ECS.</li><li>Headless upload bills to various sites with AWS ECS and Protractor (<a href="https://www.youtube.com/watch?v=OJ4B81630MI&amp;t=29s">End to end automation test with Protractor</a>).</li><li><a href="https://blog.innomizetech.com/2019/11/01/building-serverless-web-crawler-with-puppeteer-on-aws-fargate/">Serverless web crawler with Puppeteer on AWS Fargate</a> that I recently wrote that post.</li><li>React, Amplify, AppSync.</li><li>Work with other AWS services such as <strong>AWS WAF,</strong> <strong>AWS Shield</strong>, <strong>Glue</strong>, <strong>ElasticSearch</strong>, <strong>Kenesis</strong>, <strong>Athena</strong>.</li><li>We helped some clients design and define <strong>DevOps</strong>, CI/CD pipeline using <strong>AWS Developer Tools</strong>, <strong>Azure DevOps</strong>.</li></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":4} -->
<a name="chapter-10"/>
<h4>My future plan</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>My quote is <strong>"Learn to share and share to learn"</strong>, 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:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Build <a href="https://www.innomizetech.com/">INNOMIZE</a> stronger, work with more clients and collaborate with more people.</li><li>Learn more things such as Machine Learning, Deep Learning, Transfer Learning, Convolution Neural Network, IoT.</li><li>Build my own product.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>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:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li><a href="https://twitter.com/hoangleitvn">Twitter</a></li><li><a href="https://www.linkedin.com/in/hoangleitvn/">LinkedIn</a></li><li><a href="https://dev.to/hoangleitvn">DEV Community</a></li><li><a href="https://github.com/hoang-innomizetech">Github</a></li><li><a href="https://medium.com/@hoangleitvn">Medium</a></li><li><a href="mailto:hoang@innomizetech.com">Email</a></li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>If you are looking for developers, offshore team, or need consulting about the AWS cloud, Serverless architecture, and so on, then&nbsp;<a href="https://innomizetech.com/contact-us/">hire us</a>, we can help you!</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Thank you for reading!</p>
<!-- /wp:paragraph -->