Today's customers demand more than ever when it comes to their application experience. This drives organizations...
to consider modernizing their application stack. The upsides of modernizing legacy applications include faster development of new features, higher release frequency and top availability, all of which translate to a better customer experience. But while the benefits are attractive, the challenges are complex.
Typically, large enterprises have hundreds of legacy systems that were created more than a decade ago and have run in the same fashion since they were created. These applications consist of hundreds of thousands of lines of code but no testing coverage. All of this code is then fused together in a single monolithic architecture. These applications are often written on outdated platforms, such as Java Platform, Enterprise Edition, and are restricted to run on hardware servers in a data center.
Many organizations, thus far, have maintained the status quo and stayed the course with their current systems. Now that containers and cloud computing are mature, organizations have the option of modernizing legacy applications with greater knowledge and confidence.
Additionally, many of the same organizations have developed newer cloud-native applications that need to integrate with the legacy applications and enable both workflows and user experiences seamlessly across applications. This predicament leaves organizations in search of major guidance when it comes to facilitating the integration of legacy and modern applications.
Cloud-native vs. cloud-friendly
When modernizing legacy applications, the most important question to ask is whether you want the legacy application to be a cloud-native app or a cloud-friendly app. A cloud-native app would follow the microservices approach, by which the legacy application would need to be broken into a distributed microservices-based application. This requires developers to rewrite a lot of code, and the changes are drastic. Cloud-friendly applications, on the other hand, are those that use the cloud to drive efficiency and enable better management but aren't completely rebuilt as microservices. They still retain their monolithic architecture and follow the 12-factor application design but are now packaged in containers and use APIs and modern integration patterns wherever possible.
If the application is built on outdated technological practices and the costs to maintain it are skyrocketing, it may be wise to redesign the app to run on AWS using Kubernetes. If it instead uses virtual machines in a data center, it can easily be lifted and shifted to the cloud into a service like Amazon Elastic Compute Cloud. Rather than hold back cloud-native apps to keep in step with legacy apps, it is better to modernize legacy apps to catch up with cloud-native ones.
Factors to consider when modernizing applications
Making extensive changes to applications can cause tension among team members. Culture can play a bigger role in the success of these transitions than technical decisions. Having clearly defined roles and responsibilities, as well as open channels of communication, for team members is crucial to the success of app modernization projects. Keep team members' roles and responsibilities consistent, and forecast how their responsibilities will change with the new application stack.
Security should be the top priority for a CIO when migrating to the cloud. Access control is significantly different in the cloud. In cloud-native systems, applications are more secure than in a legacy environment. The distributed nature of the system, the more robust security tooling and the swiftness at which you can respond to attacks and vulnerabilities all contribute to the enhanced security of cloud-native systems. Tools like Calico, Twistlock and Aqua Security enable new policy-based security controls. These tools are container-aware and can automatically discover and monitor stack changes. This kind of proactive security bridges the gap between legacy and modern tools and enables them to run side by side.
Take a hard look at the existing platform you have, and make note of each aspect. The platform's OSes, tools, libraries, specialized devices, customizations at every point, integrations and access points should all be evaluated. While you want to support as many of them as possible, you will have to make hard decisions if you find that quirks in the legacy system can't be ported over to the modern stack. In this case, you may need to change your expectations for your application.
Whether you containerize your monolith and run it in the cloud or decompose it as microservices for a complete cloud-native experience, you need to use a single control panel to manage your legacy and modern apps. Today, there are many container management services, like Google Kubernetes Engine, Azure Container Service and Amazon Elastic Container Service. There are also other capable options, like Red Hat OpenShift, Docker Enterprise Edition and Rancher. As you look to bridge the gap between legacy and modern apps, it's important to choose a platform that can work with both.
There are many benefits that attract organizations to modern cloud-based architectures. Once they begin the transition process, they realize the many possible pitfalls and complexities that can plague such projects. Cloud-native is the ideal goal, but cloud-friendly may be the more realistic goal for many organizations. There are plenty of factors to consider, like your existing stack, security, management and team culture. By making the right choice of container and cloud tooling, you can ensure that you're modernizing legacy applications to work seamlessly with their up-to-date counterparts.