Files
alva/felsokning/infra/terraform/README.md
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

4.0 KiB

Infrastrukturen

Hela systemet i Terraform. Filerna är numrerade i den ordning de är begripliga att läsa:

Fil Vad
versions.tf Leverantörer och tillståndsbackend
variables.tf Allt som skiljer en installation från en annan
karta.tf Systemet som data — tjänster, portar, routing, hemligheter, dataflöden, gränser
10-namnrymd.tf Namnrymd, tjänstekonto med IRSA, hemligheter ur Secrets Manager
05-aws.tf Kopplingen till AWS-basen — allt den redan bestämt läses här
15-plattformstjanster.tf ALB-kontroller, External Secrets, metrics, CloudWatch
90-gitea.tf Självhostad git med egna byggrunners
30-plattform.tf Backend: auth, händelse-API, delning, integrationer
40-orkester.tf AI-orkestern
50-web.tf Klienten
60-ingress.tf ALB och DNS
70-natverk.tf Nätverkspolicyer — vem får prata med vem
outputs.tf Kartan utskriven

Börja i karta.tf. Den beskriver systemet en gång, som data; resten av filerna läser därifrån i stället för att upprepa portar och namn.

Kom igång

cp terraform.tfvars.exempel terraform.tfvars   # fyll i domän, register, nycklar
terraform init
terraform plan
terraform apply
terraform output karta                         # hela systemet i klartext

terraform output karta svarar på frågorna "vad kör var", "vem ser vilken hemlighet", "vad pratar med vad" och "vad ingår inte" — utan att någon behöver läsa .tf-filerna.

Kontroll utan kluster

terraform fmt -check -diff        # formatering
terraform init -backend=false     # hämtar leverantörer
terraform validate                # typer och referenser

terraform validate kräver att leverantörerna hämtats från registry.terraform.io.

Var saker ligger

Det här lagret bestämmer nästan ingenting själv. AWS-basen (felsokning/infra/aws) äger klustret, databasen, registret, hinken, rollerna, domänen och hemligheterna — och 05-aws.tf läser dess utdata. Ändras något där slår det igenom här utan att en rad ändras.

Vad Var
Händelseloggen Aurora PostgreSQL utanför klustret, med PITR
Bilagor S3, signerat med tjänstekontots roll — inga nycklar finns
Hemligheter Secrets Manager, speglade av External Secrets var timme
Bilder ECR med oföränderliga taggar
Trafik in ALB med ACM-certifikat
Git och bygge Gitea med egna runners i samma kluster

Terraform ser aldrig en hemlighets värde. Det är avsiktligt: en hemlighet som passerar Terraform hamnar i tillståndsfilen.

Driftsättning

Bilderna byggs av publicera.yml vid varje push till main och taggas med git-SHA:t. Driftsättningen är ett eget flöde, driftsatt.yml, som startas för hand med en tagg och kör mot GitHub-miljön produktion — den kan kräva godkännande. Rollback är att köra flödet igen med en tidigare tagg.

Kustomize- och Argo CD-vägen är borttagen. Den beskrev samma system en gång till och kunde inte köras samtidigt som Terraform utan att de motarbetade varandra (selfHeal återställde det Terraform ändrade, prune tog bort det Terraform skapade).

Det som medvetet inte ingår

Står också i terraform output karta under avgränsningar:

  • Objektlagring. Foton och video ligger som data-URL:er i händelseloggen. Det gör loggen till systemets enda sanningskälla, men också stor och tung att säkerhetskopiera.
  • Observability. Ingen metrikexport, ingen tracing.
  • Takt-begränsning på inloggning. Bara den publika beslutsvägen är begränsad, och bara per pod.
  • Återkallelse av JWT. En utfärdad token gäller sina 12 timmar ut även om användaren tagits bort.

Krav på klustret

  • En CNI som tillämpar NetworkPolicy (Cilium, Calico, Antrea). Utan det är 70-natverk.tf dokumentation, inte skydd.
  • ingress-nginx, med kontrollern i namnrymden var.ingress_namnrymd.
  • cert-manager med en ClusterIssuer.
  • En metrics-server för autoskalningen.
  • En StorageClass som klarar ReadWriteOnce.