Node.js용 AWS S3 파일 다운로드 모듈 "minio" 사용하여 2기가 이상의 파일 처리

2017. 8. 29. 17:01서버 프로그래밍

AWS에서 공식으로 제공한 node.js용 모듈인 "aws-sdk"를 이용하여 S3 파일 다운로드를 구현하면, 현재 어느 정도 파일을 다운로드 했는지를 알지 못하는 불편함이 있고 대용량 파일 (2기가 이상)을 다운로드할 경우에는 정상 동작하지 않는 문제가 있다. 


예전에 본적이 있는 minio라는 모듈에서 제공하는 getObject 메소드는 스트림 방식으로 이벤트 처리가 가능하도록 되어 있어서 다운로드 진행률 처리나 대용량 파일 다운로드 처리 등이 가능하다.

https://stackoverflow.com/questions/36942442/how-to-get-response-from-s3-getobject-in-node-js

var Minio = require('minio')

var s3Client = new Minio({
  endPoint: 's3.amazonaws.com',
  accessKey: 'YOUR-ACCESSKEYID',
  secretKey: 'YOUR-SECRETACCESSKEY'
})

var size = 0
// Get a full object.
s3Client.getObject('my-bucketname', 'my-objectname', function(e, dataStream) {
  if (e) {
    return console.log(e)
  }
  dataStream.on('data', function(chunk) {
    size += chunk.length
  })
  dataStream.on('end', function() {
    console.log("End. Total size = " + size)
  })
  dataStream.on('error', function(e) {
    console.log(e)
  })
})


스택오버플로우에 포스팅 된 방법은 구버전이고, 최신 버전은 아래 레퍼런스를 참고하면 된다.

https://docs.minio.io/docs/javascript-client-api-reference

var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', secretKey: 'YOUR-SECRETACCESSKEY' })

var size = 0 minioClient.getObject('mybucket', 'photo.jpg', function(err, dataStream) { if (err) { return console.log(err) } dataStream.on('data', function(chunk) { size += chunk.length }) dataStream.on('end', function() { console.log('End. Total size = ' + size) }) dataStream.on('error', function(err) { console.log(err) }) })

data 이벤트 발생 시에 전달되는 chunk는 Buffer 객체이다.

Node.js의 Buffer 클래스 사용 방법은 다음을 참고하면 된다.

http://www.w3resource.com/node.js/nodejs-buffer.php

* 주의할 점은 Node.js의 Buffer 클래스는 최대 2기가 사이즈까지만 초기화가 가능하다. 2기가가 넘는 파일을 처리할 때, 버퍼 사이즈를 2기가로 잡고 계속 copy하면 처리는 되는데 이것이 맞는지는 모르겠다.