Skip to content

πŸ“Š Terraform Architecture Diagrams

Terraform Core Workflow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    TERRAFORM WORKFLOW                           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

    Developer                Terraform Core           Cloud Provider
        β”‚                          β”‚                         β”‚
        β”‚  1. Write .tf files      β”‚                         β”‚
        │─────────────────────────>β”‚                         β”‚
        β”‚                          β”‚                         β”‚
        β”‚  2. terraform init       β”‚                         β”‚
        │─────────────────────────>β”‚                         β”‚
        β”‚                          β”‚  Download Providers     β”‚
        β”‚                          β”‚<────────────────────────│
        β”‚                          β”‚                         β”‚
        β”‚  3. terraform plan       β”‚                         β”‚
        │─────────────────────────>β”‚                         β”‚
        β”‚                          β”‚  Read Current State     β”‚
        β”‚                          β”‚<───────────────────────>β”‚
        β”‚  <── Show Changes        β”‚                         β”‚
        β”‚<─────────────────────────│                         β”‚
        β”‚                          β”‚                         β”‚
        β”‚  4. terraform apply      β”‚                         β”‚
        │─────────────────────────>β”‚                         β”‚
        β”‚                          β”‚  Create/Update Resourcesβ”‚
        β”‚                          │────────────────────────>β”‚
        β”‚                          β”‚  <── Resource Created   β”‚
        β”‚                          β”‚<────────────────────────│
        β”‚                          β”‚  Update State File      β”‚
        β”‚  <── Apply Complete      β”‚                         β”‚
        β”‚<─────────────────────────│                         β”‚

Terraform State Management

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    STATE MANAGEMENT                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

    Configuration Files          State File           Real Resources
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚   main.tf    β”‚          β”‚ terraform.   β”‚      β”‚   AWS EC2    β”‚
    β”‚              β”‚          β”‚   tfstate    β”‚      β”‚   Instance   β”‚
    β”‚ resource     β”‚   β”Œβ”€β”€β”€β”€β”€>β”‚              β”‚<────>β”‚              β”‚
    β”‚ "aws_        β”‚   β”‚      β”‚ {            β”‚      β”‚  Running     β”‚
    β”‚ instance"    β”‚   β”‚      β”‚   "id":      β”‚      β”‚              β”‚
    β”‚ "web" {      β”‚   β”‚      β”‚   "i-123"    β”‚      β”‚  ID: i-123   β”‚
    β”‚   ami = ...  β”‚   β”‚      β”‚   ...        β”‚      β”‚              β”‚
    β”‚ }            β”‚   β”‚      β”‚ }            β”‚      β”‚              β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                       β”‚
                       β”‚      Terraform reconciles:
                       β”‚      1. What you want (config)
                       β”‚      2. What Terraform knows (state)
                       └─────>3. What actually exists (cloud)

Remote State with Locking

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              REMOTE STATE WITH LOCKING                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

    Developer A          S3 Bucket           DynamoDB Table
        β”‚                    β”‚                      β”‚
        β”‚  terraform apply   β”‚                      β”‚
        │───────────────────>β”‚                      β”‚
        β”‚                    β”‚  Acquire Lock        β”‚
        β”‚                    │─────────────────────>β”‚
        β”‚                    β”‚  <── Lock Granted    β”‚
        β”‚                    β”‚<─────────────────────│
        β”‚                    β”‚                      β”‚
        β”‚  Read State        β”‚                      β”‚
        β”‚<───────────────────│                      β”‚
        β”‚                    β”‚                      β”‚
        β”‚  Update State      β”‚                      β”‚
        │───────────────────>β”‚                      β”‚
        β”‚                    β”‚  Release Lock        β”‚
        β”‚                    │─────────────────────>β”‚
        β”‚                    β”‚                      β”‚
    Developer B              β”‚                      β”‚
        β”‚                    β”‚                      β”‚
        β”‚  terraform apply   β”‚                      β”‚
        │───────────────────>β”‚                      β”‚
        β”‚                    β”‚  Try Acquire Lock    β”‚
        β”‚                    │─────────────────────>β”‚
        β”‚                    β”‚  <── Lock Denied     β”‚
        β”‚  <── Error: Locked β”‚<─────────────────────│
        β”‚<───────────────────│                      β”‚
        β”‚  (waits...)        β”‚                      β”‚

Module Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    MODULE ARCHITECTURE                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

    Root Module
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  main.tf                                                    β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ module "vpc" {                                         β”‚ β”‚
    β”‚  β”‚   source = "./modules/vpc"                             β”‚ β”‚
    β”‚  β”‚   cidr   = "10.0.0.0/16"  ──┐                         β”‚ β”‚
    β”‚  β”‚ }                            β”‚                         β”‚ β”‚
    β”‚  β”‚                              β”‚  Input Variables        β”‚ β”‚
    β”‚  β”‚ module "ec2" {               β”‚                         β”‚ β”‚
    β”‚  β”‚   source    = "./modules/ec2"β”‚                         β”‚ β”‚
    β”‚  β”‚   vpc_id    = module.vpc.id ─┼─┐                      β”‚ β”‚
    β”‚  β”‚   subnet_id = module.vpc... ─┼─┼─┐                    β”‚ β”‚
    β”‚  β”‚ }                            β”‚ β”‚ β”‚  Module Outputs    β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚                β”‚ β”‚
                    β–Ό                β–Ό β–Ό
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  modules/vpc/        β”‚  β”‚  modules/ec2/        β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
    β”‚  β”‚ variables.tf   β”‚  β”‚  β”‚  β”‚ variables.tf   β”‚  β”‚
    β”‚  β”‚ main.tf        β”‚  β”‚  β”‚  β”‚ main.tf        β”‚  β”‚
    β”‚  β”‚ outputs.tf     β”‚  β”‚  β”‚  β”‚ outputs.tf     β”‚  β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Provider Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  PROVIDER ARCHITECTURE                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

    Terraform Configuration
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  terraform {                                                β”‚
    β”‚    required_providers {                                     β”‚
    β”‚      aws = { source = "hashicorp/aws", version = "~> 5.0" } β”‚
    β”‚    }                                                        β”‚
    β”‚  }                                                          β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
                              β–Ό
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚                    Terraform Core                           β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
    β”‚  β”‚  β€’ Parse Configuration                                β”‚  β”‚
    β”‚  β”‚  β€’ Build Dependency Graph                             β”‚  β”‚
    β”‚  β”‚  β€’ Plan Execution                                     β”‚  β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
                              β–Ό
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚                    Provider Plugins                         β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
    β”‚  β”‚   AWS    β”‚  β”‚  Azure   β”‚  β”‚   GCP    β”‚  β”‚  Other   β”‚  β”‚
    β”‚  β”‚ Provider β”‚  β”‚ Provider β”‚  β”‚ Provider β”‚  β”‚ Providersβ”‚  β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚               β”‚              β”‚              β”‚
           β–Ό               β–Ό              β–Ό              β–Ό
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚   AWS    β”‚  β”‚  Azure   β”‚  β”‚   GCP    β”‚  β”‚  Other   β”‚
    β”‚   API    β”‚  β”‚   API    β”‚  β”‚   API    β”‚  β”‚   APIs   β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