새 컨테이너를 띄우고 이전 컨테이너를 내리는 배포를 미디어 서버에도 그대로 적용할 수 있을까요. PokeClip의 미디어 서버에는 OBS와 연결된 UDP 세션, 진행 중인 녹화, 아직 업로드하지 않은 로컬 파일이 남습니다. 프로세스 밖의 DB만 읽어서 이 상태를 모두 복원할 수는 없었습니다.
저는 전체 배치를 정하면서 코어 API와 미디어를 같은 교체 단위로 묶지 않기로 했습니다. 3인 팀이 감당할 관리 범위와 방송 중 교체의 영향, DB 복구 책임을 따로 비교했습니다. 그 결과 교체하기 쉬운 코어는 컨테이너 배포를 목표로 두고, 진행 중인 상태를 가진 미디어는 별도 EC2로 다루는 방향을 선택했습니다.
프로세스가 사라질 때 잃는 상태부터 나눴습니다
코어 API도 상태를 다룹니다. 다만 업무 상태를 외부 DB에 두고 실행 프로세스와 분리하면 교체 후 다시 읽을 수 있습니다. 미디어는 외부 저장소에 아직 도착하지 않은 버퍼와 녹화 중인 파일까지 보유하므로 같은 방식으로 종료할 수 없었습니다.
| 영역 | 상태가 남는 자리 | 배치·교체 판단 |
|---|---|---|
| 코어 API·큐 기반 작업자 | DB와 작업 상태 | 컨테이너 단위 배포를 목표로 설계 |
| 미디어 | UDP 연결·버퍼·진행 중 녹화·로컬 파일 | EC2 단위로 별도 취급; drain 또는 명시적 중단 필요 |
| 데이터베이스 | 계정·클립·미디어 상태 | RDS로 백업·패치 등 관리 부담 일부 위임 |
이 선택에서 EC2 자체가 안전을 보장하는 것은 아닙니다. 미디어를 교체하려면 새 연결을 받지 않은 채 진행 중 방송과 파일 처리를 비울지, 명시적으로 중단할지 결정해야 합니다. 실행 환경을 나눈 이유는 이 종료 절차를 API 배포에 묻어 두지 않기 위해서였습니다. 자동 drain이나 무중단 교체를 모두 구현했다는 상태는 아닙니다.
클러스터보다 미디어 경로를 먼저 검증하기로 했습니다
EKS는 배치와 확장 선택지를 넓히지만 클러스터를 관리할 일이 추가됩니다. 당시 팀이 먼저 확인해야 할 것은 미디어 입력·저장·편집 경로였습니다. 반대로 코어까지 전부 EC2에 수동 배치하면 각 서버의 배포와 복구를 직접 관리해야 합니다. 코어의 컨테이너 배포와 미디어의 별도 EC2 처리는 이 두 부담 사이에서 고른 구성입니다.
DB는 RDS를 선택해 미디어와 데이터베이스 양쪽의 백업·패치 운영을 동시에 떠안지 않도록 했습니다. 애플리케이션은 DSN으로 연결하고, 로컬 Compose와 원격 PostgreSQL의 메이저 버전을 맞추는 조건을 뒀습니다. 데이터 모델과 마이그레이션, 복구 검증은 애플리케이션 쪽에 남습니다. RDS의 관리 범위와 직접 확인할 범위를 나누어 봐야 했습니다.
연결 성공 다음에 녹화 파일과 S3 객체를 확인했습니다
네트워크 스파이크에서는 외부 SRT 입력이 NLB를 거쳐 프라이빗 EC2에 도달하고, 녹화 산출물이 생성된 뒤 S3 Endpoint를 통해 저장되는 흐름을 확인했습니다. 서버 관리 접근은 SSM으로 구분했습니다. 개발 서버의 EIP·Route 53을 포함한 구성은 고정 커밋의 dev-media 문서에 남겼습니다.
OBS에 연결됨이 표시돼도 파일 생성이나 업로드가 실패할 수 있습니다. 그래서 수신 로그, 로컬 녹화 파일, S3 객체를 단계별로 확인했습니다. 방송이 끝난 시점과 파일 업로드가 끝난 시점도 다를 수 있으므로, 인스턴스를 내려도 되는 조건은 연결뿐 아니라 파일 처리 상태와 함께 검토해야 했습니다.
초기 그림의 public EC2 직접 수신과 고정 서비스 수는 후속 분리·NLB 판단으로 바뀌었습니다. 저비용 개발 환경과 목표 배치도 같지 않습니다. 이 실증은 당시 입력·저장 경로가 연결됐다는 근거이며, 이후 실험 자원의 유지 여부나 고가용성 구성의 운영 완료를 보여 주지는 않습니다. 자동 장애 전환 시간과 가용성 개선율은 측정하지 않았습니다.
배포 구조를 나누고 나니 다음 검토 대상도 분명해졌습니다. 코어는 외부 상태를 이용해 교체할 수 있는지, 미디어는 종료 전에 어떤 상태를 보존하거나 마쳐야 하는지 확인해야 합니다. 컨테이너를 만들었다는 사실보다 프로세스가 사라질 때 잃는 것을 먼저 적은 것이 이 배치 결정의 기준이었습니다.