Skip to main content
Verified Production Case Study

Migrating 12,000 Students from Canvas to AWS Moodle with Zero Downtime.

How LMSOps extracted 450+ courses, converted QTI question banks, and engineered an autoscaling AWS architecture to reduce recurring LMS licensing costs by 58%.

aws-architecture-spec ~ verified
# Deployed High-Availability Infrastructure
>Compute: 2x EC2 t4g.xlarge (ARM64 Graviton)
>Database: AWS Aurora MySQL (db.r6g.large Multi-AZ)
>Cache: ElastiCache Redis Cluster (MUC engine)
>Storage: AWS S3 + CloudFront CDN for Moodledata
Concurrency Tested: 2,500 simultaneous quiz submits
Load Time: 240ms (Slashing previous 1.8s)
-58%
Annual Tech Spend Reduction
240ms
Average Response Time (P95)
100%
Preserved Gradebook Data

1. The Challenge

The institution was managing over 12,000 active undergraduate and postgraduate students across 3 regional campuses. As student enrollment grew, annual Canvas SaaS license fees escalated past $160,000 per year. Furthermore, faculty required custom LTI integrations and specialized automated assessment workflows that were prohibited or locked behind closed proprietary APIs in Canvas.

2. The Migration Strategy

LMSOps deployed an automated migration pipeline designed to eliminate manual course rebuilding:

  • Common Cartridge Extraction: Automated export of 450+ courses via Canvas REST API into IMS Common Cartridge (`.imscc`) archives.
  • QTI 2.1 Question Bank Parsing: Conversion of over 3,200 complex quiz items (including formula questions and matching matrices) into native Moodle question categories.
  • Historical Grade & Submission Preservation: Exported student grade histories, letter grade scales, and historical transcripts into a hardened PostgreSQL audit archive and synchronized current semester rosters.

3. High-Availability AWS Architecture

To guarantee zero slowdowns during peak term-time exam windows, LMSOps architected a resilient cloud cluster in the AWS London region:

moodle-cluster-config.php
// Moodle Universal Cache (MUC) with Redis Cluster
$CFG->session_handler_class = '\core\session\redis';
$CFG->session_redis_host = 'redis-cluster.internal.lmsops.aws';
$CFG->session_redis_port = 6379;
$CFG->session_redis_database = 0;

// Aurora MySQL Reader/Writer Endpoint Splitting
$CFG->dbhost = 'aurora-cluster.internal.lmsops.aws';
$CFG->dboptions['readonly']['instance'] = ['aurora-ro-replica.internal.lmsops.aws'];

4. The Results

The production cutover was executed over a single weekend with zero unscheduled downtime. In the following academic semester:

  • Cost Efficiency: The university saved over $100,000 in Year 1 alone, eliminating per-student recurring license fees.
  • Performance: Average page load time dropped from 1.8s to 240ms across all campuses.
  • Zero Exam Outages: Handled 2,500 simultaneous quiz takers during finals week with CPU utilization peaking at only 34%.

Planning an Institutional LMS Migration?

Talk with the engineers who designed and delivered this migration. We will evaluate your current course catalog and deliver a fixed-price scope within 24 hours.

Request Migration Assessment View Migration Feature List