Architecture Dev environment EKS + ALB + PostgreSQL

Infrastructure Architecture

หน้านี้สรุป topology ของ AWS learning site environment ตั้งแต่ DNS, VPC, EKS workloads, PostgreSQL platform layer, ECR, GitHub OIDC และ Terraform state separation ตาม layer

Public entry Route53 + ALB aws-learn.boldifytech.dev ชี้ไปที่ ALB zero-sit สำหรับ learning-site
Network base VPC 10.0.0.0/16 2 public subnets สำหรับ ALB และ 2 private subnets สำหรับ EKS/DB
Runtime EKS zero-dev-eks รัน zero-app, zero-web และ learning-site บน node group ARM64
Data + delivery PostgreSQL, ECR, OIDC DB อยู่ private subnet, images อยู่ ECR, deploy ผ่าน GitHub OIDC

อ่าน Architecture นี้อย่างไร

ให้มองระบบเป็น 5 layer ที่ต่อกันตาม dependency: network มาก่อน cluster, จากนั้น platform/database, app delivery และ DNS ที่ชี้ traffic เข้าระบบ

ถ้าต้อง debug ให้เริ่มจากเส้นทางผู้ใช้ก่อน: DNS → ALB → Pod → Database. ถ้าต้อง deploy ให้เริ่มจาก ECR/OIDC → EKS → Ingress/ALB.

  1. 1alpha-foundation สร้าง VPC, subnet, NAT, S3 endpoint และ flow logs
  2. 2charlie-cluster ใช้ private subnets เพื่อสร้าง EKS และ Ingress ALB
  3. 3echo-platform วาง PostgreSQL EC2 ใน private subnet และเปิดให้ EKS เข้าถึง
  4. 4foxtrot-apps เก็บ container images และให้ GitHub Actions deploy ผ่าน OIDC
  5. 5delta-dns ผูก domain, certificate และ CNAME เข้าหา ALB

Layer Map

Layer 1 alpha-foundation

ฐาน network ทั้งหมด: VPC, public/private subnet, NAT Gateway, S3 VPC Endpoint และ VPC Flow Logs

10.0.0.0/16 2 AZ private_subnet_ids
Layer 2 charlie-cluster

EKS runtime layer สำหรับ workloads และ Ingress: zero-app, zero-web, learning-site, ALB zero-app และ ALB zero-sit

zero-dev-eks k8s 1.35 t4g.small x 2
Layer 3 echo-platform

Shared platform services: PostgreSQL EC2, encrypted data volume และ SSM SecureString สำหรับ database env

10.0.10.10 TCP 5432 private-1
Layer 4 foxtrot-apps

Application delivery layer: ECR repositories, GitHub Actions OIDC roles และ External Secrets sync จาก SSM

ECR x 3 build role deploy role
Layer 5 delta-dns

Public DNS and certificate layer: Route53 hosted zone, ACM certificate และ CNAME ไปยัง ALB zero-sit

boldifytech.dev ACM issued CNAME to ALB

Traffic Flow

Learning site

Domain → ALB zero-sit → learning-site

  1. User เข้า aws-learn.boldifytech.dev
  2. Route53 CNAME ส่งไปที่ ALB zero-sit ใน public subnets
  3. ALB terminate HTTPS ด้วย ACM certificate
  4. Traffic เข้า learning-site pod ใน private subnet
App stack

ALB zero-app → web/app pods → PostgreSQL

  1. / route ไปที่ zero-web pods
  2. /api/v1 route ไปที่ zero-app pods
  3. zero-app เชื่อม PostgreSQL EC2 ผ่าน TCP 5432
  4. Database อยู่ private-1 และไม่รับ public traffic
Deploy path

GitHub OIDC → ECR → EKS

  1. GitHub Actions assume IAM role ผ่าน OIDC
  2. Build image แล้ว push เข้า ECR repository ตาม app
  3. Deploy role update workload ใน EKS cluster
  4. External Secrets sync config จาก SSM Parameter Store

Detailed Mermaid Diagram

แผนภาพเต็มสำหรับดู relationship ทุก node พร้อมกัน ถ้าหน้าจอแคบสามารถเลื่อนซ้ายขวาได้

