Amazon Web Services

Nodejs를 위한 S3 SDK

본 수업에서는 nodejs를 이용해서 s3를 제어하는 방법을 알아봅니다. 특히 후반부에서는 웹애플리케이션에서 s3를 어떻게 활용할 수 있는가를 다루고 있습니다. 

선수학습

Nodejs를 위한 AWS SDK 수업을 먼저 들어야 합니다. 

권한

본 수업을 진행하기 위해서는 사용자나 역할이 AmazonS3FullAccess 권한이 있어야 합니다. iam을 이용해주세요.

API 사용법

업로드

s3_put.js

var AWS = require('aws-sdk');
var fs = require('fs');
AWS.config.region = 'ap-northeast-2';
var s3 = new AWS.S3();
var param = {
    'Bucket':'codingeverybody2',
    'Key':'logo.png',
    'ACL':'public-read',
    'Body':fs.createReadStream('94.png'),
    'ContentType':'image/png'
}
s3.upload(param, function(err, data){
    console.log(err);
    console.log(data);
})

nodejs stream에 대한 좀 더 자세한 내용은 Nanha Park님의 Stream 시리즈를 보실 것을 권합니다. 

  1. http://nodeqa.com/nodejs_ref/22
  2. http://nodeqa.com/nodejs_ref/23
  3. http://nodeqa.com/nodejs_ref/27

목록

s3_list.js

var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-2';
var s3 = new AWS.S3();
s3.listObjects({Bucket: 'codingeverybody2'}).on('success', function handlePage(response) {
    for(var name in response.data.Contents){
        console.log(response.data.Contents[name].Key);
    }
    if (response.hasNextPage()) {
        response.nextPage().on('success', handlePage).send();
    }
}).send();

다운로드

s3_get.js

var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-2';
var s3 = new AWS.S3();
var file = require('fs').createWriteStream('logo.png');
var params = {Bucket:'codingeverybody2', Key:'logo.png'};
s3.getObject(params).createReadStream().pipe(file);

nodejs 웹에플리케이션에서 s3 SDK 활용

s3_app.js

var express = require('express');
var formidable = require('formidable');
var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-2';
var app = express();
app.get('/s3', function(req, res){
    console.log(1);
    res.send('Hello s3');
});
app.get('/form', function(req, res){
    var output = `
<html>
<body>
    <form enctype="multipart/form-data" method="post" action="upload_receiver">
        <input type="file" name="userfile">
        <input type="submit">
    </form>
</body>
</html>
    `;
    res.send(output);
});
app.post('/upload_receiver', function(req, res){
   var form = new formidable.IncomingForm();
   form.parse(req, function(err, fields, files){
       var s3 = new AWS.S3();
       var params = {
            Bucket:'codingeverybody2',
            Key:files.userfile.name,
            ACL:'public-read',
            Body: require('fs').createReadStream(files.userfile.path)
       }
       s3.upload(params, function(err, data){
            var result='';
            if(err)
                result = 'Fail';
            else
                result = `<img src="${data.Location}">`;
            res.send(`<html><body>${result}</body></html>`);
       });
   });
});
app.use(function(err, req, res, next) {
      console.error(err.stack);
        res.status(500).send('Something broke!');
});
app.listen(80, function(){
    console.log('Connected');
})

 

댓글

댓글 본문
  1. 당당
    2023.06.26
  2. labis98
    20220130 좋은 강의 감사합니다.
  3. 이한성
    감사합니다.!!
  4. Woori
    감사합니다
  5. 게케게케
    와 길다.. 감사합니다
  6. 김태준
    s3의 bucket안에 있는 파일 리스트를 웹에 받아와서 출력해주는 것까지는 완성됬습니다. 여기서 그 파일을 누르면 다운로드 될 수 있게 만드려고 하는데 aws홈페이지에서는 bucket안에 있는 파일을 url로 다운 받을 수 있게 url이 제공 되어있는데 ListObject안에 있는 Callback 함수의 인자인 Data에 속성을 보니 다운받을수 있는 url정보가 출력되지 않습니다... 혹시 다운받을 수 있는 url 정보는 어디서 볼 수 있는건가요??
  7. Choong
    multer라는 라이브러리의 memory_storage를 사용하시면 버퍼 형태로 파일을 받을 수 있습니다.
    file_storage / memory_storage 두가지 형태로 사용하실 수 있습니다.
    다만.. 요청이 많이 들어와서 동시에 업로드를 많이 진행하신다면, 메모리가 full이 될 가능성이 있습니다.
  8. TravelDreammer
    왜 저는 근데 name과 path를 없는 property값으로 할까요ㅠㅠ 똑같이 복사 붙여넣기 해도 그러네요 ㅜㅜ

    휴...자문자답으로 오타였고 새로고침을 안하고 뒤로가기만했엇네요;;;
  9. 삭제처리코드는 따로 처리하셔야할 것 같네요~ 저도 multiparty로 하는데~ formidable이랑 똑같이 기본 경로를 따로 설정하지 않으니 os.tempdir() 경로에 받은 이미지가 그대로 존재하는데~ s3 업로드 성공 콜백 펑션에다가 temp 디렉토리에 있는 파일 삭제를 하는 코드를 넣었습니다~. (https://www.npmjs.com......ble 참조). multiparty같은 경우에는 file 객체에 path라는 프로퍼티가 있습니다. 이 프로퍼티가 현재 로컬에 있는 파일의 경로를 반환하는데~ 이것을 이용해서 파일삭제처리까지 합니다.

    s3.upload(param, function(err, data){
    require('fs').unlink(file.path);
    res.send('http://'+ data.Bucket +'/'+ file.originalFilename);
    });



    그나저나 파일 받으면 로컬에다가 깔아주는거 말고 바이트형태로 리턴해주는 모듈같은건 없으려나요?
    대화보기
    • 라이칸
      업로드를 위해 formidable 로 저장된 임시파일은 s3 서버에 올린 후 삭제 처리는 하지 않나요?
    버전 관리
    egoing
    현재 버전
    선택 버전
    graphittie 자세히 보기