Files
alva/felsokning/infra/terraform/versions.tf
T
Claude a5e276534c Arbetslasten kopplad till AWS — kedjan är helt egen
Andra lagret läser nu basens utdata i stället för att upprepa någonting.
05-aws.tf hämtar klustret, domänen, certifikatet, registret, rollerna,
hinken och hemligheternas namn — ändras något i basen slår det igenom
här utan att en rad ändras. Autentiseringen mot klustret sker med en
färsk EKS-token i stället för en kubeconfig på disk: inget att
distribuera, inget som går ut.

Hemligheterna bor i Secrets Manager och speglas in av External Secrets
var timme. Terraform ser aldrig värdena, och det är själva poängen — en
hemlighet som passerar Terraform hamnar i tillståndsfilen. Roteras en
hemlighet följer klustret efter av sig självt.

Plattformstjänsten kör som ett tjänstekonto med IRSA. Rollen är bunden
till exakt det kontot i den namnrymden, så grannpodden på samma nod får
ingenting på köpet. Bilagorna signeras mot S3 med samma roll — inga
nycklar existerar att läcka.

Postgres-podden är borta. Händelseloggen ligger i Aurora utanför
klustret, i ett subnätlager utan routing ut, med automatisk
säkerhetskopiering och PITR. Ingressen är en ALB med ACM-certifikat i
stället för nginx, och alla tre tjänsterna delar den genom samma
gruppnamn.

Gitea med egna Actions-runners kör i samma kluster. Därmed finns inget
externt beroende kvar: källkod, bygge, register och driftsättning ligger
allt i vår AWS-miljö. Runnern och driftsättningen har varsitt
tjänstekonto med skilda roller — bygget får publicera till ECR men inte
röra klustret, driften tvärtom. Ett komprometterat bygge kan inte
driftsätta.

Gitea kör SQLite på en EBS-volym i stället för en egen Aurora-databas.
En verkstadsinstallation har en handfull utvecklare, och ytterligare en
databas att säkerhetskopiera och övervaka är kostnad utan motsvarande
nytta.

Verifierat: 96 vitest-tester, rotens lint och format:check, terraform fmt
på båda lagren och statisk referenskontroll av vardera (88 respektive 35
resurser, inga dinglande referenser, alla count-resurser indexerade).
terraform validate kunde inte köras här — registry.terraform.io är
blockerad av sessionens egress-policy — så CI-jobbet kör den.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
2026-08-04 12:53:08 +00:00

84 lines
2.5 KiB
Terraform

# Guidad Felsökning — arbetslasten i klustret.
#
# Lager två av två. Basen (felsokning/infra/aws) måste vara applicerad
# först; det här lagret läser dess utdata och behöver därför inte känna
# till en enda AWS-resurs vid namn.
#
# Läsordning:
# versions.tf det här — leverantörer, kopplade till EKS
# 05-aws.tf basens utdata och vad de betyder här
# variables.tf det lilla som inte kommer från basen
# karta.tf systemet som data — kartans källa
# 10-namnrymd.tf namnrymd + hemligheter ur Secrets Manager
# 15-plattformstjanster.tf ALB-kontroller, External Secrets, metrics
# 30-plattform.tf backend
# 40-orkester.tf AI-orkestern
# 50-web.tf klienten
# 60-ingress.tf ALB
# 70-natverk.tf nätverkspolicyer
# 90-gitea.tf självhostad git + byggrunners
# outputs.tf kartan utskriven — kör `terraform output karta`
terraform {
required_version = ">= 1.6"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.80"
}
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.35"
}
helm = {
source = "hashicorp/helm"
version = "~> 2.16"
}
random = {
source = "hashicorp/random"
version = "~> 3.6"
}
}
# Samma hink som basen, annan nyckel.
#
# backend "s3" {
# bucket = "felsokning-produktion-tfstate-<konto>"
# key = "arbetslast/terraform.tfstate"
# region = "eu-north-1"
# encrypt = true
# use_lockfile = true
# }
}
provider "aws" {
region = local.aws.region
}
# Autentisering mot klustret sker med en färsk token från EKS i stället
# för en kubeconfig på disk — inget att distribuera, inget som går ut.
provider "kubernetes" {
host = local.aws.kluster_slutpunkt
cluster_ca_certificate = base64decode(local.aws.kluster_ca)
exec {
api_version = "client.authentication.k8s.io/v1beta1"
command = "aws"
args = ["eks", "get-token", "--cluster-name", local.aws.kluster, "--region", local.aws.region]
}
}
provider "helm" {
kubernetes {
host = local.aws.kluster_slutpunkt
cluster_ca_certificate = base64decode(local.aws.kluster_ca)
exec {
api_version = "client.authentication.k8s.io/v1beta1"
command = "aws"
args = ["eks", "get-token", "--cluster-name", local.aws.kluster, "--region", local.aws.region]
}
}
}