With the widespread adoption of the cloud, businesses have become more dynamic than ever before. Today, many companies are moving to the cloud in some capacity. Selecting a cloud provider almost always ensures a long-term vendor lock-in. Whether it is the engineers not making appropriate abstractions and generalizations of application layers, or the size of the application data making it difficult to migrate, moving to cloud-based systems is a very challenging task. The following challenges should be taken into account while migrating from a self-hosted system on a local data center to the cloud.

Improper Abstractions

Failure of abstractions in new environments is one of the biggest challenges faced during the migration to the cloud. Oftentimes an application is architectured in a way that it depends on some localized API underneath. This is particularly common in systems that run at a large scale because specific quirks are only visible at scale. The engineering team often applies hacks and patches to fix the system but the same hacks come back later to bite them during migration. Periodic code audits are very helpful in mitigating these issues to some extent.

Differences in the Deployment Process

All the modern CI/CD platforms support multiple cloud providers, but that is not enough. Applications that have complex setup and initiation processes usually require human intervention in deployment. In recent years, this has been largely automated by using tools like Puppet, Chef and Ansible. But this automation is often tied into the vendor specific APIs required for provisioning, monitoring and tearing down the servers. These APIs are, however, not available for small, local data centers unless the engineering team spends time building it themselves.


Modern applications are spread out across multiple data centers in many different zones. This is one of the major benefits of moving to a cloud-based deployment. Businesses are increasingly moving from a monolithic application base to a microservices based approach. Moving from a local data center in one location to a multi-site deployment requires a suitable re-architecturing of the application. This means that the engineering team must take care of the existing installation in addition to developing a new version alongside it. Migrating critical parts of the system often causes downtime, and the new deployment is still not guaranteed to be successful in the first run. It is advised to have a graceful failover to the older deployment in case something goes wrong. Large migrations can take several months to complete and may warrant additional workforce as well.

Transferring Huge Amounts of Data

Imagine having to migrate Instagram from Amazon Web Services (AWS) to Microsoft Azure. Transferring the insanely large number of images would be a daunting task in itself. It’s not crazy to think that sometimes it is better to physically ship the data instead of uploading it to the cloud provider. Both of these strategies have been analyzed over the years and the industry is still not settled over which is the correct approach. This problem is not dependent on the kind of system that is being migrated, and thus cannot be mitigated by merely making architectural changes. Some businesses choose to use cloud storage right from the start, even when it comes to local data center based deployments. This is particularly prevalent when data is not too hot, or is not required for immediate processing. Amazon S3 storage has been the reliable storage solution for many businesses out there for years, and continues to be the frontrunner in this category.

Many businesses today prefer fast buy and sell marketplace style startup acquisitions. Migrating to the cloud or changing from one provider to another is a very common task on the to-do list of such businesses. Oftentimes, it is required to make the newly acquired application gel with the current set of applications. Sometimes the new product is shifted to a new cloud provider or away from the cloud to a self-hosted setup to take advantage of the already purchased contracts or hardware, like in the case of Instagram migrating to Facebook’s data centers, which essentially form Facebook’s private cloud platform.

Whatever the reason, migrating to cloud-based systems is a necessity for many organizations. It is better to write applications in a way that is vendor-agnostic and have proper abstractions in place wherever possible, so that the potentially months long ordeal can be shortened.

About the Author

Christopher Low is a project manager and lead developer with Sherlock Software. He is also the founder and owner of MyTeamPlan, a desktop-based project management software tool that is targeted at small and medium businesses.