AWS - S3

생활코딩
AWS의 파일서버 서비스인 S3(Simple Storage Service)

S3 콘솔을 통한 기본 조작방법

  • 콘솔에서 S3의 파일업로드하는 법
  • Services > S3
    • Create Bucket : Bucket (컴퓨터의 저장장치)
    • 참고로 Bucket 을 만들 때 이름은 AWS 내부적으로 unique 해야한다 중복을 허용하지 않음
    • Bucket이 생성되면 Upload file 눌러서 파일 업로드하면 파일마다 Link 생성
    • 해당 링크로 파일에 Access가능

S3 소개

  • S3(Simple Storage Service)
  • S3의 장점
    • 내구성 : 파일을 저장했을 때 파일이 유실되지 않는 가능성
      • 11 9s of durability across all storage classes
    • 저렴한 비용 : S3는 사용하는 만큼 필요한 만큼만 비용 지불
    • 여러 가용 영역에 걸쳐 99.999999999%의 객체 내구성과 99.9%의 연중 가용성을 제공하도록 설계
    • Designed for durability of 99.999999999% of objects across multiple Availability Zones and for 99.9% availability over a given year
    • 보안
    • 확장가능

PHP를 위한 S3 SDK

  • AmazonS3FullAccess 권한신청을 IAM 에서 해야함
  • S3 client

파일 전송

<?php
require 'vendor/autoload.php';
$param = Array('region'=>'ap-northeast-2', 'version'=>'2006-03-01');
$s3 = new Aws\S3\S3Client($param);
$s3->putObject(Array(
    'ACL'=>'public-read', /*access rights*/
    'SourceFile'=>'sample.txt',
    'Bucket'=>'codingeverybody2',
    'Key'=>'sample.txt'
));
?>

파일 목록 가져오기

<?php
require 'vendor/autoload.php';
$param = Array('region'=>'ap-northeast-2', 'version'=>'2006-03-01');
$s3 = new Aws\S3\S3Client($param);
$list = $s3->listObjects(Array('Bucket'=>'codingeverybody2'));
$listArray = $list->toArray();
foreach($listArray['Contents'] as $item){
    print($item['Key']."\n");
}
?>
  • 위 php코드를 실행하면 codingeverybody2 Bucket의 파일들의 목록을 가져와서 console에 print해줌

파일 다운로드

<?php
require 'vendor/autoload.php';
$param = Array('region'=>'ap-northeast-2', 'version'=>'2006-03-01');
$s3 = new Aws\S3\S3Client($param);
$s3->getObject(Array(
    'Bucket'=>'codingeverybody2',
    'Key'=>'sample.txt',
    'SaveAs'=>fopen('sample_saved.txt', 'w') /*어디에 저장할 것인가*/
));

Nodejs를 위한 S3 SDK

  • AmazonS3FullAccess 권한신청을 IAM 에서 해야함
  • JavaScript: Javascript는 HTML과 CSS로 만들어진 웹페이지를 동적으로 변경해주는 웹 프로그래밍 언어
    • Alongside HTML and CSS, JavaScript is one of the core technologies of the World Wide Web(WWW)
  • Nodejs
    • JavaScript는 독립적인 언어가 아니라 스크립트 언어로써, 특정한 프로그램 안에서만 동작
    • 크롬, 파이어폭스, 사파리, 익스플로러
    • Node/js는 터미널 프로그램(원도우 cmd, mac terminal 등)에서 node를 입력하여 브라우저 없이도 실행
    • Node.js is an open-source, cross-platform, back-end JavaScript runtime environment that runs on the V8 engine and executes JavaScript code outside a web browser.
  • Class: AWS.S3

업로드

  • putObject()
    • putObject(params = {}, callback)
    • callback : 콜백 함수는 코드를 통해 명시적으로 호출하는 함수가 아니라, 개발자는 단지 함수를 동록하기만 하고, 어떤 이벤트가 발생했거나 특정 시점에 도달했을 때 시스템에서 호출하는 함수
    • 아래 예시에서는 –> 파일을 전송하고나서 전송이 끝나면 실행되도록 약속된 function() callback 함수
  • upload
var AWS = require('aws-sdk');
var fs = require('fs'); // fs : nodejs 에서 파일을 핸들링하는 모듈 --> 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){ //이미지 주소가 필요한 경우에는 putObject 대신에 upload
    console.log(err);
    console.log(data);
})

목록

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()) { // 데이터를 가져올때 paging을하고 순차적으로 데이터를 처리함
        response.nextPage().on('success', handlePage).send();
    }
}).send();

다운로드

  • getObject()
    • S3에 올라간 파일을 다운받아서 자신의 컴퓨터에 저장하는 방법
var AWS = require('aws-sdk'); // aws 모듈 추가
AWS.config.region = 'ap-northeast-2';
var s3 = new AWS.S3();
var file = require('fs').createWriteStream('logo.png'); // 내컴퓨터에 write
var params = {Bucket:'codingeverybody2', Key:'logo.png'};
s3.getObject(params).createReadStream().pipe(file); // s3로부터 읽는 것

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

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');
})

Categories:

Updated: