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
- State i git — använd alltid remote backend med kryptering
- Öppna security groups —
0.0.0.0/0på ingress ska vara undantaget - Hårdkodade hemligheter — använd
terraform.tfvars+.gitignore - 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.