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)
- 파일을 저장하는 서비스
- Amazon S3 시작하기
- 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
파일 전송
- putObject()
<?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');
})