graph TB
    Internet((Internet))

    subgraph delta-dns
        R53[Route53\nboldifytech.dev]
        ACM[ACM Certificate\naws-learn.boldifytech.dev]
    end

    subgraph alpha-foundation
        VPC[VPC 10.0.0.0/16]
        subgraph public[Public Subnets]
            PUB1[public-1\n10.0.0.0/24\n1a]
            PUB2[public-2\n10.0.1.0/24\n1b]
        end
        subgraph private[Private Subnets]
            PRI1[private-1\n10.0.10.0/24\n1a]
            PRI2[private-2\n10.0.11.0/24\n1b]
        end
        NAT[NAT Gateway]
        S3EP[S3 VPC Endpoint]
    end

    subgraph charlie-cluster
        EKS[EKS zero-dev-eks\nk8s 1.35]
        ALB1[ALB zero-app]
        ALB2[ALB zero-sit]
        subgraph node1[Node ip-10-0-10-37]
            APP1[zero-app\n10.0.10.126]
            WEB1[zero-web\n10.0.10.159]
        end
        subgraph node2[Node ip-10-0-11-231]
            APP2[zero-app\n10.0.11.165]
            WEB2[zero-web\n10.0.11.171]
            LEARN[learning-site\n10.0.11.223]
        end
    end

    subgraph echo-platform
        DB[PostgreSQL EC2\n10.0.10.10\nt4g.micro]
        SSM[SSM Parameter\n/zero/dev/postgres/env]
    end

    subgraph foxtrot-apps
        ECR1[ECR zero-dev-app]
        ECR2[ECR zero-dev-web]
        ECR3[ECR zero-dev-learning]
        OIDC[GitHub OIDC\nbuild/deploy roles]
        ESO[External Secrets\nOperator]
    end

    Internet -->|aws-learn.boldifytech.dev| R53
    R53 -->|CNAME| ALB2
    Internet --> ALB1
    ALB1 -->|/api/v1| APP1
    ALB1 -->|/api/v1| APP2
    ALB1 -->|/| WEB1
    ALB1 -->|/| WEB2
    ALB2 --> LEARN
    APP1 & APP2 -->|TCP 5432| DB
    ESO -->|sync| SSM
    PUB1 & PUB2 --> ALB1 & ALB2
    PRI1 --> node1
    PRI2 --> node2
    PRI1 --> DB
    NAT -->|outbound| Internet
    ACM -->|cert| ALB2

Layer Overview

┌─────────────────────────────────────────────────────────────────────┐
│  ALPHA-FOUNDATION                                                   │
│                                                                     │
│  VPC: 10.0.0.0/16 (vpc-055140b146cea8818)                           │
│  ├── public-1:   10.0.0.0/24  (ap-southeast-1a)  ← ALB              │
│  ├── public-2:   10.0.1.0/24  (ap-southeast-1b)  ← ALB              │
│  ├── private-1:  10.0.10.0/24 (ap-southeast-1a)                     │
│  └── private-2:  10.0.11.0/24 (ap-southeast-1b)                     │
│                                                                     │
│  NAT Gateway → Internet (outbound only)                             │
│  S3 VPC Endpoint (ECR image pull ไม่ผ่าน NAT)                         │
│  VPC Flow Logs → CloudWatch                                         │
└──────────────────────────┬──────────────────────────────────────────┘
                           │ private_subnet_ids
                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  CHARLIE-CLUSTER                                                    │
│                                                                     │
│  EKS: zero-dev-eks (k8s 1.35, ACTIVE)                               │
│  ├── Node: ip-10-0-10-37  (private-1, t4g.small)                    │
│  │     ├── zero-app  10.0.10.126                                    │
│  │     └── zero-web  10.0.10.159                                    │
│  └── Node: ip-10-0-11-231 (private-2, t4g.small)                    │
│        ├── zero-app      10.0.11.165                                │
│        ├── zero-web      10.0.11.171                                │
│        └── learning-site 10.0.11.223                                │
│                                                                     │
│  ALB zero-app  → /api/v1 → zero-app, / → zero-web  (public subnet)  │
│  ALB zero-sit  → aws-learn.boldifytech.dev → learning-site          │
└──────────┬─────────────────────────┬────────────────────────────────┘
           │ cluster_security_group_id│ cluster_name
           ▼                         ▼
