작업 배경
탈잉에서 진행한 누구나VOD 프로젝트에서는 말 그대로 누구나 VOD(콘텐츠 영상)를 등록할 수 있어야 했습니다. 튜터가 동영상을 등록하면 수강생은 웹의 미디어 플레이어로 이를 시청합니다.
이 과정이 진행되려면 카테노이드 사의 콜러스라는 외부 시스템을 사용해야 합니다.
즉, 탈잉 웹에서 동영상을 업로드할 때 콜러스 측 미디어 서버에도 영상을 업로드 해야 하며, 업로드된 영상을 플레이어에서 재생할 수 있도록 미디어 식별값(Key)을 받아오는 작업이 필요했습니다.
구상
- S3로 1차 업로드
- 콜러스 업로드 실패 시 재시도와 같은 기능도 필요했고, 콜러스 업로드 시점이 튜터가 등록하는 시점이 아닌 수업에 대한 심사가 완료되는 시점으로 변경될 여지가 있었기에 원본 영상을 우리의 저장소에 보관할 필요가 있었습니다.
- S3 presignedURL 사용
- 파일 업로드 시 클라이언트 - 서버 점유를 조금이라도 줄이기 위해 S3로 직접 업로드 하는 방식을 채택했습니다.
- 람다 사용
- S3 업로드와 콜러스 업로드는 실행 시점이 변경될 여지가 있었기에 느슨하게 연결되어야겠다는 생각이 들었습니다. 그래서 S3 업로드 완료 시 이벤트를 발생시키는 방향으로 설계하게 되었습니다.
설계 결과
1차 업로드: 클라이언트 → S3
2차 업로드: S3 → 람다 → 내부 API → 외부 API → 내부 API
시퀀스 다이어그램


진행 순서
-
클라이언트에서 동영상 업로드 요청 시 서버는 S3 버킷에 파일을 직접 업로드할 수 있는 S3 presignedURL을 제공한다.
-
S3 presingedURL을 통해 클라이언트에서 S3 버킷으로 동영상 파일을 업로드한다.
-
S3에 파일이 업로드되면 putObject 트리거에 의해 람다 함수가 실행된다.
-
람다 함수는 탈잉웹 서버의 콜러스 미디어 업로드 API를 비동기로 호출하고 끝난다.
-
람다 함수에 의해 실행된 API는 S3에 업로드된 파일을 내려받아 콜러스 미디어 서버로 업로드를 진행한다. 업로드가 완료(또는 실패)되면 업로드 결과에 대한 응답을 받아 저장한다.
-
콜러스 서버에 영상이 업로드되면 자체적으로 트랜스코딩을 진행한다. 트랜스 코딩이 완료되면 콜러스 측에서 콜백으로 탈잉웹 서버 API를 호출한다.
-
호출된 탈잉웹 API는 트랜스코딩 결과에 맞게 미디어 업로드 상태를 갱신하고, 미디어키를 저장한다.
설계를 통해 구현한 API 리스트
- S3 presignedUrl 생성/반환
- S3 업로드 완료 후 람다에서 실행
- 파일의 메타 정보 저장
- 파일의 등록 상태 변경
- 콜러스 업로드 URL 요청 호출
- S3로부터 파일 다운로드
- 다운로드한 파일을 콜러스로 업로드 진행
- 업로드 결과 확인하여 파일 등록 상태 다시 한 번 변경
- 콜러스 트랜스코딩 완료 후 콜백
- 콜러스 채널에 컨텐츠 추가 완료 후 콜백
배운 점
- S3 업로드 이벤트를 이용해서 람다 함수를 실행하는 방법
- 람다 함수는 15분 실행 시간 제한이 있어 비동기로 서버측 API 호출하고 종료하는 방법에 대해 고민한 것
아쉬운 점
- 외부 API를 제공하는 서버의 장애가 있을 경우 후처리를 위해 큐를 도입하고 싶었으나 구현하지 못한 것
- S3 업로드에는 실패에 대한 응답이 없으므로 이에 대한 상태값 갱신 처리 작업을 보완해줘야 한다는 것