a5e276534c
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
81 lines
2.2 KiB
Terraform
81 lines
2.2 KiB
Terraform
# Det klustret behöver innan vår egen arbetslast är meningsfull.
|
|
#
|
|
# Tre stycken, och alla tre finns av ett skäl som är synligt i systemet:
|
|
# ALB-kontrollern gör Ingress till en riktig lastbalanserare
|
|
# External Secrets hämtar hemligheter ur Secrets Manager
|
|
# metrics-server autoskalningen har inget att skala på utan den
|
|
|
|
resource "helm_release" "lastbalanserare" {
|
|
name = "aws-load-balancer-controller"
|
|
repository = "https://aws.github.io/eks-charts"
|
|
chart = "aws-load-balancer-controller"
|
|
version = "1.10.1"
|
|
namespace = "kube-system"
|
|
|
|
set {
|
|
name = "clusterName"
|
|
value = local.aws.kluster
|
|
}
|
|
|
|
set {
|
|
name = "serviceAccount.create"
|
|
value = "true"
|
|
}
|
|
|
|
set {
|
|
name = "serviceAccount.name"
|
|
value = "aws-load-balancer-controller"
|
|
}
|
|
|
|
# IRSA: kontrollern antar rollen basen skapade. Rollen är bunden till
|
|
# exakt det här tjänstekontot i den här namnrymden.
|
|
set {
|
|
name = "serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn"
|
|
value = local.aws.lastbalanserar_roll
|
|
}
|
|
|
|
set {
|
|
name = "region"
|
|
value = local.aws.region
|
|
}
|
|
}
|
|
|
|
resource "helm_release" "external_secrets" {
|
|
name = "external-secrets"
|
|
repository = "https://charts.external-secrets.io"
|
|
chart = "external-secrets"
|
|
version = "0.10.7"
|
|
namespace = "external-secrets"
|
|
create_namespace = true
|
|
|
|
set {
|
|
name = "installCRDs"
|
|
value = "true"
|
|
}
|
|
}
|
|
|
|
resource "helm_release" "metrics" {
|
|
name = "metrics-server"
|
|
repository = "https://kubernetes-sigs.github.io/metrics-server/"
|
|
chart = "metrics-server"
|
|
version = "3.12.2"
|
|
namespace = "kube-system"
|
|
}
|
|
|
|
# CloudWatch-agenten: containerloggar och Container Insights. Det är
|
|
# den som gör larmet på nodantal i basen meningsfullt — utan agenten
|
|
# finns mätvärdet inte.
|
|
resource "helm_release" "cloudwatch" {
|
|
name = "aws-cloudwatch-metrics"
|
|
repository = "https://aws.github.io/eks-charts"
|
|
chart = "aws-cloudwatch-metrics"
|
|
version = "0.0.11"
|
|
namespace = "amazon-cloudwatch"
|
|
create_namespace = true
|
|
|
|
set {
|
|
name = "clusterName"
|
|
value = local.aws.kluster
|
|
}
|
|
}
|