Amazon S3

Node.js 雲端服務 - Amazon (6)

基本介紹

教學目標

透過 Node.js 搭配 Amazon S3 雲端服務建立上傳圖片檔案的應用。

前置作業

  1. 申請 AWS 雲端服務帳號。
  2. 請在 Amazon S3 服務中建立 Bucket 用於儲存圖片檔案。
  3. 透過 AWS IAM Management Console 取得 AWS credentials 用於授權存取 AWS 雲端服務,並且新增 config.json。
    1
    { "accessKeyId": "Access Key ID", "secretAccessKey": "Secret Access Key", "region": "us-east-1" }

套件安裝

1
$ npm install aws-sdk --save

使用教學

撰寫程式

首先透過 HTML5 、 Bootstrap 套件和 jQuery 套件開發上傳網頁。

file_upload.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<!DOCTYPE HTML>
<html>
<head>
<title>檔案上傳服務</title>
<link href="http://library.leoyeh.me/css/bootstrap/bootstrap-3.3.1.min.css" rel="stylesheet"></link>
<link href="http://library.leoyeh.me/css/bootstrap/bootstrap-theme-3.3.1.min.css" rel="stylesheet"></link>
<link href="http://library.leoyeh.me/css/bootstrap/cover/cover.css" rel="stylesheet"></link>
<link href="http://library.leoyeh.me/css/jquery/jquery.fileupload-9.5.7.min.css" rel="stylesheet"></link>
<script src="http://library.leoyeh.me/js/jquery/jquery-1.11.1.min.js"></script>
<script src="http://library.leoyeh.me/js/jquery/jquery-ui-1.10.4.min.js"></script>
<script src="http://library.leoyeh.me/js/jquery/jquery.fileupload-9.5.7.min.js"></script>
</head>
<body>
<div class="site-wrapper">
<div class="site-wrapper-inner">
<div class="cover-container">
<div class="masthead clearfix">
<div class="inner">
<h1 class="masthead-brand">檔案上傳服務</h1>
</div>
</div>
<div class="inner cover">
<h3 class="cover-heading">上傳</h3>
<span class="btn btn-success fileinput-button">
<i class="glyphicon glyphicon-plus"></i>
<span>Select files...</span>
<input id="fileupload" type="file" name="images" multiple>
</span>
<h3 class="cover-heading">處理</h3>
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
<h3 class="cover-heading">網址</h3>
<div id="result">
</div>
</div>
<div class="mastfoot">
<div class="inner">
<p>&copy; 2014 <a href="https://github.com/LeoYehTW/file-upload-with-s3" target="_blank">Github</a> (MIT license) .</p>
</div>
</div>
</div>
</div>
</div>
<script>
$(function() {
$('#fileupload').fileupload({
url: '/images',
dataType: 'json',
progressall: function(e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css('width', progress + '%');
},
done: function(e, data) {
$("#result").html(data.result.url);
}
});
});
</script>

</body>
</html>

接著透過 Node.js 和 Express 套件開發上傳伺服器。

server.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
'use strict';
var express = require('express');
var multer = require('multer');
var mime = require('mime');
var path = require('path');
var fs = require('fs');

var app = express();
app.listen(5000);

app.use(express.static(path.join(__dirname, 'public')));

app.use(multer({ dest: './uploads/' }));

var AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');
var s3bucket = new AWS.S3();

app.post('/images', function (req, res) {
console.log(req.files.images);
fs.readFile(req.files.images.path, function (err, data) {
var filename = req.files.images.originalname;
s3bucket.putObject({
Bucket: "bucket 名稱",
Key: 'images/' + filename,
Body: data,
ACL:'public-read',
ContentType: mime.lookup(filename)
}, function (err, data) {
if (err) {
console.log(err);
} else {
var file_data = new Object();
file_data.url = "https://s3.amazonaws.com/[bucket 名稱]/images/" + filename;
res.send(file_data);
}
});
});
});

