AI 기반 자동차 스마트팩토리 관제 시스템의 개발 환경을 구축하고 운영하기 위한 인프라 저장소입니다.
Terraform으로 AWS 인프라를 관리하고, Kubernetes와 Kustomize로 서비스 배포 구성을 정의합니다. Argo CD의 App of Apps 패턴을 통해 dev 브랜치의 변경 사항을 Amazon EKS에 자동 반영합니다.
- 기존 VPC와 Public/Private Subnet 조회
- Amazon EKS 클러스터 및 Managed Node Group 구성
- EKS OIDC Provider와 IRSA용 IAM Role 구성
- Amazon RDS for MySQL 구성
- Amazon ElastiCache for Redis 구성
- Amazon MSK 및 Kafka Topic 구성
- 서비스별 Security Group과 통신 규칙 구성
- Route 53 DNS 레코드 및 ACM 인증서 구성
- S3 Backend와 DynamoDB Lock을 이용한 Terraform 상태 관리
| 서비스 | 포트 | Replica | 외부 경로 | Secret |
|---|---|---|---|---|
| Frontend | 80 | 2 | / |
없음 |
| Backend | 8081 | 2 | /api, /ws |
backend-rds-secret |
| Assembly Service | 8082 | 1 | /api/process |
assembly-service-secret |
| Quality Service | 8083 | 2 | /api/quality |
quality-service-runtime-secret |
| AI Service API | 8000 | 1 | /api/ai |
ai-service-secret |
각 Deployment에는 다음 설정이 포함되어 있습니다.
- Startup, Readiness, Liveness Probe
- CPU 및 Memory Requests/Limits
- ConfigMap과 Secret 기반 환경 변수 주입
- ClusterIP Service
- ECR 이미지 태그 기반 버전 관리
argocd/root-dev.yaml에서 하위 Application 통합 관리dev브랜치 자동 감시- 자동 Sync, Prune, Self Heal 활성화
- 서비스별 Kustomize 경로 독립 관리
Application Repository
│
├─ Docker Image Build
└─ Amazon ECR Push
│
▼
Infra Repository의 kustomization.yaml 이미지 태그 변경
│
▼
Argo CD
│
▼
Amazon EKS
각 Ingress는 aims-dev-app ALB Group을 공유합니다.
Route 53 / ACM
│
▼
AWS Application Load Balancer
├─ / → Frontend:80
├─ /api → Backend:8081
├─ /ws → Backend:8081
├─ /api/process → Assembly Service:8082
├─ /api/quality → Quality Service:8083
└─ /api/ai → AI Service API:8000
- Internet-facing ALB
- Target Type
ip - HTTP → HTTPS 리다이렉트
- 서비스별 Health Check 경로 적용
- Backend
/api,/ws경로에 Sticky Session 적용
Amazon MSK는 IAM 인증과 TLS 방식으로 구성되어 있습니다.
주요 Topic:
factory.manufacturing.rawfactory.manufacturing.analysisfactory.manufacturing.alertfactory.equipment.statusquality.inspection.drive_detailquality.inspection.status_detailquality.inspection.processquality.inspection.risk_historyquality.inspection.risk_trendquality.inspection.summary
Topic은 Terraform의 aws_msk_topic 리소스로 관리하며 Replication Factor는 2입니다.
platform 네임스페이스에 다음 리소스를 배포합니다.
- Elasticsearch 8.17.0
- Kibana 8.17.0
- Logstash 8.17.0 기반 커스텀 이미지
- Logstash의 MSK 접근을 위한 ServiceAccount와 IRSA
- Kibana 전용 ALB Ingress
| 대상 | 주요 권한 |
|---|---|
| Backend | S3 객체 조회 및 저장 |
| Assembly Service | MSK Topic 접근 |
| Logstash | MSK Topic 읽기 |
| AWS Load Balancer Controller | ALB 및 Target Group 관리 |
| EBS CSI Driver | EBS Volume 관리 |
| 분류 | 기술 |
|---|---|
| Infrastructure as Code | Terraform >= 1.5.0 |
| Terraform Provider | AWS Provider 6.49.0, TLS Provider 4.3.0 |
| Cloud | AWS Seoul Region (ap-northeast-2) |
| Compute | Amazon EKS, EC2, ECR |
| Orchestration | Kubernetes, Kustomize |
| GitOps | Argo CD, App of Apps |
| Load Balancing | AWS Load Balancer Controller, ALB |
| Database | Amazon RDS for MySQL |
| Cache | Redis OSS 7.1, Amazon ElastiCache |
| Messaging | Amazon MSK, Apache Kafka 3.9.x, IAM SASL, TLS |
| Logging | Elasticsearch, Kibana, Logstash 8.17.0 |
| DNS/SSL | Route 53, ACM |
| Authentication | IAM, IRSA, EKS OIDC Provider |
| State Management | S3 Backend, DynamoDB Lock |
| Automation | AWS CLI, PowerShell, Batch Script |
| 리소스 | 기본 구성 |
|---|---|
| EKS Node | m5.large, On-Demand, Amazon Linux 2023 |
| EKS Scaling | Min 0 / Desired 3 / Max 3 |
| RDS | MySQL, db.t3.medium, gp3 20GB, 최대 100GB |
| Redis | cache.t4g.medium 2대, Primary 1 + Replica 1 |
| MSK | kafka.t3.small Broker 2대, Broker당 EBS 100GiB |
eks_version의 기본값은null입니다. 별도 버전을 지정하지 않으면 생성 시점의 AWS 기본 지원 버전이 사용됩니다.
infra-dev/
├── argocd/
│ ├── apps/
│ │ ├── ai-service-dev.yaml
│ │ ├── assembly-service-dev.yaml
│ │ ├── backend-app.yaml
│ │ ├── elastic-stack-app.yaml
│ │ ├── frontend-app.yaml
│ │ ├── ingress-app.yaml
│ │ └── quality-service-app.yaml
│ └── root-dev.yaml # App of Apps Root Application
│
├── k8s/
│ ├── ai-service/
│ │ ├── api-deployment.yaml
│ │ ├── worker-deployment.yaml
│ │ ├── service.yaml
│ │ ├── serviceaccount.yaml
│ │ ├── configmap.yaml
│ │ └── kustomization.yaml
│ │
│ ├── assembly-service/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── serviceaccount.yaml
│ │ ├── configmap.yaml
│ │ └── kustomization.yaml
│ │
│ ├── backend/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── serviceaccount.yaml
│ │ ├── configmap.yaml
│ │ └── kustomization.yaml
│ │
│ ├── frontend/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── kustomization.yaml
│ │
│ ├── ingress/
│ │ ├── frontend-ingress.yaml
│ │ ├── backend-ingress.yaml
│ │ ├── assembly-service-ingress.yaml
│ │ ├── quality-service-ingress.yaml
│ │ ├── ai-service-ingress.yaml
│ │ └── kustomization.yaml
│ │
│ ├── quality-service/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── serviceaccount.yaml
│ │ ├── configmap.yaml
│ │ └── kustomization.yaml
│ │
│ └── platform/
│ ├── argocd/
│ │ ├── ingress.yaml
│ │ └── values.yaml
│ │
│ ├── elastic-stack/
│ │ ├── logstash-image/
│ │ │ ├── Dockerfile
│ │ │ ├── config/
│ │ │ └── pipeline/
│ │ │
│ │ └── manifests/
│ │ ├── 01-elasticsearch.yaml
│ │ ├── 02-kibana.yaml
│ │ ├── 03-logstash-serviceaccount.yaml
│ │ ├── 04-logstash-deployment.yaml
│ │ └── 05-kibana-ingress.yaml
│ │
│ └── kafbat/
│ ├── kafbat-ingress.yaml
│ ├── kafbat-msk-policy.json
│ ├── kafbat-portforward-rbac.yaml
│ ├── kafbat-trust-policy.json
│ └── kafbat-values.yaml
│
├── scripts/
│ ├── dev-up.ps1
│ ├── dev-down.ps1
│ ├── up_Mon.ps1
│ ├── down_Fri.ps1
│ └── *.bat
│
├── terraform/
│ ├── versions.tf # Terraform 및 Provider 버전
│ ├── provider.tf # AWS Provider
│ ├── backend.tf # S3 Backend 및 DynamoDB Lock
│ ├── variables.tf
│ ├── outputs.tf
│ ├── eks.tf # EKS, Node Group, Add-on, OIDC
│ ├── rds.tf # RDS MySQL
│ ├── elasticache.tf # Redis
│ ├── msk.tf # MSK 및 Kafka Topic
│ ├── security_group.tf
│ ├── route53_acm.tf
│ ├── backend-irsa.tf
│ ├── assembly-irsa.tf
│ ├── logstash-irsa.tf
│ └── iam_policy_lbc.json
│
├── .gitignore
└── README.md
- Terraform 1.5 이상
- AWS CLI, kubectl, Git
- PowerShell 5.1 이상 또는 PowerShell 7
- AWS Profile
aims-terraform - 기존 VPC, Public/Private Subnet
- Terraform Backend용 S3 Bucket과 DynamoDB Table
- ECR Repository, Route 53 Hosted Zone
- Argo CD와 AWS Load Balancer Controller
aws configure --profile aims-terraform
aws sts get-caller-identity --profile aims-terraform환경별 값은 Git에 커밋하지 않는 terraform.tfvars에 작성합니다.
my_ip = "xxxxxxxx/32"
vpc_id = "vpc-xxxxxxxxxxxxxxxxx"
# ALB 생성 후 Route 53 Alias 연결 시 입력
alb_dns_name = "xxxxxxxx.ap-northeast-2.elb.amazonaws.com"
alb_zone_id = "XXXXXXXXXXXXXX"cd terraform
terraform fmt
terraform init
terraform validate
terraform plan -out=tfplan
terraform show tfplan
terraform apply tfplanPlan에서 예상하지 않은 RDS, MSK, Redis 또는 IAM 리소스의 삭제·재생성이 없는지 확인합니다.
aws eks update-kubeconfig \
--region ap-northeast-2 \
--name aims-dev-eks \
--profile aims-terraform
kubectl get nodes -o widekubectl create namespace aims-project
kubectl create namespace platformSecret 매니페스트는 저장소에 포함하지 않습니다.
backend-rds-secretassembly-service-secretai-service-secret선택quality-service-runtime-secret선택
필요한 Key는 각 애플리케이션의 환경 변수 정의를 기준으로 생성하고, Secret 값은 Git에 커밋하지 않습니다.
kubectl apply -f argocd/root-dev.yaml
kubectl get applications -n platform
kubectl get pods -n aims-project
kubectl get pods -n platform
kubectl get ingress -ATerraform은 AWS Load Balancer Controller의 IAM Role과 Policy를 생성하지만 Controller 자체는 별도로 설치해야 합니다. Argo CD 설치 파일도 현재 저장소에 포함되어 있지 않습니다.
각 서비스의 kustomization.yaml에서 ECR 이미지 태그를 관리합니다.
images:
- name: <ECR_REPOSITORY>/aims/backend
newName: <ECR_REPOSITORY>/aims/backend
newTag: dev-<COMMIT_SHA>- 애플리케이션 저장소에서 Docker Image를 빌드합니다.
- Image를 Amazon ECR에 Push합니다.
- 인프라 저장소
dev브랜치의newTag를 변경합니다. - 변경 사항을 Push합니다.
- Argo CD가 변경을 감지해 Deployment를 갱신합니다.
# 전체 리소스 확인
kubectl get pods,svc,ingress -n aims-project
# Rollout 확인
kubectl rollout status deployment/backend -n aims-project
kubectl rollout status deployment/assembly-service -n aims-project
kubectl rollout status deployment/quality-service -n aims-project
kubectl rollout status deployment/ai-service-api -n aims-project
# 로그 확인
kubectl logs deployment/backend -n aims-project --tail=200
kubectl logs deployment/ai-service-api -n aims-project --tail=200
# Argo CD 확인
kubectl get applications -n platform
kubectl describe application aims-dev-root -n platform
- 개발 배포 브랜치:
dev - Argo CD Auto Sync: 활성화
- Resource Prune: 활성화
- Self Heal: 활성화
- 이미지 태그:
dev-<commit-sha>형식 권장
Feature Branch
→ Terraform Plan 또는 Kustomize Render 확인
→ Pull Request Review
→ dev Branch Merge
→ Argo CD Sync 확인
→ Service Health Check 확인