1. 전체 아키텍처 개요
1.1 인프라 아키텍처

1.2 시스템 아키텍처

1.2.1 서비스 아키텍처 (User-facing Layer)
| 레이어 | 기술 | 역할 |
|---|---|---|
| 프론트엔드 | React | 사용자 인터페이스 |
| CDN | CloudFront | 정적 파일 제공 및 HTTPS |
| 스토리지 | S3 | 정적 파일 저장 |
| 로드밸런서 | ALB | 트래픽 분산 및 SSL 종료 |
| 백엔드 | Spring Boot | API 서버 |
| 데이터베이스 | MySQL | 관계형 데이터 저장 |
| 캐시 | Redis | 세션, 캐싱 관리 |
| DNS | Route53 | 도메인 관리 |
| 인프라 | AWS VPC, EC2 | 네트워크/컴퓨팅 |
1.2.2 로그 파이프라인 아키텍처 (Observability Layer)
| 구성 요소 | 기술 | 역할 |
|---|---|---|
| 로그 수집 | Fluent Bit | 애플리케이션/시스템 로그 수집, 1차 파싱(JSON/multiline), transform.lua 기반 필드 정규화, Kafka Producer |
| 메시지 큐 | Kafka | 로그 스트리밍, 버퍼링, 백프레셔 조절 |
| 로그 처리/정규화 | Logstash | Kafka Consumer 역할, 2차 정규화(mutate/grok), OpenSearch 인덱싱 |
| 검색/스토리지 | OpenSearch | 로그 저장·검색·분석 |
| AI 분석 | FastAPI (optional) | AI 기반 분석 API 제공 |
| CI/CD | Jenkins | 자동화 빌드·배포 |
1.3 데이터 흐름
1.3.1 사용자 요청 흐름
프론트엔드 접근
User → www.loglens.co.kr → Route53 → CloudFront → S3 → React AppAPI 요청
React App → api.loglens.co.kr → Route53 → ALB → loglens-server (Spring Boot:8080)1.3.2 로그 수집 흐름
Application → Fluent Bit → Kafka → Logstash → OpenSearch → 검색/분석1.3.3 관리자 접근 흐름
Admin → bastion.loglens.co.kr → Bastion Host (Public) → loglens-server (Private)2. 네트워크 아키텍처
2.1 VPC 설계
LogLens는 독립적이고 안전한 네트워크 환경을 위해 전용 VPC를 구성했습니다.
2.1.1 loglens-vpc
| 속성 | 값 |
|---|---|
| VPC ID | vpc-00c3fda*** |
| CIDR | 10.0.0.0/16 |
| 리전 | ap-northeast-2 (서울) |
| 사용 가능 IP | 65,536개 |
2.1.2 VPC 구성 이점
VPC를 통해 다음과 같은 이점을 확보했습니다.
- 네트워크 격리: 다른 AWS 계정 및 서비스로부터 완전히 분리된 네트워크 공간을 확보하여 보안을 강화했습니다.
- 보안 강화: IP 주소 범위, 서브넷, 라우팅 테이블을 직접 제어하여 세밀한 보안 정책을 구현할 수 있습니다.
- 확장성: 향후 서비스 확장 시 추가 리소스를 동일한 네트워크 내에서 안전하게 배치할 수 있는 여유 공간을 확보했습니다.
2.2 서브넷 구성
LogLens는 VPC 내부를 Public 서브넷(외부와 통신하는 영역)과 Private 서브넷(애플리케이션이 동작하는 내부 영역)으로 분리해 트래픽 경로를 명확하게 설계했습니다.
2.2.1 Public 서브넷
| 서브넷 | CIDR | 가용영역 | 용도 |
|---|---|---|---|
| loglens-subnet-public01 | 10.0.0.0/20 | ap-northeast-2a | ALB, Bastion, NAT Gateway |
| loglens-subnet-public02 | 10.0.16.0/20 | ap-northeast-2c | ALB (고가용성) |
2.2.2 Private 서브넷
| 서브넷 | CIDR | 가용영역 | 용도 |
|---|---|---|---|
| loglens-subnet-private01 | 10.0.64.0/20 | ap-northeast-2a | Application Server |
2.3 게이트웨이 구성
2.3.1 Internet Gateway
Public 서브넷의 리소스가 인터넷과 양방향으로 통신할 수 있도록 Internet Gateway를 연결했습니다.
| 속성 | 값 |
|---|---|
| 이름 | loglens-gateway |
| ID | igw-0a35cbe*** |
| 연결 VPC | loglens-vpc |
주요 역할
- 외부 트래픽 수신: 사용자가 인터넷을 통해 ALB로 접근할 수 있도록 함.
- 아웃바운드 통신 지원: Public 서브넷의 리소스가 외부 API 호출·업데이트 등을 수행할 수 있도록 함.
- 관리 접근 경로 제공: Bastion Host의 SSH 접속 경로로 사용됨.
2.3.2 NAT Gateway
Private 서브넷의 리소스가 외부로 아웃바운드 통신을 할 수 있도록 NAT Gateway를 구성했습니다.
| 속성 | 값 |
|---|---|
| 이름 | loglens-ngw-01 |
| ID | nat-04f37a0f*** |
| 서브넷 | loglens-subnet-public01 |
| Public IP | 43.201.. |
| Private IP | 10.0.7.179 |
주요 역할
- 보안 유지: Private 서버를 외부에 노출하지 않으면서 인터넷으로 나가는 트래픽만 허용.
- 패키지 설치 지원: 애플리케이션 서버가 라이브러리·업데이트를 다운로드할 수 있도록 함.
- 외부 서비스 연동: 외부 API(알림/결제/인증 등)와의 아웃바운드 통신을 지원.
2.4 라우팅 테이블
LogLens는 Public과 Private 서브넷의 역할을 명확히 분리하기 위해 서브넷별로 독립적인 라우팅 테이블을 구성했습니다.
Public 서브넷은 Internet Gateway(IGW), Private 서브넷은 NAT Gateway를 통해 외부와 통신하도록 설계했습니다.
2.4.1 loglens-rt-public
Public 서브넷이 인터넷과 통신할 수 있도록 Internet Gateway로 기본 경로(0.0.0.0/0)를 연결했습니다.
| 대상 | 타겟 | 설명 |
|---|---|---|
| 10.0.0.0/16 | local | VPC 내부 통신 |
| 0.0.0.0/0 | igw-0a35cbe*** | 인터넷 트래픽 |
연결된 서브넷:
- loglens-subnet-public01
- loglens-subnet-public02
2.4.2 loglens-rt-private01
Private 서브넷은 외부에 직접 노출되지 않도록 하고, 필요한 아웃바운드 트래픽만 NAT Gateway를 통해 허용했습니다.
| 대상 | 타겟 | 설명 |
|---|---|---|
| 10.0.0.0/16 | local | VPC 내부 통신 |
| 0.0.0.0/0 | nat-04f37a0f*** | 인터넷 아웃바운드 (NAT 경유) |
연결된 서브넷:
- loglens-subnet-private01
2.4.3 주요 역할
- 트래픽 분리: Public 서브넷은 IGW를 통해 외부와 통신하고, Private 서브넷은 NAT Gateway를 통해서만 아웃바운드 트래픽을 허용합니다.
- 보안 강화: 애플리케이션 서버는 Private 서브넷에 배치되어 외부에서 직접 접근할 수 없도록 보호합니다.
- AZ 일관성 유지: 여러 가용 영역에 배치된 Public 서브넷이 동일한 라우팅 구성을 갖도록 해 ALB 및 Public 리소스가 안정적으로 동작하도록 합니다.
3. 보안 아키텍처
3.1. Security Groups
리소스별 최소 권한 원칙을 적용하여, 필요한 트래픽만 허용하는 보안 그룹을 구성했습니다.
3.1.1. loglens-sg-bastion
Bastion Host에 대한 SSH 접근만 허용하도록 구성했습니다.
Inbound Rules
| 타입 | 프로토콜 | 포트 | 소스 | 설명 |
|---|---|---|---|---|
| SSH | TCP | 22 | 0.0.0.0/0 | SSH 접속 허용 |
Outbound Rules
| 타입 | 프로토콜 | 포트 | 대상 | 설명 |
|---|---|---|---|---|
| All | All | All | 0.0.0.0/0 | 모든 아웃바운드 허용 |
3.1.2. loglens-sg-elb
외부 사용자가 HTTP/HTTPS로 ALB에 접근할 수 있도록 구성했습니다.
Inbound Rules
| 타입 | 프로토콜 | 포트 | 소스 | 설명 |
|---|---|---|---|---|
| HTTP | TCP | 80 | 0.0.0.0/0 | HTTP 접속 허용 |
| HTTPS | TCP | 443 | 0.0.0.0/0 | HTTPS 접속 허용 |
Outbound Rules
| 타입 | 프로토콜 | 포트 | 대상 | 설명 |
|---|---|---|---|---|
| All | All | All | 0.0.0.0/0 | 모든 아웃바운드 허용 |
3.1.3. loglens-sg-server
애플리케이션 서버는 ALB·Bastion·DB·Redis 등 필요한 리소스에서만 접근하도록 제한했습니다.
Inbound Rules
| 타입 | 프로토콜 | 포트 | 소스 | 설명 |
|---|---|---|---|---|
| Custom TCP | TCP | 8080 | sg-04dc60bb*** (ALB) | Spring Boot API |
| SSH | TCP | 22 | sg-0579016*** (Bastion) | SSH 관리 접속 |
| MySQL | TCP | 3306 | sg-0579016*** (Bastion) | 데이터베이스 관리 |
| Redis | TCP | 6379 | sg-0579016*** (Bastion) | 캐시 관리 |
Outbound Rules
| 타입 | 프로토콜 | 포트 | 대상 | 설명 |
|---|---|---|---|---|
| All | All | All | 0.0.0.0/0 | 모든 아웃바운드 허용 |
3.1.4 주요 역할
- 리소스별 최소 권한 적용: 필요 트래픽만 허용하여 불필요한 접근을 차단.
- 계층 기반 접근 제어: Bastion → Server → DB/Redis 구조로 명확한 보안 경로 확보.
- 운영 효율성 확보: 규칙 변경 시 즉시 반영되어 유연한 보안 정책 관리 가능.
3.2 IAM 역할
3.2.1 loglens-role-web
애플리케이션 서버(EC2)가 S3에 안전하게 접근할 수 있도록 부여된 IAM Role입니다.
신뢰 주체(Trusted Entity)
- EC2 서비스가 이 역할을 사용할 수 있도록 설정됨.
연결된 정책
- S3 버킷에 대한 업로드·조회 권한을 가진 고객 관리형 정책 1개 연결
- Access Key를 코드나 서버에 저장할 필요 없이, 역할 기반으로 안전하게 S3에 접근 가능
주요 역할
- 파일 업로드 처리: 사용자 업로드 파일을 S3에 저장
- 정적 리소스 조회: 애플리케이션이 S3 객체를 직접 읽어 서비스에 활용
4. 컴퓨팅 리소스
4.1. EC2 인스턴스
4.1.1. loglens-bastion
Private 서브넷 서버에 안전하게 접속하기 위한 Bastion Host
| 속성 | 값 |
|---|---|
| Instance ID | i-0905639f*** |
| Instance Type | t3.micro |
| Public IP | 54.180.. |
| Private IP | 10.0.4.149 |
| 서브넷 | loglens-subnet-public01 |
| Security Group | loglens-sg-bastion |
| DNS | bastion.loglens.co.kr |
역할
- Private 서브넷에 위치한 애플리케이션 서버에 접근하기 위한 단일 SSH 진입점
- 외부에서 직접 접근할 수 없는 서버를 안전하게 관리하도록 지원
4.1.2 loglens-server
LogLens 애플리케이션이 실행되는 메인 EC2 인스턴스입니다.
| 속성 | 값 |
|---|---|
| Instance ID | i-04c1b60d*** |
| Instance Type | t3.medium |
| Private IP | 10.0.67.85 |
| 서브넷 | loglens-subnet-private01 |
| Security Group | loglens-sg-server |
| IAM Role | loglens-role-web |
| DNS (내부) | loglens-server.home |
역할
- Spring Boot 기반 LogLens 백엔드 서비스 실행
- Docker Compose로 애플리케이션 및 데이터 계층 서비스 운영
4.1.3. 실행 중인 서비스
loglens-server 내부에서 Docker Container로 실행되는 서비스들입니다.
애플리케이션 계층
- Spring Boot (8080): LogLens REST API 제공
- Jenkins: CI/CD 파이프라인 서버
데이터 계층
- MySQL: 애플리케이션 데이터 저장
- Redis: 세션·캐시 관리
4.2 데이터 수집·분석 서버 (외부 제공)
Kafka · Logstash · OpenSearch · FastAPI는 별도 EC2 인스턴스(t2.xlarge) 에서 운영되며, SSH Key만 제공된 외부 관리 서버입니다.
VPC, 서브넷, 보안 그룹 등 AWS 구성 정보는 확인할 수 없어 기본적인 사양과 역할만 기술합니다.
4.2.1 인스턴스 사양 (t2.xlarge)
| 항목 | 내용 |
|---|---|
| CPU | 4 vCPU |
| 메모리 | 총 16GB |
| 디스크 | 총 310GB / 사용 5GB / 잔여 305GB |
4.2.2 실행 중인 구성 요소
- Kafka : 로그 스트리밍 메시지 브로커로, Fluent Bit이 보낸 로그를 application-logs 토픽에 저장함
- Logstash : Kafka(application-logs)를 consumer로 읽어, 로그를 정규화하고 OpenSearch 인덱스(application-logs-*)에 색인함
- OpenSearch : 수집된 로그를 저장하며 검색, 필터링, 분석 기능을 제공
- FastAPI : OpenSearch 데이터를 기반으로 분석 API와 AI 연동 서비스를 제공
4.2.3 역할 요약
- LogLens 서버로부터 수집된 로그를 저장·처리하는 데이터 파이프라인의 핵심 서버
- 고성능 분석 및 검색을 위해 충분한 CPU/메모리/스토리지 확보
- 외부 제공 서버이므로 AWS 인프라 레벨 구성을 문서화하지 않고, 실행 서비스 중심으로 기술
5. 로드 밸런싱
5.1 Application Load Balancer (loglens-elb)
인터넷에서 들어오는 모든 요청을 ALB에서 먼저 수신하도록 구성하여, 도메인 조건에 따라 적절한 Target Group으로 전달되도록 설정했습니다.
이를 통해 HTTPS 기반의 안전한 통신을 제공하고, 서비스 확장과 Blue/Green 배포를 지원하는 시스템의 단일 진입점 역할을 수행하도록 만들었습니다.
5.1.1 기본 정보
| 속성 | 값 |
|---|---|
| DNS Name | loglens-elb-178704670.ap-northeast-2.elb.amazonaws.com |
| 유형 | Application Load Balancer |
| Scheme | Internet-facing |
| VPC | loglens-vpc |
| 가용 영역 | ap-northeast-2a, ap-northeast-2c |
| Security Group | loglens-sg-elb |
5.1.2 Listener 구성
HTTP (80)
- 모든 요청을 HTTPS(443) 로 리다이렉트
- 보안 일관성을 유지하기 위한 설정
HTTPS (443) Host 기반 라우팅을 통해 다음과 같이 트래픽을 분기:
| 우선순위 | 조건 | 동작 |
|---|---|---|
| 1 | Host = jenkins_be.loglens.co.kr | jenkins-tg로 전달 |
| 2 | Host = api.loglens.co.kr | spring-green TG로 전달 |
| default | 조건 없음 | spring-green으로 전달 |
API 트래픽과 Jenkins 트래픽을 ALB에서 분리해 안정성과 보안을 높임.
5.2 Target Groups
ALB는 Target Group을 통해 실제 서버로 트래픽을 전달하도록 구성했습니다.
각 Target Group에는 Spring Boot 서버와 Jenkins 서버를 분리 배치하여, Blue/Green 배포 시 GitLab CI/CD가 그룹만 전환하면 되도록 구조를 단순화했습니다.
5.2.1 spring-green (운영 중인 Spring Boot 서버)
| 속성 | 값 |
|---|---|
| 프로토콜 | HTTP |
| 포트 | 8081 |
| Health Check Path | / |
| 상태 | 정상 |
| 용도 | API 트래픽 처리 및 Blue/Green 운영 시 Green 역할 |
역할 요약
- ALB에서 분기된 API 요청을 처리하는 메인 대상 그룹
- GitLab CI/CD가 필요 시 Blue ↔ Green을 자동 전환
- 안정적인 배포와 확장성을 위한 기준 그룹
5.2.2 jenkins-tg (Jenkins 서버)
| 속성 | 값 |
|---|---|
| 프로토콜 | HTTP |
| 포트 | 9000 |
| Health Check Path | / |
| 상태 | 비정상 (403) |
Health Check 403은 Jenkins 기본 설정 때문이며,
ALB 트래픽 전달 자체에는 영향 없음.
(Jenkins는 루트/접근 시 인증 페이지가 403을 반환)
역할 요약
- 관리용 CI/CD 서버 전용 트래픽 처리
- 운영 API와 분리된 독립 라우팅 구조로 구성
5.3 ALB가 Blue/Green 배포를 지원하는 방식
Blue/Green 배포는 GitLab CI/CD가 절차를 수행하지만, 실제 전환은 ALB의 Target Group 구조를 기반으로 이루어지도록 설계했습니다.
ALB는 아래 기능을 통해 배포 방식을 자연스럽게 지원함:
- 두 개 이상의 Target Group을 동시에 유지
- 특정 TG만 트래픽을 받도록 Listener 규칙에서 손쉽게 전환 가능
- Health Check 기반 자동 장애 감지
- 서비스 중단 없이 새 TG로 트래픽 전환 가능
GitLab이 배포를 진행 → ALB Listener가 활성 TG만 바라보도록 수정 → 실제 트래픽 전환이 일어남
6. 스토리지
6.1 S3 버킷
정적 리소스를 안정적으로 배포하기 위해 S3를 CloudFront Origin으로 사용하도록 구성했습니다.
애플리케이션 로그·이미지 저장 목적이 아닌, FE 정적 파일 빌드 결과를 저장하고 전송 성능을 높이기 위해 S3 + CloudFront 조합을 사용했습니다.
6.1.1 aws-loglens-upload
| 속성 | 값 |
|---|---|
| 리전 | ap-northeast-2 |
| 용도 | FE 정적 파일 저장 및 CloudFront 배포 Origin |
7. DNS 및 도메인
7.1 Route53 DNS
외부 사용자와 내부 서버를 각각 안정적으로 분리해 관리하기 위해, Route53에 Public Hosted Zone과 Private Hosted Zone을 구성했습니다.
7.1.1 Public Hosted Zone: loglens.co.kr
| 속성 | 값 |
|---|---|
| Zone ID | Z045790849EH3YUBVMN5U |
| 유형 | Public |
| 레코드 수 | 7개 |
DNS 레코드
| 레코드 이름 | 타입 | 값 / 대상 | 용도 |
|---|---|---|---|
| loglens.co.kr | NS | AWS 기본 네임서버 4개 | 도메인 네임서버 설정 |
| loglens.co.kr | SOA | 기본 SOA 레코드 | 영역 기본 설정 |
| api.loglens.co.kr | A (Alias) | dualstack.loglens-elb-178704670.ap-northeast-2.elb.amazonaws.com | 백엔드 API (ALB 연결) |
| www.loglens.co.kr | A (Alias) | d1wi9dspauicah.cloudfront.net | 프론트엔드 배포 (CloudFront) |
| bastion.loglens.co.kr | A | 43.201.247.77 | Bastion Host 외부 IP |
| jenkins_be.loglens.co.kr | A (Alias) | dualstack.loglens-elb-178704670.ap-northeast-2.elb.amazonaws.com | Jenkins 접근 URL |
| _718f8dbfdfa872b4abd7908bbb99a6e.loglens.co.kr | CNAME | _07d7bd4169d076965066f8…acm-validations.aws | ACM 인증서 검증용 |
사진에 있는 ALIAS, A, CNAME 레코드를 기준으로 모두 반영했습니다.
7.1.2 Private Hosted Zone: home
| 속성 | 값 |
|---|---|
| Zone ID | Z03473653PFFKM5LCMADX |
| 유형 | Private |
| 연결된 VPC | loglens-vpc |
| 레코드 수 | 4개 |
DNS 레코드
| 레코드 이름 | 타입 | 값 | 용도 |
|---|---|---|---|
| home | NS | AWS PrivateZone 기본 네임서버 4개 | 내부 DNS 기본 설정 |
| home | SOA | 기본 SOA 레코드 | 영역 기본 설정 |
| bastion.home | A | 10.0.4.149 | Bastion Host Private IP |
| loglens-server.home | A | 10.0.67.85 | Application Server Private IP |
7.1.3 Route53 구성 이유
- 외부 사용자는 도메인 기반으로 서비스에 접근할 수 있도록 했습니다.
- 내부 서버 간 통신은 Private DNS를 통해 IP 대신 이름 기반으로 연결되도록 구성했습니다.
- ALB·CloudFront와의 연동으로 고가용성과 확장성을 확보했습니다.
- ACM 인증서 검증을 위한 CNAME 레코드를 추가하여 HTTPS 환경을 안정적으로 유지했습니다.
8. CDN 및 SSL
8.1 CloudFront CDN
프론트엔드 정적 파일을 서버에서 분리해 제공하기 위해 CloudFront를 구성했습니다.
React 빌드 파일을 S3에 저장하고, CloudFront를 통해 HTTPS 기반으로 배포하도록 설정했습니다.
8.1.1 loglens-cloudfront
정적 콘텐츠를 안정적으로 제공하기 위해 CloudFront 배포를 생성하고 S3 버킷을 Origin으로 연결했습니다.
| 속성 | 값 |
|---|---|
| Distribution Domain | d1wi9dsp***.cloudfront.net |
| 커스텀 도메인 | www.loglens.co.kr |
| 상태 | Deployed |
| Origin | aws-loglens-upload.s3.ap-northeast-2.amazonaws.com |
8.1.2 Origin 설정
정적 파일을 안전하게 제공하기 위해 S3를 Origin으로 설정하고, CloudFront를 통해서만 접근하도록 Origin Access Control(OAC)을 적용했습니다.
| 속성 | 값 |
|---|---|
| Origin Type | S3 |
| Origin Path | / |
| Origin Access Control | 활성화 |
| Connection Attempts | 3 |
| Connection Timeout | 10초 |
8.1.3 Security 설정
HTTPS 통신을 적용하기 위해 ACM(us-east-1)에서 발급한 와일드카드 인증서를 CloudFront에 연결했습니다.
| 속성 | 값 |
|---|---|
| TLS Certificate | ACM(us-east-1) |
| Certificate ARN | arn:aws:acm:us-east-1:686879300464:certificate/068e6052-*** |
| Covered Domains | *.loglens.co.kr |
| HTTPS Only | 활성화 |
8.1.4 CloudFront 활용 방식
정적 파일을 서버에서 분리하고 성능과 보안을 강화하기 위해 S3에 저장된 React 빌드 파일을 CloudFront를 통해 배포하도록 구성했습니다.
이를 통해 S3 직접 접근을 차단할 수 있었고, 캐싱을 활용해 응답 속도와 비용 효율성을 높였습니다.
8.2 ACM 인증서
서비스 전체에 HTTPS를 적용하기 위해 AWS Certificate Manager에서 와일드카드 인증서를 발급받았습니다.
Route53 DNS 검증을 통해 인증서를 활성화했고, CloudFront와 ALB에 적용해 모든 트래픽을 HTTPS로 처리했습니다.
8.2.1 인증서 정보
| 속성 | 값 |
|---|---|
| 도메인 | *.loglens.co.kr |
| 검증 방법 | DNS 검증(Route53 CNAME) |
| 적용 대상 | CloudFront, ALB |
| 갱신 | 자동 갱신 |