← All projects

Project 04

AWS Cloud Labs

Nine hands-on AWS labs automated with Python (boto3), Fabric and Bash, from CLI setup to load-balanced EC2, KMS encryption and containers on ECS, with the faults I diagnosed along the way.

  • Complete
  • Jul – Sep 2026

Overview

Scripts from nine hands-on AWS labs for UWA's Cloud Computing unit (CITS5503), run on Windows 11 with WSL2 in ap-southeast-2. They go from CLI setup to S3 and DynamoDB, KMS encryption, EC2 behind a load balancer, a Django deployment automated with Fabric, containers on ECS Fargate, SageMaker tuning, and Comprehend and Rekognition.

My role

Individual coursework. I wrote and ran every script.

What I did

  • Automated AWS builds (EC2, S3, IAM, KMS, load balancers, ECS) with Python, boto3 and Fabric across nine labs.
  • Made every script idempotent, so a re-run reuses what already exists instead of creating duplicates.
  • Kept names, region and AMI in one config file, with nothing account-specific hard-coded and credentials outside the repository.
  • Gave each lab a read-only verify script and documented the cleanup for every billable resource.

Problems solved

  • After Windows slept, every AWS call failed with signature errors that looked like a credentials problem. WSL2's clock had drifted behind, so AWS rejected the request timestamps. I resynced it with hwclock, and the setup scripts now measure the drift against S3's Date header and warn before anything runs.
  • SSH refused my key as too open, even though chmod reported success. The key sat on the Windows-mounted filesystem, which doesn't store Linux permission bits. I moved keys and ~/.aws onto the Linux filesystem, and the scripts now warn if a key path is under /mnt/.
  • SSH and HTTP to new instances timed out on the campus network, which blocks outbound ports 22 and 80. I used another network for those steps, and the deploy scripts test port 22 up front and smoke-test on the instance, so a network block can't be mistaken for a broken deployment.
  • Launches failed with gp3 volumes unsupported, because the subnet auto-pick had chosen the Auckland Local Zone. I filtered availability zones by type before choosing subnets.