Skip to content

AWS 아키텍처

전체 아키텍처 다이어그램

네트워킹

VPC

항목구성
CIDR10.0.0.0/16
DNS Hostnames활성화
DNS Support활성화

Subnet 레이아웃

모든 환경에서 동일한 서브넷 구조를 사용합니다.

서브넷CIDR가용 영역용도
public-subnet-2a10.0.0.0/20ap-northeast-2aALB, NAT Gateway
public-subnet-2b10.0.16.0/20ap-northeast-2bALB (Multi-AZ)
private-subnet-2a10.0.128.0/20ap-northeast-2aECS, RDS, Redis
private-subnet-2b10.0.144.0/20ap-northeast-2bECS, RDS (Multi-AZ)

NAT Gateway

Private Subnet의 ECS 컨테이너가 인터넷에 접근하기 위한 NAT Gateway가 public-subnet-2a에 배치됩니다. Elastic IP가 할당되어 고정 IP로 아웃바운드 트래픽을 처리합니다.

VPC Endpoints

SSM Session Manager를 위한 Interface 타입 VPC Endpoint가 Private Subnet에 구성되어 있습니다. 전용 Security Group(truloop-vpc-endpoints-{env})이 VPC CIDR에서의 HTTPS 트래픽을 허용합니다.

  • ssm — AWS Systems Manager API 호출
  • ssmmessages — SSM 세션 데이터 채널
  • ec2messages — SSM Agent 하트비트

Security Group

ALB Security Group은 truloop-infra에서 관리하며, ECS/RDS/Redis Security Group은 truloop-core의 서비스별 인프라에서 관리합니다.

ALB Security Group

방향포트프로토콜소스설명
Ingress80TCP0.0.0.0/0HTTP
Ingress443TCP0.0.0.0/0HTTPS
Egress전체전체0.0.0.0/0Health Check

ALB (Application Load Balancer)

ALB는 HTTPS 트래픽을 각 ECS 서비스로 라우팅합니다.

Listener 구성

Listener포트동작
HTTP80기본: 404 응답 (서비스별 규칙으로 리다이렉트)
HTTPS443ACM 인증서 사용, 기본: 404 응답

정보

Target Group과 Listener Rule은 각 서비스 레포의 인프라 코드에서 관리합니다. truloop-infra는 ALB와 Listener만 생성합니다. 예외적으로 Grafana Target Group(Dev 환경)만 truloop-infra에서 관리합니다.

ECS Cluster

ECS Cluster는 Fargate 기반으로 운영되며, AWS Cloud Map을 통한 Service Discovery를 지원합니다.

Service Connect

ECS Service Connect가 활성화되어 있으며, Private DNS Namespace(truloop-{env}.local)를 통해 서비스 간 통신이 가능합니다.

서비스 목록

서비스포트용도
truloop-core-dev8080메인 API 서버 (Ktor)
chatter-dev8080AI 비서 서비스
truloop-ai-server-fastapi-dev8080AI 서버 (FastAPI)
truloop-ai-server-celery-worker-dev-비동기 작업 워커
truloop-media-service-dev8080미디어 처리 서비스 (Go)
prometheus9090메트릭 수집
grafana3000대시보드

주의

Task Definition은 각 서비스의 CI/CD (GitHub Actions)에서 관리합니다. Pulumi는 ignoreChanges: ["taskDefinition"]으로 이를 추적하지 않습니다.

데이터 저장소

Aurora PostgreSQL

  • Dev: 단일 인스턴스 (truloop-dev)
  • Prod: 2개 인스턴스 Writer + Reader (truloop-prod)

ElastiCache Redis

  • Dev: 단일 노드 (truloop-dev-redis-single)
  • Prod: 복제 구성 (truloop-prod-redis)

정보

RDS와 ElastiCache의 세부 설정(인스턴스 타입, 파라미터 등)은 truloop-core의 서비스별 인프라에서 관리합니다.

S3 스토리지

버킷DevProd용도
Maintruloop-dev-buckettruloop-prod-bucket범용 스토리지
Assetstruloop-assets-devtruloop-assets-prod정적 에셋 (CloudFront 연동)
Configstruloop-configs-dev-설정 파일
Imagestruloop-images-dev-이미지 저장

정보

userContents 버킷은 truloop-media-service 레포에서 별도로 관리합니다.

CDN (CloudFront)

Assets CDN은 S3 버킷의 정적 에셋을 CloudFront를 통해 배포합니다.

항목DevProd
도메인assets-dev.truloop.appassets.truloop.app
OriginS3 (OAC 인증)S3 (OAC 인증)
Price ClassPriceClass_200PriceClass_200
TLSTLSv1.2_2021TLSv1.2_2021

CloudFront는 Origin Access Control(OAC)을 통해 S3 버킷에 접근하며, ACM 인증서는 us-east-1 리전에 별도 생성됩니다.

SSM Bastion

RDS 데이터베이스에 직접 접근하기 위해 EC2 기반 SSM Bastion을 사용합니다. SSH 키 없이 AWS SSM Session Manager의 Port Forwarding을 통해 안전하게 접속합니다.

항목구성
인스턴스 타입t4g.nano (ARM, ~$3/월)
AMIAmazon Linux 2023 (ARM64)
볼륨8GB gp3, 암호화
서브넷Private Subnet 2a
IAMAmazonSSMManagedInstanceCore 정책
IMDSv2필수 (보안 강화)

정보

ECS Fargate의 execute-command agent는 AWS-StartPortForwardingSessionToRemoteHost document를 완전히 지원하지 않으므로, EC2 기반 Bastion을 사용합니다.

bash
# SSM Port Forwarding으로 RDS 접근
aws ssm start-session \
  --target <bastion-instance-id> \
  --document-name AWS-StartPortForwardingSessionToRemoteHost \
  --parameters '{"host":["<rds-endpoint>"],"portNumber":["5432"],"localPortNumber":["5432"]}'

변경 이력

날짜변경 내용
2026-03-10소스 코드 검증: 아키텍처 다이어그램에 media-service 추가, ECS 서비스 목록에 media-service 추가, SSM Bastion 인스턴스 상세 추가, VPC Endpoints Security Group 설명 추가, Grafana Target Group 관리 주체 명시