┌──────────────────────┐  ┌───────────────────────────────────────────┐
│  ECHO-PLATFORM       │  │  FOXTROT-APPS                             │
│                      │  │                                           │
│  EC2: zero-dev-db    │  │  ECR: zero-dev-app                        │
│  IP:  10.0.10.10     │  │  ECR: zero-dev-web                        │
│  Type: t4g.micro     │  │  ECR: zero-dev-learning                   │
│  Port: 5432          │  │                                           │
│  SSM: /zero/dev/     │  │  GitHub OIDC → build/deploy roles         │
│       postgres/env   │  │  External Secrets → SSM Parameter Store   │
└──────────────────────┘  └───────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│  DELTA-DNS                                                          │
│                                                                     │
│  Route53: boldifytech.dev (Z07807931JLUVW9ZA8UEV)                   │
│  ACM: boldifytech.dev + aws-learn.boldifytech.dev  (ISSUED)         │
│  CNAME: aws-learn.boldifytech.dev → zero-sit ALB                    │
└─────────────────────────────────────────────────────────────────────┘

Traffic Flow Reference

Internet
  │
  ├── aws-learn.boldifytech.dev
  │     └── Route53 CNAME → ALB zero-sit (public subnets)
  │           └── HTTPS 443 → learning-site pods (private subnets)
  │
  └── ALB zero-app (public subnets)
        ├── /api/v1 → zero-app pods (private subnets)
        │     └── TCP 5432 → PostgreSQL EC2 (private-1)
        └── /       → zero-web pods (private subnets)

Layer Connection Points

From To Output ที่ใช้
charlie-cluster alpha-foundation private_subnet_ids
echo-platform alpha-foundation vpc_id, vpc_cidr, private_subnet_ids
echo-platform charlie-cluster cluster_security_group_id
foxtrot-apps charlie-cluster cluster_name, cluster_arn, pod_identity_assume_role_json
delta-dns charlie-cluster ALB DNS name (manual ใน terraform.tfvars)

S3 State Keys

zero-dev-tfstate-446483465199/
├── dev/alpha-foundation/terraform.tfstate
├── dev/charlie-cluster/terraform.tfstate
├── dev/delta-dns/terraform.tfstate
├── dev/echo-platform/terraform.tfstate
└── dev/foxtrot-apps/terraform.tfstate

Resources สรุปต่อ Layer

alpha-foundation

Resource Name Detail
VPCzero-dev-vpc10.0.0.0/16
Public Subnetzero-dev-public-110.0.0.0/24, ap-southeast-1a
Public Subnetzero-dev-public-210.0.1.0/24, ap-southeast-1b
Private Subnetzero-dev-private-110.0.10.0/24, ap-southeast-1a
Private Subnetzero-dev-private-210.0.11.0/24, ap-southeast-1b
NAT Gatewayzero-dev-natpublic-1
S3 VPC Endpointzero-dev-s3-endpointGateway type
CloudWatch Log Group/aws/vpc/zero-dev/flow-logs7 day retention

charlie-cluster

Resource Name Detail
EKS Clusterzero-dev-eksk8s 1.35
Node Groupzero-dev-eks-nodest4g.small x 2, ARM64
ALB (zero-app)k8s-sit-zeroapp-*internet-facing
ALB (zero-sit)k8s-zerosit-*internet-facing, group

echo-platform

Resource Name Detail
EC2 (PostgreSQL)zero-dev-databaset4g.micro, 10.0.10.10
EBS Data Volume-20 GiB, encrypted
SSM Parameter/zero/dev/postgres/envSecureString

foxtrot-apps

Resource Name Detail
ECRzero-dev-appNestJS backend
ECRzero-dev-webNext.js frontend
ECRzero-dev-learningStatic learning site
IAM Rolezero-dev-github-build-sitGitHub Actions OIDC
IAM Rolezero-dev-github-deploy-sitGitHub Actions OIDC

delta-dns

Resource Name Detail
Route53 Zoneboldifytech.devZ07807931JLUVW9ZA8UEV
ACM Certificateboldifytech.devISSUED, ap-southeast-1
CNAMEaws-learn.boldifytech.dev→ zero-sit ALB

Planned Layers

bravo-security (not yet implemented)

KMS, GuardDuty, WAF — ดู environments/dev/bravo-security/README.md