We developed an AI-powered platform that utilizes photometry, radiometry, and computer vision to efficiently classify seeds and analyze seed quality. To enhance the user experience, we revamped the frontend and hosted it on S3, utilizing Cloudfront as a global CDN to improve website performance. Our codebase was managed using Gitlab and Gitlab CI, but we later transitioned to Github for source versioning and used CodeBuild for CI/CD. To resize user-uploaded images, we used Imaginary, an open-source API, and implemented Keycloak for user authentication. For sending emails, we relied on Amazon SES.
Our backend endpoints were created with Amazon ECS with Fargate, which scales up on memory metrics and down during low traffic periods. We used AWS Cloudwatch to store the logs of these services, allowing us to query based on various criteria. To monitor usage, we implemented NATS Exporter, Redis Exporters, and Prometheus as a data source for Grafana, which we used to create a dashboard for visualizing load and flow. To receive alerts for service outages, we utilized a self-hosted Nagios server, which notified us via email and phone calls.
For monitoring and troubleshooting our microservices-based distributed services, we used Jaeger. By utilizing these various services and tools, we were able to create an efficient and reliable platform while also reducing costs.
The codebase was tested for quality using SonarQube, which was configured on a remote machine. Additionally, Jenkins CI was set up to test builds.
We utilized Amazon Lightsail to host our WordPress sites that featured blog content. Mantis ticketing system was used to manage issues and assign tasks among team members.
AWS Elastic Cache was implemented for Redis, where a two-node cluster was deployed in the production environment, and a single node was deployed in other environments. For cloud-native messaging, we utilized Bitnami NATS, a lightweight messaging server that was written in Go.We integrated GitLab builds for Android applications and TestFairy for mobile application testing. To create an offline environment, we installed Jenkins on an ARM machine to generate Docker .tar files and upload them to an S3 bucket. For error tracking and bug fixing, Sentry was utilized. Ansible was used in conjunction with GitLab CI to launch a spot instance GPU. Pritunl VPN was configured to allow client-side developers to access our private resources.
Challenges.
- Due to connectivity issues at most of our client locations, we required the application to be functional in offline conditions.
Solution:
We utilized our dockerized services to generate a .tar file and a script for launching GPU machines.
- We require a GPU for one of our AI training services, but running a GPU continuously would result in higher EC2 cost.
Solution:
We incorporated Ansible into GitLab CI to launch a spot instance GPU and install all Python requirements. We also ensured that the Python application ran on the spot instance and terminated the instance once execution was complete. Additionally, we developed a Lambda function to terminate the instance in case the GitLab pipeline failed to do so.
Tools/Technologies
- Cloud Platform
- AWS
- Source Code Management
- Gitlab
- Github
- Continuous Integration Tools
- CodeBuild
- Jenkins
- Databases
- Redis
- PSQL
- Infra Provisioning Tools & Configuration Management
- Terraform
- Aws-Cli
- Ansible
-
- Containerization & Deployment
- Docker
- ECS – Fargate
- Message Queuing
- NATS
- Authentication
- Keycloak
- AppQuality Testing
- Testfairy
- Web Hosting
- AWS S3
- AWS Lightsail
- Logging, Monitoring & Alerting
- Grafana
- Prometheus
- Nagios
- Cloudwatch
- Jaeger
- Load Balancing
- AWS ALB
- Content Delivery Network
- AWS Cloudfront
- Storage
- S3
- EBS
- Collaboration and Ticketing
- Mantis