Terraform
VPC, three subnets, route tables, internet gateway, NAT gateway, security groups, EC2 instances, SSH key pair, and encrypted EBS volumes.
I built a disposable AWS environment to practice the full infrastructure lifecycle: provision a segmented network, configure three Linux servers, verify the application and network boundaries, then tear the environment down without leaving running resources.
This is a working project, not a proposed architecture. On September 22, 2026, the lab created 28 Terraform resources, configured three EC2 instances, passed its tests, and destroyed all 28 resources.
Terraform defines the AWS infrastructure. Ansible configures each instance after it boots. The environment is created for testing and then removed.
VPC, three subnets, route tables, internet gateway, NAT gateway, security groups, EC2 instances, SSH key pair, and encrypted EBS volumes.
Installs PostgreSQL on the database host, deploys the Python API on the application host, and configures Nginx on the public web host.
Confirms app-to-database access, web-to-app access, denial of direct web-to-database access, and a database-backed external HTTP health response.
The project deliberately exercises operational behavior rather than stopping after a successful terraform apply.
--run, root-account refusal, operator IP restriction, and isolated run directory.changed=0 on all three hosts.SELECT 1.These are results from the completed run in us-east-1, not simulated console images.
| Check | Observed result |
|---|---|
| Terraform provisioning | 28 resources created |
| Ansible first configuration | Three hosts; zero failures |
| Ansible second configuration | Zero changes on all three hosts |
| Application → PostgreSQL | Passed |
| Web → application | Passed |
| Direct web → PostgreSQL | Blocked as intended |
| External Nginx → application → database | status=ok; db_result=1 |
| Terraform teardown | 28 resources destroyed |
| Independent AWS cleanup checks | No remaining lab instances, NAT gateways, Elastic IPs, or VPCs |
| GitHub Actions | Terraform and Ansible static validation passed |
The console screenshot was captured while the instances existed. The validation logs and CI screenshots were preserved after teardown.
Separate public and private tiers, route tables, NAT, SSH bastion, and security-group-controlled traffic.
Provisioning with Terraform, host configuration with Ansible, versioned dependencies, and zero-change idempotency checks.
Positive and negative smoke tests, retained evidence, explicit destruction, and independent cleanup verification.
GitHub Actions checks Terraform formatting and validation, Ansible playbook syntax, and shell scripts without running billable cloud infrastructure.
Full source repository → Architecture and run documentation → GitHub Actions history →