Skip to main content

Module 4 – Infrastructure as Code (Terraform)

If You Cannot Recreate It, You Do Not Control It

Cloud consoles are convenient.

They are also dangerous.

Manual configuration leads to:

  • Drift
  • Inconsistent environments
  • Hidden changes
  • Audit difficulty
  • Recovery delays

Infrastructure as Code (IaC) converts infrastructure into:

  • Declarative configuration
  • Version-controlled artifacts
  • Reproducible environments

Terraform is the tool used in this module to enforce that discipline.


1. Declarative Infrastructure

Desired State Engineering

Terraform works on a simple principle:

You define desired state. Terraform ensures reality matches it.

Example conceptual resource:

resource "aws_instance" "app" {
instance_type = "t3.micro"
subnet_id = var.private_subnet_id
}

This is not a script. It is a declaration.

Terraform compares:

  • Desired state — what the code describes
  • Current state — what exists in the cloud environment

And reconciles any differences.


2. Providers and State Management

Understanding Terraform's Brain

Provider

The provider connects Terraform to the cloud platform.

Examples:

  • AWS provider
  • Azure provider
  • Google Cloud provider

The provider translates your code into API calls against the target platform.

State File

Terraform maintains a state file that tracks:

  • Created resources
  • Resource IDs
  • Dependency relationships

Without state, Terraform does not know what exists.

State discipline is critical.

In production:

  • State should be stored remotely (e.g., S3 + DynamoDB for AWS)
  • State should be locked to prevent concurrent modifications
  • State should never be manually edited

State corruption causes infrastructure instability.


3. Variable-Driven Architecture

Designing for Reuse

Avoid hardcoding values.

Instead of:

instance_type = "t3.micro"

Use:

instance_type = var.instance_type

Variables allow:

  • Environment separation (dev, staging, prod)
  • Region flexibility
  • Instance sizing adjustments
  • CIDR block reusability

Parameterisation increases scalability and reduces duplication.


4. Modular Infrastructure Design

Encapsulation for Maintainability

Large Terraform files become unmanageable quickly.

Use modules to isolate and encapsulate components.

Example module structure:

modules/
vpc/
security/
compute/
database/

Each module:

  • Accepts defined inputs
  • Produces defined outputs
  • Is independently reusable

Modular design reduces:

  • Code duplication
  • Human error
  • Long-term maintenance cost

5. Idempotency

Safe Repeated Execution

Terraform is idempotent.

Running:

terraform apply

multiple times should always produce the same result — no duplicate resources, no unpredictable side effects.

Idempotency ensures infrastructure remains stable under repeated execution, which is essential in automated pipelines.


6. Drift Detection

Detecting Manual Changes

Drift occurs when someone modifies infrastructure outside of Terraform — directly through the console or CLI.

Terraform detects drift via:

terraform plan

If the plan shows unexpected changes, a manual modification occurred outside of code.

Drift breaks consistency.

Infrastructure must be controlled through code — not consoles. A console change today is a mystery incident tomorrow.


7. End-to-End Architecture in Code

By this stage, your Terraform project should define the complete stack:

  • VPC
  • Public and private subnets
  • Internet Gateway
  • NAT Gateway
  • Security groups
  • Load balancer
  • Auto Scaling group

All defined in code. This converts architecture into a versioned, auditable artifact.


8. Dependency Management

Terraform builds resources based on an automatically calculated dependency graph.

Example ordering:

  • VPC must exist before subnets
  • Subnets must exist before instances
  • Instances must exist before Auto Scaling group attachments

Terraform resolves this order automatically. However, poor dependency modelling leads to:

  • Race conditions
  • Partial failures
  • Inconsistent deployments

Be explicit when implicit ordering is ambiguous.


9. Safe Deployment Workflow

The recommended Terraform workflow:

terraform init
terraform plan
terraform apply

Never apply without reviewing the plan.

The plan stage reveals:

  • What will be created
  • What will be modified
  • What will be destroyed

Blind apply is operational negligence.


10. Destroy Discipline

When testing environments:

terraform destroy

This destroys the entire environment cleanly.

Advantages:

  • Cost control — no idle resources running overnight
  • Clean test isolation
  • No orphaned resources accumulating in the account

Destruction capability is part of engineering control.

If you cannot destroy and recreate your infrastructure confidently, it is fragile.


11. Version Control Integration

Terraform code must live in Git.

Benefits:

  • Full change history
  • Code review before apply
  • Rollback capability
  • Audit trail for compliance

Infrastructure without version control is undocumented risk.


12. Lab Assignment

  1. Create a Terraform project structure.
  2. Define the following resources:
    • VPC
    • Public subnets
    • Private subnets
    • Security groups
    • Load balancer
  3. Use variables for:
    • CIDR blocks
    • Instance types
    • Region
  4. Run the full deployment workflow:
    terraform init
    terraform plan
    terraform apply
  5. Destroy the environment after validation.
  6. Recreate from scratch without referencing the console.

Deliverable

Be able to explain:

  • Why state matters and what happens when it is lost
  • How drift is detected and why it is dangerous
  • Why modular design improves reliability
  • Why console changes undermine infrastructure integrity

If you cannot destroy and recreate your architecture in under 15 minutes, it is not production-ready.


13. Production Reflection

Consider the following before moving on:

  • How do you secure state files from unauthorised access?
  • What is your recovery plan if state is lost or corrupted?
  • How do you handle secrets — are credentials hardcoded anywhere?
  • How do you manage multiple environments (dev, staging, prod) cleanly?
  • How do you prevent accidental deletion in production?

Infrastructure as Code increases control — but only if managed with discipline.


Module Completion Criteria

You are ready for Module 5 when:

  • ✅ Infrastructure is fully code-defined
  • ✅ No manual changes exist in the environment
  • ✅ State is managed properly (remote and locked)
  • ✅ Modules are reusable and clearly scoped
  • ✅ Environments are reproducible from a clean state

Next: Module 5 – Failure Simulation