We research and develop sophisticated motion analysis solutions in the fields of healthcare, sports, ergonomics and more. To develop, test, and run those solutions, we employ DevOps principles and rely on a sophisticated, always evolving, cloud infrastructure, using a wide variety of technologies. These principles allow us to move fast by continuously testing and deploying changes to our code, and the speed at which we can change our code is the speed at which our company can innovate.
Building the Systems
One of the functions performed by this cloud infrastructure is running our Continuous Integration/Continuous Delivery (CI/CD) pipelines. What began as a single CI/CD Jenkins server, grew to multiple instances and more recently has evolved to a series of pipelines running in AWS Codepipeline. This infrastructure kicks in once a developer pushes a code update to one of our repositories in github. A webhook notification is automatically sent from github to AWS, starting a pipeline consisting of a series of AWS Codebuild tasks that use automation to pull the source code, run several tests (including unit, integration and functional tests), and, depending on the configuration, deploy it to the production systems. In most cases those tasks automatically build docker images for various architectures, and then pushes them to IoT devices in the Balena Cloud, or to container clusters running in the AWS Elastic Container Service (ECS). In some cases we also add a manual approval step, giving an engineer the choice to decide if and when the pipeline proceeds to the next step. Throughout this process, the pipeline tasks send automatic notifications to the development teams via Slack messages, which enables the teams to monitor the progress of the pipeline and react quickly in case of problems.
IoT
Several of our solutions are deployed as IoT devices that are distributed across the globe. We use several technologies to manage these devices: Balena Cloud, for device management, Splunk, for monitoring dashboards, and AWS S3 and IBM Cloudant, for data synchronization and backups.
AutoScaling Services
Some other solutions are deployed in centralized, autoscaling container clusters, using AWS Elastic Container Service (ECS). This service constantly adjusts the number of running instances depending on the number of requests from customers. It’s deployed securely, in a private VPC, using the API Gateway, internal elastic load balancers, and AWS Cognito for authentication.
Repeatability and Consistency
All of our cloud infrastructure resources are defined as Infrastructure-as-Code AWS Cloudformation templates. These templates are kept in version control just like regular code, and by using them we avoid creating any resources manually. This ensures consistency, repeatability and minimizes errors.
Conclusion
The cloud infrastructure services described here are the platform on which Motesque builds, tests, deploys and runs excellent solutions for our customers. Like our company, it’s always evolving. By using solid DevOps principles, such as automation, it also allows us to focus on our biomechanics expertise and reach our goals.
Take-aways
1. Use infrastructure-as-code: automating environments, build processes and tests ensure agility, consistency, and repeatability.
2. Think about single points of failure. Use auto-scaling to keep up with varying loads.
3. Select your cloud services carefully: AWS alone offers >100 services. There are often multiple ways to solve the same problem. Take time to research and evaluate the available options.
4. Monitor your services. Employ monitoring tools such as Zabbix or Nagios, and centralize your logs with Splunk or ELK. Send event notifications via Slack or other messaging.
Author
Daniel Galvao
DevOps Engineer at Motesque