비디오 크리에이티브는 데이터 집약적인 워크플로우입니다. 하나의 Adstacker 프로젝트는 원본 클립, 썸네일, 정규화된 비디오, 추출된 오디오, 재사용 가능한 오버레이, 그리고 최종 버전을 포함할 수 있습니다. 우리는 애플리케이션 서버에 과부하를 주지 않는 업로드, 신뢰할 수 있는 유효성 검사, 예측 가능한 출력 위치, 그리고 중단된 작업에 대한 정리가 필요합니다.
Amazon S3는 이 워크플로우의 영구적인 자산 계층입니다. Adstacker는 이를 사용하여 대용량 파일을 제작자로부터 스토리지로 직접 이동시키고, 프로젝트의 각 단계를 구성하며, 완성된 비디오를 다운로드할 수 있도록 합니다.
과제: 비디오 자산이 빠르게 증가합니다
크리에이티브 테스트를 통해 소수의 클립으로 많은 변형을 만들 수 있으며, 이는 자산 관리 문제를 야기합니다. 프로젝트는 훅, 본문, CTA 푸티지로 시작하여 정규화된 사본, 오디오, 캡션 오버레이, 썸네일, 그리고 최종 MP4 또는 MOV 결과물을 생성할 수 있습니다.
모든 바이트를 API를 통해 이동하면 업로드가 느려지고 서버 대역폭을 소비하게 됩니다. 느슨한 파일명은 재시도를 어렵게 하고, 제작자가 업로드 도중 탭을 닫으면 고아 자산(orphaned assets)을 남기게 됩니다.
스토리지는 프로덕션 파이프라인의 의도적인 부분이 되어야 합니다.
우리의 접근 방식: 자산 수명 주기 전체에 걸친 S3 활용
S3는 프로젝트 생성부터 최종 다운로드까지 관여합니다. 백엔드는 권한 부여, 매니페스트, 유효성 검사, 작업 상태를 처리하며; S3는 대용량 객체를 처리합니다.
아키텍처

이러한 분할은 미디어 파일에 스토리지로의 직접적이고 영구적인 경로를 제공합니다.
1. 브라우저에서 대용량 비디오를 직접 업로드
제작자가 프로젝트를 시작하면 Adstacker는 원본 비디오 매니페스트를 생성하고 각 파일에 대한 presigned S3 POST를 반환합니다. 브라우저는 파일을 백엔드를 통해 프록시하지 않고 S3로 직접 보냅니다.
S3는 서명된 업로드 제약 조건을 적용합니다: 고정된 콘텐츠 유형과 허용된 크기 범위. 이러한 제약은 비어 있거나 과도하게 큰 업로드를 도착 전에 차단하며, 단기 요청은 브라우저가 업로드할 수 있는 것을 제한합니다.
세션이 중단되면 Adstacker는 대기 중인 비디오에 대해 새로운 URL을 재발급합니다. 또한 재개 시 S3를 확인하여 완료 콜백을 놓친 객체도 여전히 조정 및 유효성 검사를 받을 수 있도록 합니다.
2. 처리 전에 도착한 내용 확인
브라우저에서 업로드가 완료되는 것만으로는 렌더링을 시작하기에 충분하지 않습니다. 백엔드는 S3 HEAD를 사용하여 객체를 확인하고, 크기와 ETag를 읽고, 해당 ETag를 유효성 검사를 거친 비디오와 함께 저장합니다.
다음으로, Adstacker는 FFprobe 유효성 검사를 위해 객체를 임시로 다운로드합니다. 우리는 객체가 읽기 가능하며 지속 시간과 유효 해상도가 프로젝트 요구 사항을 충족하는지 확인합니다. 유효하지 않은 파일은 유용한 거부 사유를 받고 삭제됩니다; 일시적인 읽기 실패는 재시도를 위해 객체를 그대로 둡니다.
각 비디오는 대기 중, 업로드 중, 업로드됨, 유효성 검사 중, 유효성 검사 완료, 또는 거부됨이라는 명확한 수명 주기를 거칩니다. 프로젝트는 예상되는 모든 자산이 유효성 검사를 거친 후에만 진행되며, 원자적 업데이트는 중복 콜백이 비디오를 이중으로 계산하는 것을 방지합니다.
3. 모든 출력을 예측 가능하고 재사용 가능하게 만들기
Adstacker는 프로젝트, 자산 유형, 카테고리 및 변형에 기반한 결정론적 S3 경로를 사용합니다. 정규화된 미디어와 추출된 오디오는 렌더링된 오버레이 및 최종 조합과 별도로 존재합니다.
이러한 구성은 파이프라인에 세 가지 방식으로 도움이 됩니다:
- 직접 조회: 작업자는 프로젝트 및 변형과 관련된 정확한 입력 또는 출력을 찾을 수 있습니다.
- 효율적인 재사용: 재사용 가능한 오버레이는 한 번 저장되며 하나 이상의 최종 조합을 지원할 수 있습니다.
- 멱등성 재시도: 재시도는 동일하게 예상되는 키에 작성하여 중복 내보내기의 증가하는 흔적을 방지합니다.
최종 비디오 레코드는 출력, 썸네일, 그리고 관련 시 MOV 변형에 대한 S3 키와 URL을 유지합니다. 애플리케이션은 준비된 형식을 제공할 수 있습니다.
4. 안전하게 액세스 제공 및 미완성 작업 정리
S3 버킷은 비공개입니다. Adstacker는 선택적으로 다운로드 파일명을 포함한 시간 제한 서명된 다운로드 URL을 발행하므로 자산을 공개적으로 노출할 필요가 없습니다.
모든 업로드가 완성된 프로젝트가 되는 것은 아닙니다. 예정된 정리는 오래된 미완성 프로젝트를 식별하고 남아있는 S3 원본 객체를 삭제합니다. 거부된 업로드는 유효성 검사 실패 직후 삭제됩니다.
이러한 수명 주기 규칙은 프로젝트 기록을 보존하면서도 방치된 스토리지를 제한합니다.
실제 사례: 중단된 업로드가 처음부터 다시 시작하는 것을 의미하지는 않습니다
마케터가 클립 6개를 업로드하고, 4개가 S3에 도달한 후 브라우저를 닫는다고 상상해 보세요. 돌아왔을 때 Adstacker는 업로드 세션을 복원하고 미완성 클립에 대한 새로운 presigned 요청을 제공합니다. 또한 완료 콜백이 손실된 경우에도 파일이 S3에 도달했는지 확인합니다.
여섯 개의 파일이 모두 확인되고 유효성 검사를 거치면 프로젝트는 처리 단계로 넘어갑니다. 원본, 준비된 미디어, 오버레이, 썸네일, 최종 변형은 모든 후속 단계를 위해 알려진 키 아래에 정리된 상태로 유지됩니다.
크리에이티브 속도를 위해 설계된 스토리지
Amazon S3는 Adstacker가 비디오 자산을 관리되는 수명 주기처럼 처리하도록 합니다: 직접 업로드, 객체 확인, 미디어 유효성 검사, 예측 가능한 출력 생성, 다운로드 승인, 그리고 미완성 작업 정리. 이는 크리에이티브 파이프라인이 클립을 테스트 가능한 변형으로 전환하는 데 집중할 수 있도록 합니다.
자산을 Adstacker에 업로드하고, 테스트하고 싶은 조합을 구축한 다음, 플랫폼이 모든 렌더링 뒤의 스토리지 워크플로우를 관리하도록 하세요.
기술 스택: Amazon S3 · AWS SDK for JavaScript · Presigned S3 POSTs · NestJS · FFprobe · AWS ECS Fargate · MongoDB

