개인의 기록
  • 소개
  • 프로젝트
  • 글
  • 링크

© 2026 newgirok

← YouTube Shorts 자동화

Lambda 안정화 — 배포와 자막 싱크 보정

2026년 7월 15일
LambdaPrismasubtitle-workerCI/CD

Lambda로 옮긴 워커들을 실제로 배포하고 나서야 보이는 문제들이 있었다.

render-worker — aws-lambda-ric 경로 변경 대응

aws-lambda-ric 버전을 올렸더니 배포한 컨테이너가 뜨질 않았다. 원인은 단순했다. 패키지 내부 bin 경로가 바뀌었는데 Dockerfile은 예전 경로를 그대로 참조하고 있었다.

# 이전
ENTRYPOINT ["node", "/usr/local/lib/node_modules/aws-lambda-ric/bin/index.js"]

# 변경
ENTRYPOINT ["/usr/local/bin/aws-lambda-ric"]

버전업 때마다 매번 경로를 확인하기보다, symlink가 걸려 있는 안정적인 바이너리 경로로 고정하는 쪽을 택했다.

Lambda 워커 — Prisma 네이티브 바이너리 CI/CD 복사

Lambda 환경에서 Prisma가 rhel-openssl-3.0.x 네이티브 엔진을 못 찾아서 죽는 문제가 있었다. pnpm install은 로컬 캐시에 바이너리를 받아두는데, 워커 배포 디렉토리엔 그게 없었다.

# .github/workflows/deploy-workers.yml
- name: Copy Prisma binary to worker directory
  run: |
    PRISMA_BIN=$(find node_modules/.pnpm -name "libquery_engine-rhel-openssl-3.0.x.so.node" | head -1)
    cp "$PRISMA_BIN" "apps/workers/${{ matrix.worker }}/"

배포 워크플로우에서 pnpm 캐시를 뒤져서 해당 워커 디렉토리로 복사하는 스텝을 추가했다. 이 바이너리는 Git에 올릴 필요가 없어서 .gitignore에도 패턴을 추가했다.

subtitle-worker — fallback 자막 브레이크 갭 반영

buildSrt는 VTT 파싱이 실패했을 때 문자 수 비례로 타이밍을 계산하는 fallback 함수다. 근데 실제 음성이랑 비교해보니 자막이 계속 밀렸다.

원인은 tts-worker가 문장 사이에 1초 브레이크를 삽입하는데, fallback 로직은 그걸 전혀 모르고 전체 시간을 문자 수로만 나눴기 때문이다.

// 이전: 전체 길이를 청크별 문자 비례로만 배분
function buildSrt(script: string, totalMs: number, startOffsetMs = 0): string {
  const chunks = script.split(/(?<=[^0-9])\.\s+|[?!]\s+|—+\s*/)...
  // 브레이크 개념 없음
}

// 변경: 문장 사이 BREAK_MS(1000ms)를 커서에 명시적으로 더함
function buildSrt(script: string, effectiveMs: number, startOffsetMs = 0): string {
  const BREAK_MS = 1000;
  const sentences = script
    .split(/(?<=[.!?])\s+(?=[가-힣A-Z])/)
    .map((s) => s.trim())
    .filter(Boolean);

  let absoluteCursor = startOffsetMs;
  for (let si = 0; si < sentences.length; si++) {
    // ... 문장별 시간 배분 및 청크 타임스탬프 계산 ...
    absoluteCursor += sentMs;
    if (!isLastSentence) absoluteCursor += BREAK_MS;
  }
}

totalMs를 effectiveMs(브레이크 제외 순수 발화 시간)로 이름부터 바꿨다. 문장을 먼저 나눠서 각각 시간을 배분하고, 문장이 끝날 때마다 커서에 브레이크 갭을 더하는 구조로 바꾸니 fallback 자막도 실제 음성 타이밍과 맞아떨어졌다.

← 이전 글도메인 전환 — DB 스키마 정리
다음 글 →스케줄러 전환 — EventBridge와 CloudWatch 모니터링