Build through code
Provision cloud infrastructure through Terraform rather than relying on repeated manual console changes.
Cloud Engineering Case Study
A modular cloud-engineering platform using infrastructure as code, encrypted remote state, state locking and reusable Terraform components.
Executive Summary
The AWS Cloud Platform was created to develop practical experience designing and managing cloud infrastructure through Terraform.
The project avoids treating AWS as a collection of manually created resources. Instead, infrastructure is defined through code, separated into reusable modules and supported by remote state, locking and documentation.
The repository is structured to support multiple environments and future integration with monitoring, configuration management and automated deployment workflows.
The Challenge
Cloud consoles make it easy to create resources quickly, but manual changes can become inconsistent, difficult to audit and hard to reproduce.
The challenge was to create a structured platform where cloud resources, dependencies, environments and architectural decisions could be managed through a professional engineering workflow.
Project Objectives
Provision cloud infrastructure through Terraform rather than relying on repeated manual console changes.
Store state centrally with versioning and locking to support safer infrastructure changes.
Separate networking, compute, IAM, monitoring and security concerns into maintainable components.
Create a structure capable of supporting development, test and production configurations.
Record architectural choices, blockers, progress and implementation guidance alongside the code.
Use a real repository and deployment workflow to build operational cloud capability.
Delivery Approach
Created separate directories for environments, modules, scripts, documentation and supporting automation.
Built a dedicated Terraform configuration responsible for creating the remote-state infrastructure.
Provisioned an S3 bucket with versioning and encryption for central Terraform state storage.
Added DynamoDB locking to reduce the risk of conflicting Terraform operations.
Introduced modular structures for networking, IAM, security groups, EC2 and monitoring.
Created separate development, test and production directories to support controlled expansion.
Platform Components
Infrastructure as Code
Remote State
State Coordination
Identity
Networking
Delivery
Architecture
Architecture Decisions
Keep the state-backend configuration separate from the environments that consume it.
The state bucket and lock table must exist before other Terraform configurations can use them.
Creates a clearer and safer infrastructure bootstrap process.
Maintain development, test and production configurations separately.
Different environments may require different resource sizes, controls and deployment timing.
Supports controlled change while allowing common modules to be reused.
Separate infrastructure capabilities into focused Terraform modules.
Large monolithic configurations become difficult to test, understand and maintain.
Improves consistency, reuse and future expansion.
Store architecture, progress, blockers and decisions in the same repository.
Infrastructure code alone does not explain the context behind important choices.
Improves maintainability and provides clear evidence of engineering reasoning.
Project Delivery
Established the platform boundaries, repository structure and first delivery milestones.
Identified account activation, IAM access and state bootstrap as prerequisites.
Used state locking, encryption, version control and modular design to reduce change risk.
Delivered bootstrap capability before networking and wider cloud resources.
Maintained architecture, progress, blockers and decision records alongside implementation.
Designed the repository to support CI/CD, Ansible, monitoring and additional environments.
Challenges
Infrastructure work could not progress fully until the AWS account and required access were active.
Documented the blocker and continued developing the repository structure and Terraform design.
Work resumed quickly once access became available without losing project direction.
Terraform required secure AWS credentials and clearly scoped permissions.
Created a dedicated Terraform identity and kept credentials outside source control.
Infrastructure provisioning could be performed without embedding secrets in the repository.
Remote state cannot be used until the resources storing that state already exist.
Created a separate bootstrap configuration for S3 and DynamoDB.
The platform has a repeatable initialisation path for future environments.
GitHub SSH configuration initially caused repository access and identity conflicts.
Used an SSH host alias and corrected the repository remote configuration.
The project could be pushed securely and maintained through Git.
Outcomes
Terraform state is stored centrally rather than remaining on one workstation.
DynamoDB locking reduces the risk of conflicting infrastructure updates.
Common infrastructure components can be reused across environments.
Decisions and procedures are maintained with the infrastructure code.
Skills Demonstrated
Lessons Learned
Remote state, locking and identity should be considered before deploying wider infrastructure.
Modular Terraform improves reuse, but module boundaries should be based on clear responsibilities rather than created unnecessarily.
Dependencies and blockers should be documented so progress can continue even when external access or approvals are delayed.
Infrastructure as code provides the greatest value when supported by version control, documentation and a controlled delivery process.
Source and Related Work