Infrastructure Architecture
หน้านี้สรุป topology ของ AWS learning site environment ตั้งแต่ DNS, VPC, EKS workloads, PostgreSQL platform layer, ECR, GitHub OIDC และ Terraform state separation ตาม layer
aws-learn.boldifytech.dev ชี้ไปที่ ALB zero-sit สำหรับ learning-site
อ่าน Architecture นี้อย่างไร
ให้มองระบบเป็น 5 layer ที่ต่อกันตาม dependency: network มาก่อน cluster, จากนั้น platform/database, app delivery และ DNS ที่ชี้ traffic เข้าระบบ
ถ้าต้อง debug ให้เริ่มจากเส้นทางผู้ใช้ก่อน: DNS → ALB → Pod → Database. ถ้าต้อง deploy ให้เริ่มจาก ECR/OIDC → EKS → Ingress/ALB.
- 1alpha-foundation สร้าง VPC, subnet, NAT, S3 endpoint และ flow logs
- 2charlie-cluster ใช้ private subnets เพื่อสร้าง EKS และ Ingress ALB
- 3echo-platform วาง PostgreSQL EC2 ใน private subnet และเปิดให้ EKS เข้าถึง
- 4foxtrot-apps เก็บ container images และให้ GitHub Actions deploy ผ่าน OIDC
- 5delta-dns ผูก domain, certificate และ CNAME เข้าหา ALB
Layer Map
ฐาน network ทั้งหมด: VPC, public/private subnet, NAT Gateway, S3 VPC Endpoint และ VPC Flow Logs
EKS runtime layer สำหรับ workloads และ Ingress: zero-app, zero-web, learning-site, ALB zero-app และ ALB zero-sit
Shared platform services: PostgreSQL EC2, encrypted data volume และ SSM SecureString สำหรับ database env
Application delivery layer: ECR repositories, GitHub Actions OIDC roles และ External Secrets sync จาก SSM
Public DNS and certificate layer: Route53 hosted zone, ACM certificate และ CNAME ไปยัง ALB zero-sit
Traffic Flow
Domain → ALB zero-sit → learning-site
- User เข้า
aws-learn.boldifytech.dev - Route53 CNAME ส่งไปที่ ALB zero-sit ใน public subnets
- ALB terminate HTTPS ด้วย ACM certificate
- Traffic เข้า learning-site pod ใน private subnet
ALB zero-app → web/app pods → PostgreSQL
/route ไปที่ zero-web pods/api/v1route ไปที่ zero-app pods- zero-app เชื่อม PostgreSQL EC2 ผ่าน TCP 5432
- Database อยู่ private-1 และไม่รับ public traffic
GitHub OIDC → ECR → EKS
- GitHub Actions assume IAM role ผ่าน OIDC
- Build image แล้ว push เข้า ECR repository ตาม app
- Deploy role update workload ใน EKS cluster
- 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 |
|---|---|---|
| VPC | zero-dev-vpc | 10.0.0.0/16 |
| Public Subnet | zero-dev-public-1 | 10.0.0.0/24, ap-southeast-1a |
| Public Subnet | zero-dev-public-2 | 10.0.1.0/24, ap-southeast-1b |
| Private Subnet | zero-dev-private-1 | 10.0.10.0/24, ap-southeast-1a |
| Private Subnet | zero-dev-private-2 | 10.0.11.0/24, ap-southeast-1b |
| NAT Gateway | zero-dev-nat | public-1 |
| S3 VPC Endpoint | zero-dev-s3-endpoint | Gateway type |
| CloudWatch Log Group | /aws/vpc/zero-dev/flow-logs | 7 day retention |
charlie-cluster
| Resource | Name | Detail |
|---|---|---|
| EKS Cluster | zero-dev-eks | k8s 1.35 |
| Node Group | zero-dev-eks-nodes | t4g.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-database | t4g.micro, 10.0.10.10 |
| EBS Data Volume | - | 20 GiB, encrypted |
| SSM Parameter | /zero/dev/postgres/env | SecureString |
foxtrot-apps
| Resource | Name | Detail |
|---|---|---|
| ECR | zero-dev-app | NestJS backend |
| ECR | zero-dev-web | Next.js frontend |
| ECR | zero-dev-learning | Static learning site |
| IAM Role | zero-dev-github-build-sit | GitHub Actions OIDC |
| IAM Role | zero-dev-github-deploy-sit | GitHub Actions OIDC |
delta-dns
| Resource | Name | Detail |
|---|---|---|
| Route53 Zone | boldifytech.dev | Z07807931JLUVW9ZA8UEV |
| ACM Certificate | boldifytech.dev | ISSUED, ap-southeast-1 |
| CNAME | aws-learn.boldifytech.dev | → zero-sit ALB |
Planned Layers
bravo-security (not yet implemented)
KMS, GuardDuty, WAF — ดู environments/dev/bravo-security/README.md