Sovra Sovra

AWS Deployment Guide

Overview

Deploy Sovra on AWS using EKS (Elastic Kubernetes Service).

Architecture

AWS Region (eu-central-1)
├── VPC
│   ├── Public Subnets (NAT, Load Balancer)
│   └── Private Subnets (EKS, RDS)
├── EKS Cluster (3 nodes)
├── RDS PostgreSQL (Multi-AZ)
├── ALB (Application Load Balancer)
└── Route53 (DNS)

Prerequisites

Quick Deploy

cd infrastructure/terraform/aws

# Configure
cp terraform.tfvars.example terraform.tfvars
nano terraform.tfvars

# Deploy
terraform init
terraform apply

Detailed Steps

1. Configure Variables

# terraform.tfvars
region           = "eu-central-1"
cluster_name     = "sovra-production"
node_count       = 3
node_type        = "t3.large"

# RDS
db_instance_class = "db.t3.large"
db_storage_gb     = 100
db_multi_az       = true

# Networking
vpc_cidr         = "10.0.0.0/16"
availability_zones = ["eu-central-1a", "eu-central-1b", "eu-central-1c"]

2. Provision Infrastructure

terraform init
terraform plan
terraform apply

# Get kubeconfig
aws eks update-kubeconfig --name sovra-production --region eu-central-1

3. Deploy Control Plane

# Deploy Sovra
kubectl apply -k ../../kubernetes/overlays/aws

# Initialize
./scripts/init-control-plane.sh

4. Configure DNS

# Get load balancer DNS
kubectl get svc api-gateway -n sovra

# Create Route53 record
aws route53 change-resource-record-sets \
  --hosted-zone-id Z1234567890ABC \
  --change-batch file://dns-record.json

Terraform Resources

Complete configuration:

# main.tf
module "vpc" {
  source = "terraform-aws-modules/vpc/aws"
  name   = "sovra-vpc"
  cidr   = var.vpc_cidr
  
  azs             = var.availability_zones
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
  
  enable_nat_gateway = true
  single_nat_gateway = false
  
  tags = {
    Project = "Sovra"
  }
}

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  
  cluster_name    = var.cluster_name
  cluster_version = "1.29"
  
  vpc_id     = module.vpc.vpc_id
  subnet_ids = module.vpc.private_subnets
  
  eks_managed_node_groups = {
    sovra = {
      desired_size = 3
      min_size     = 3
      max_size     = 10
      
      instance_types = [var.node_type]
    }
  }
}

module "rds" {
  source = "terraform-aws-modules/rds/aws"
  
  identifier = "sovra-postgres"
  
  engine         = "postgres"
  engine_version = "15.4"
  instance_class = var.db_instance_class
  
  allocated_storage     = var.db_storage_gb
  max_allocated_storage = var.db_storage_gb * 2
  
  db_name  = "sovra"
  username = "sovra"
  port     = "5432"
  
  multi_az               = var.db_multi_az
  db_subnet_group_name   = module.vpc.database_subnet_group_name
  vpc_security_group_ids = [aws_security_group.rds.id]
  
  backup_retention_period = 7
  backup_window          = "03:00-04:00"
  maintenance_window     = "Mon:04:00-Mon:05:00"
  
  encryption_enabled = true
}

Monitoring

# Enable CloudWatch Container Insights
aws eks update-cluster-config \
  --name sovra-production \
  --logging '{"clusterLogging":[{"types":["api","audit","authenticator"],"enabled":true}]}'