Infrastructure as Code med Terraform är standarden idag. Men det är lätt att göra det osäkert.

Projektstruktur

infra/
├── main.tf
├── variables.tf
├── outputs.tf
├── provider.tf
├── vpc.tf
├── security-groups.tf
└── terraform.tfvars    # ALDRIG i git!

Provider-konfiguration

provider "aws" {
  region = "eu-north-1"  # Stockholm

  default_tags {
    tags = {
      Environment = "production"
      ManagedBy   = "terraform"
      Owner       = "erik"
    }
  }
}

terraform {
  backend "s3" {
    bucket         = "my-terraform-state"
    key            = "prod/terraform.tfstate"
    region         = "eu-north-1"
    encrypt        = true
    dynamodb_table = "terraform-locks"
  }
}

VPC med privata subnät

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.5.0"

  name = "production"
  cidr = "10.0.0.0/16"

  azs             = ["eu-north-1a", "eu-north-1b"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24"]

  enable_nat_gateway = true
  single_nat_gateway = true
}

Security Groups — minsta möjliga åtkomst

resource "aws_security_group" "app" {
  name_prefix = "app-"
  vpc_id      = module.vpc.vpc_id

  ingress {
    from_port       = 443
    to_port         = 443
    protocol        = "tcp"
    security_groups = [aws_security_group.alb.id]  # Bara från ALB
  }

  egress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]  # HTTPS ut
  }
}

Vanliga misstag

  1. State i git — använd alltid remote backend med kryptering
  2. Öppna security groups0.0.0.0/0 på ingress ska vara undantaget
  3. Hårdkodade hemligheter — använd terraform.tfvars + .gitignore
  4. Inga taggar — gör det omöjligt att spåra resurser och kostnader

Säkerhet börjar med infrastrukturen. Om grunden är dålig spelar det ingen roll hur bra applikationen är.