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.
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.