I will talk about how we tried to move our products from Rackspace Cloud to AWS in the least disruptive way and about the hindrances and disillusionment we experienced trying the lift-and-shift strategy.
over again without hesitation Even if it’s Lift & Shift, it’s usually a very challenging task and will require a lot of creativity and effort. Just make sure you get the support of the management and the rest of the teams. 4
• No Configuration Management(Chef); • Get rid of nginx on servers with monolith apps; • Some components will need to stay in the old cloud until fully substituted. 14
not any less important than migration itself because it’s quite likely that you won’t have time/budget for re-architecture right after the initial Lift&Shift. Make sure you are comfortable with all the tradeoffs and carefully weigh in all pros and cons comparing to the existing infra. 18
into AWS should not require substantial non-functional changes/refactoring in AWS unless dictated by new business requirements; • We don’t use AWS-native technologies we are not comfortable with even if it provides a temporary benefit(no snake oil principle). 19
after 9m4s (ID: ow-dev-int-rds) Your Devs might already have accommodated themselves to microservice architecture where builds are in a 30-60 seconds range. 28
For all our systems in old infra, we used file-based configs. They were either passed to the service as-is, or converted to env. Vars by Chef automatically. It allowed us to not bother too much about the amount of such vars since they were all in one file. With Parameter store the situation was very different since we provisioned every parameter one by one. 44
Nodejs Used a lot of params with dashes. Example: remote.service.web-api.timeout=<value-fro m-chef> It’s Ok for file-based configs, but not for env vars, so we switched to purely env.vars-based config: remote.service.web-api.timeout=${REMOTE _SERVICE_WEBAPI_TIMEOUT} There was no unified approach. Started using a lib for all projects.
them(in the same repo) and the final artifact included a lot of libs(nodejs+angular) that were unnecessary in runtime. It was not so obvious and critical without Docker. With docker we started to pay attention to it and cleaned up the dependencies. 48
current approach, we are mounting host ~/.m2 and ~/.npm folders into a container. With multi-stage Dockerfile we are not able to mount, because docker doesn't support mounts for docker build command. Maven/Npm repositories credentials: Folders ~/.m2 and ~/.npm contain credentials to Nexus/Sinopia. 49
have before. As a result we initially missed a couple of things: • .npmrc with registry location was not present in many repos • .dockerignore was also missed - as a result local node_modules were copied into the image(but shrinkwrap wasn't) 50
• No support for CPU sets https://developers.redhat.com/blog/2017/03/14/java-inside-docker/ https://jaxenter.com/nobody-puts-java-container-139373.html 51
Gateway was substantially improved over 2017 and it can now forward external traffic to internal services, it can only do so via NLB(TCP level) because it depends on VPC Link endpoints, which in turn depend on NLB. And our services are resolved via ALB and Route 53(HTTP/level 7). 53
supports replication-aware connections. It can automatically send queries to a read/write master, or a failover or round-robin loadbalanced set of slaves based on the state of Connection.getReadOnly(). 58