Node js
Node.js 스트림을 사용해서 효율적으로 S3 에 파일 업로드 하기
secretjuju
2024. 6. 4. 22:52
목표
Node.js 는 스트림을 굉장히 쉽게 사용할 수 있게 되어있다.
나는 다음상황에 어떻게 하면 메모리 사용을 최소로 하여 문제를 해결할 수 있을까 고민했고, 예제 코드를 만들어 보았다.
상황.
- 크롤링을 통해 다운받은 이미지를 압축하여 S3 에 업로드 해야하는 상황
- 이미지파일을 메모리에 불러와 압축하고, 압축된 파일을 메모리에 올린채로 S3 에 업로드 할 시 메모리 사용률이 클 것
- 한개의 인스턴스에서 병렬적으로 처리해야하고, 이는 메모리 부족을 야기할 수 있음.
코드
코드 설명
- 크롤링을 통해 수집한 파일들은 images/targets 안에 모여있음.
- archiver('zip', { zlib: { level: 9 } });
- 압축 대상을 zip 포맷으로, 최대한의 압축률로 압축 (level: 9)
- archiver 는 파일을 스트림으로 읽어 청크단위로 압축하고, 압축 스트림을 생성
- pipeline(archive, passThrough)
- passThrough 는 데이터를 변경 없이 다른 스트림으로 중계하는 역할.
- archive.finalize().then(() => { passThrough.end() })
- 압축이 끝나면 스트림을 종료하여 추가 입력을 방지
- Body: passThrough
- PubObjectCommandInput 타입의 Body 엔 Readable 스트림을 입할 수 있음
- const uploader = new Upload()
- aws-sdk v3 부터 파일 크기가 명확하지 않은 스트림을 통한 업로드는 @aws-sdk/lib-storage 를 이용해야 한다고 합니다.
- stack overflow
- 경험한 에러 메시지
- 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
- aws-sdk v3 부터 파일 크기가 명확하지 않은 스트림을 통한 업로드는 @aws-sdk/lib-storage 를 이용해야 한다고 합니다.
실행 결과
압축된 파일이 잘 업로드 되어있는것을 확인할 수 있다.