Node js

Node.js 스트림을 사용해서 효율적으로 S3 에 파일 업로드 하기

secretjuju 2024. 6. 4. 22:52

목표

Node.js 는 스트림을 굉장히 쉽게 사용할 수 있게 되어있다.

나는 다음상황에 어떻게 하면 메모리 사용을 최소로 하여 문제를 해결할 수 있을까 고민했고, 예제 코드를 만들어 보았다.

 

상황.

  1. 크롤링을 통해 다운받은 이미지를 압축하여 S3 에 업로드 해야하는 상황
  2. 이미지파일을 메모리에 불러와 압축하고, 압축된 파일을 메모리에 올린채로 S3 에 업로드 할 시 메모리 사용률이 클 것
  3. 한개의 인스턴스에서 병렬적으로 처리해야하고, 이는 메모리 부족을 야기할 수 있음.

 

코드

 

코드 설명

  1. 크롤링을 통해 수집한 파일들은 images/targets 안에 모여있음.
  2. archiver('zip', { zlib: { level: 9 } });
    1. 압축 대상을 zip 포맷으로, 최대한의 압축률로 압축 (level: 9)
    2. archiver 는 파일을 스트림으로 읽어 청크단위로 압축하고, 압축 스트림을 생성
  3. pipeline(archive, passThrough)
    1. passThrough 는 데이터를 변경 없이 다른 스트림으로 중계하는 역할.
    2. archive.finalize().then(() => { passThrough.end() })
      1. 압축이 끝나면 스트림을 종료하여 추가 입력을 방지
  4. Body: passThrough
    1. PubObjectCommandInput 타입의 Body 엔 Readable 스트림을 입할 수 있음
  5. const uploader = new Upload()
    1. aws-sdk v3 부터 파일 크기가 명확하지 않은 스트림을 통한 업로드는 @aws-sdk/lib-storage 를 이용해야 한다고 합니다.
      1. stack overflow
      2. 경험한 에러 메시지
        1. Are you using a Stream of unknown length as the Body of a PutObject request? Consider using Upload instead from @aws-sdk/lib-storage. nodejs

 

실행 결과

 

 

 

압축된 파일이 잘 업로드 되어있는것을 확인할 수 있다.