此外可以從 Github 下載完整程式碼範例。

1
$ git clone https://github.com/LeoYehTW/file-upload-with-s3

注意事項

請勿搭配 forever -w 指令一起使用,因為當上傳檔案過大時,會發生上傳一半被中斷的問題。

相關資源

雲端服務 Amazon Web Service (2)

基本介紹

教學目標

學會如何根據大數據處理階段,選擇最適合的 Amazon 雲端服務。

重點概念

Big Data Portfolio of Services

在大數據處理的階段根據下表,就能在篩選出最適合的 Amazon 雲端服務。

處理階段 雲端服務
收集 AWS Direct Connect、AWS Import/Export、Amazon Kinesis
儲存 Amazon S3、Amazon DynamoDB、Amazon Glacier
處理 & 分析 Amazon Redshift 、Amazon EMR、Amazon EC2

(參考資源: AWS re:Invent 2014 | (BDT303) Construct ETL Pipeline w/ AWS Data Pipeline, Amazon EMR & Redshift )

Batch Processing

Amazon EMR 雲端服務搭配 Apache Mahout 開源專案進行資料分析處理。

Amazon EMR 雲端服務搭配 Apache Spark 開源專案進行資料分析處理。

Real-time Processing

Amazon Kinesis 雲端服務搭配 Amazon Redshift 雲端服務進行資料分析處理。

Amazon Kinesis 雲端服務搭配 Storm 開源專案進行資料分析處理。

相關資源

雲端服務 Amazon Web Service (1)

基本介紹

教學目標

學會如何根據不同的需求選擇 Amazon Web Service 中最適合的資料儲存服務。

重點概念

針對需求根據下表的不同項目進行評估,就能在初期篩選出最適合的資料儲存服務。

DynamoDB RDS Redshift EMR S3 Elasitc Cahche Glacier
平均延遲 毫秒 毫秒、秒 秒、分鐘 秒、分鐘、小時 毫秒、秒、分鐘 毫秒 小時
資料大小 GB ~ TBs GB ~ TB (3TB) TB ~ PB (1.6PB) GB ~ PB GB ~ PB GB GB ~ PB
項目大小 KB (64KB) KB KB (64KB) KB ~ MB KB ~ GB B ~ KB GB
結構
請求率 低 ~ 高
持久性 低 ~ 中
儲存成本

(參考資源: AWS re:Invent 2014 | (BDT310) Big Data Architectural Patterns and Best Practices on AWS )

相關資源

Node.js 雲端服務 - Amazon (2)

基本介紹

教學目標

透過 Node.js 進行 Amazon S3 上傳與下載 JSON 格式的檔案。

前置作業

  1. 申請 AWS 雲端服務帳號。
  2. 請在 Amazon S3 服務中建立 Bucket 用於儲存 JSON 格式的檔案。
  3. 透過 AWS IAM Management Console 取得 AWS credentials 用於授權存取 AWS 雲端服務,並且新增 config.json。
    1
    { "accessKeyId": "Access Key ID", "secretAccessKey": "Secret Access Key", "region": "us-east-1" }

套件安裝

1
$ npm install aws-sdk --save

使用教學

建立

1
2
3
var AWS = require('aws-sdk'); 
AWS.config.loadFromPath('./config.json');
var s3 = new AWS.S3();

上傳

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var params = {
Bucket: "bucket 名稱",
Key: "path/file 名稱",
Body: {data: "資料內容"},
ACL: "public-read",
ContentType: "application/json"
};
s3.putObject(params, function(err, data) {
if (err) {
console.log(err);
} else {
console.log("上傳 JSON 檔案成功!");
}
});

下載

1
2
3
4
5
6
7
8
9
10
11
var params = {
Bucket: "bucket 名稱",
Key: "path/file 名稱"
};
s3.getObject(params, function(err, data) {
if (err) {
console.log(err);
} else {
console.log(JSON.parse(data.Body.toString()));
}
});

相關資源