미디어 업로드, 재생을 위한 외부 API 연계 작업

Timo·2022년 7월 28일
1

작업 배경

탈잉에서 진행한 누구나VOD 프로젝트에서는 말 그대로 누구나 VOD(콘텐츠 영상)를 등록할 수 있어야 했습니다. 튜터가 동영상을 등록하면 수강생은 웹의 미디어 플레이어로 이를 시청합니다.
이 과정이 진행되려면 카테노이드 사의 콜러스라는 외부 시스템을 사용해야 합니다.

즉, 탈잉 웹에서 동영상을 업로드할 때 콜러스 측 미디어 서버에도 영상을 업로드 해야 하며, 업로드된 영상을 플레이어에서 재생할 수 있도록 미디어 식별값(Key)을 받아오는 작업이 필요했습니다.

구상

  1. S3로 1차 업로드
    • 콜러스 업로드 실패 시 재시도와 같은 기능도 필요했고, 콜러스 업로드 시점이 튜터가 등록하는 시점이 아닌 수업에 대한 심사가 완료되는 시점으로 변경될 여지가 있었기에 원본 영상을 우리의 저장소에 보관할 필요가 있었습니다.
  2. S3 presignedURL 사용
    • 파일 업로드 시 클라이언트 - 서버 점유를 조금이라도 줄이기 위해 S3로 직접 업로드 하는 방식을 채택했습니다.
  3. 람다 사용
    • S3 업로드와 콜러스 업로드는 실행 시점이 변경될 여지가 있었기에 느슨하게 연결되어야겠다는 생각이 들었습니다. 그래서 S3 업로드 완료 시 이벤트를 발생시키는 방향으로 설계하게 되었습니다.

설계 결과

1차 업로드: 클라이언트 → S3
2차 업로드: S3 → 람다 → 내부 API → 외부 API → 내부 API

시퀀스 다이어그램

진행 순서

  1. 클라이언트에서 동영상 업로드 요청 시 서버는 S3 버킷에 파일을 직접 업로드할 수 있는 S3 presignedURL을 제공한다.

  2. S3 presingedURL을 통해 클라이언트에서 S3 버킷으로 동영상 파일을 업로드한다.

  3. S3에 파일이 업로드되면 putObject 트리거에 의해 람다 함수가 실행된다.

  4. 람다 함수는 탈잉웹 서버의 콜러스 미디어 업로드 API를 비동기로 호출하고 끝난다.

  5. 람다 함수에 의해 실행된 API는 S3에 업로드된 파일을 내려받아 콜러스 미디어 서버로 업로드를 진행한다. 업로드가 완료(또는 실패)되면 업로드 결과에 대한 응답을 받아 저장한다.

  6. 콜러스 서버에 영상이 업로드되면 자체적으로 트랜스코딩을 진행한다. 트랜스 코딩이 완료되면 콜러스 측에서 콜백으로 탈잉웹 서버 API를 호출한다.

  7. 호출된 탈잉웹 API는 트랜스코딩 결과에 맞게 미디어 업로드 상태를 갱신하고, 미디어키를 저장한다.

설계를 통해 구현한 API 리스트

  • S3 presignedUrl 생성/반환
  • S3 업로드 완료 후 람다에서 실행
    • 파일의 메타 정보 저장
    • 파일의 등록 상태 변경
    • 콜러스 업로드 URL 요청 호출
    • S3로부터 파일 다운로드
    • 다운로드한 파일을 콜러스로 업로드 진행
    • 업로드 결과 확인하여 파일 등록 상태 다시 한 번 변경
  • 콜러스 트랜스코딩 완료 후 콜백
  • 콜러스 채널에 컨텐츠 추가 완료 후 콜백

배운 점

  • S3 업로드 이벤트를 이용해서 람다 함수를 실행하는 방법
  • 람다 함수는 15분 실행 시간 제한이 있어 비동기로 서버측 API 호출하고 종료하는 방법에 대해 고민한 것

아쉬운 점

  • 외부 API를 제공하는 서버의 장애가 있을 경우 후처리를 위해 큐를 도입하고 싶었으나 구현하지 못한 것
  • S3 업로드에는 실패에 대한 응답이 없으므로 이에 대한 상태값 갱신 처리 작업을 보완해줘야 한다는 것
profile
나는 매일 성장하는 사람

0개의 댓글