[컴] nodejs 를 사용해서 aws s3 object 를 download 하는 방법

 aws s3에서 file download / s3에서 stream 으로 읽어와서 저장하는 법 / s3를 stream 으로 읽는 법 / s3 저장 / s3 object를 download 하는 방법

nodejs 를 사용해서 aws s3 object 를 download 하는 방법

아래처럼 작성하면 된다. 여기서는 typescript 를 사용했다.

주의할 점은 path(아래 code의 ‘Key’) 를 설정할 때, ‘/’로 시작하지 않는다는 것이다.’/’까지도 key 로 보기 때문에 credential error 가 날 수 있다.

import * as aws from 'aws-sdk';
import * as fs from 'fs';

export class AwsMgr {
  private s3: aws.S3;
  constructor() {
    this.s3 = new aws.S3();
  }
  /**
   * read
   */
  public async read() {

    const param = {
      Bucket: 'my-bucket',
      Key: 'mypath/1/2015/03/26-00' // path to the object you're looking for
    }

    var file = fs.createWriteStream('./testfile.out');
    var readableStream = await this.s3.getObject(param).createReadStream();

    readableStream.pipe(file)


    // for small size file
    //
    // this.s3.getObject(params, (err: any, data: any) => {
    //   if (err) console.error(err);
    //   fs.writeFileSync(filePath, data.Body.toString());
    //   console.log(`${filePath} has been created!`);
    // });
  }

}


function main() {
  const amgr = new AwsMgr()
  amgr.read()
}

main()

Credential 설정

아래처럼 환경변수를 set 해주고 사용하면 된다.(windows 기준)

set AWS_ACCESS_KEY_ID=MYACCESSKEY
set AWS_SECRET_ACCESS_KEY=SECRECTACCESSKEY

aws.config.update

aws.config.update 를 이용하는 방법은 이제 안되는 듯 하다. 아래처럼 시도했는데,

    ...
      public async read() {
        aws.config.update({
          accessKeyId: "MYACCESSKEY",
          secretAccessKey: "SECRECTACCESSKEY",
        })

        const param = {
          Bucket: 'my-bucket',
          Key: 'mypath/1/2015/03/26-00' // path to the object you're looking for
        }

        var file = fs.createWriteStream('./testfile.out');
        var readableStream = await this.s3.getObject(param).createReadStream();

        readableStream.pipe(file)
      }

    }
    ...

아래같은 error message 를 뿜어냈다.

...
'Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1

stream 을 읽는 법

아래처럼 하면 readable 을 읽을 수 있다.

const param = {
  Bucket: 'userhabit-production',
  Key: 'raw/1/2015/03/26-00' // path to the object you're looking for
}

var readableStream = await this.s3.getObject(param).createReadStream();

const chunks: any[] = [];
readableStream.on('readable', () => {
  let chunk;
  while (null !== (chunk = readableStream.read())) {
    console.log(chunk)
    chunks.push(chunk);
  }
});
readableStream.on('end', () => {
  const content = chunks.join('');
});

References

  1. Loading credentials in Node.js from the shared credentials file - AWS SDK for JavaScript
  2. node.js - How to create a read stream of a AWS S3 object in a async function? - Stack Overflow

댓글 없음:

댓글 쓰기