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('');
});
댓글 없음:
댓글 쓰기