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

基本介紹

教學目標

透過 Node.js 進行 Amazon DynamoDB 傳入和取出 JSON 格式的記錄。

前置作業

  1. 申請 AWS 雲端服務帳號。
  2. 請在 Amazon DynamoDB 服務中建立 Table (建立 id 為主鍵的 Hash 字串),用於傳入和取出 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 dynamodb = new AWS.DynamoDB();

傳入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var params = {
"TableName": "Table 名稱",
"Item": {
"id":{"S": "1"},
"name":{"S": "leoyeh"}
}
};
dynamodb.putItem(params, function(err, result) {
if (err) {
console.log(err);
} else {
console.log(result);
}
});

取出

1
2
3
4
5
6
7
8
9
10
11
12
13
var params = {
"TableName":"Table 名稱",
"Key":{
"id":{"S": "1"}
}
};
dynamodb.getItem(params, function(err, result) {
if (err) {
console.log(err);
} else {
console.log(result.Item);
}
});

更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var params = {
"TableName": "Table 名稱",
"Key": {
"id": {"S": "1"}
},"AttributeUpdates": {
"gender": {"Value": {"S": "male"}, "Action": "PUT"},
"age": {"Value": {"N": 25}, "Action": "PUT"}
}
};
dynamodb.updateItem(params, function(err, result) {
if (err) {
console.log(err);
} else {
console.log(result);
}
});

掃描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var params = {
"TableName": "Table 名稱",
"ScanFilter": {
"gender": {
"AttributeValueList": [{"S": "male"}],
"ComparisonOperator": "CONTAIN"
},
},
"Limit": "100"
};
dynamodb.scan(params, function(err, result) {
if (err) {
console.log(err);
} else {
console.log(result);
}
});

相關資源

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

基本介紹

教學目標

透過 Node.js 進行 Amazon Kinesis 傳入和取出 JSON 格式的記錄。

前置作業

  1. 申請 AWS 雲端服務帳號。
  2. 請在 Amazon Kinesis 服務中建立 Stream 用於傳入和取出 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 kinesis = new AWS.Kinesis();

傳入

1
2
3
4
5
6
7
8
9
10
11
12
var params = {
Data: JSON.stringify({id:1,name:"leoyeh"}),
PartitionKey: "key",
StreamName: "Stream 名稱"
};
kinesis.putRecord(params, function(err, result) {
if (err) {
console.log(err);
} else {
console.log(result);
}
});

取出

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
var params = {
ShardId: "shardId-000000000000",
ShardIteratorType: "LATEST",
StreamName: "Stream 名稱",
};
kinesis.getShardIterator(params, function(err, result) {
if (err) {
console.log(err);
} else {
getRecord(result.ShardIterator);
}
});

function getRecord(shard_iterator) {
var params = {
ShardIterator: shard_iterator
};
kinesis.getRecords(params, function(err, result) {
if (err) {
console.log(err);
} else {
try {
var StringDecoder = require('string_decoder').StringDecoder;
var decoder = new StringDecoder('utf8');
var data = JSON.parse(decoder.write(result.Records[0].Data));
console.log(data);
} catch(err) {
console.log("等待資料...");
}
if (result.NextShardIterator) {
getRecord(result.NextShardIterator);
}
}
});
}

相關資源

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 指令一起使用,因為當上傳檔案過大時,會發生上傳一半被中斷的問題。

相關資源

雲端服務 - Design Pattern (1)

基本介紹

教學目標

學習有關資料管理的設計模式,適用 Amazon 、 Google 、 Microsoft 等雲端服務。

重點概念

Cache-aside Pattern

模式說明

從資料儲存中載入需要的資料至快取,這個模式會改進效能同時協助維護快取與儲存之間的資料一致性。

情境描述

應用程式會使用快取優化重複存取資訊的操作,然而問題是快取資料常常會與儲存資料不一致的情況發生,因此需要實作策略協助確保快取資料更新至最新的狀態。

解決方案

Cache-aside Pattern

(參考資源: Cache-Aside Pattern )

使用情況

當快取資料集為靜態類型時,適合使用。

經驗分享

透過 Amazon 雲端服務實作 App 的 API 時,透過 Amazon EC2、Amazon RDS 和 Amazon ElatiCache 雲端服務實作此模式以最有效率的方式提供使用者最新內容。

Static Content Hosting Pattern

模式說明

部署靜態內容至雲端雲端儲存服務讓客戶端能直接進行存取,這個模式會減少直接存取所需伺服器的潛在成本。

情境描述

網站應用程式一般會包括一些靜態內容元素,雖然網站伺服器會優化請求動態產生快取頁面更有效率,但仍然還是需要處理下載靜態內容的請求。

解決方案

Static Content Hosting Pattern

(參考資源: Static Content Hosting Pattern )

使用情況

最小化網站管理的成本,同時網站中有許多靜態資源,適合使用。

經驗分享

透過 Amazon 雲端服務實作 App 相關的網站資源時,透過 Amazon EC2 、 Amazon S3 和 Amazon CloudFront 雲端服務實作此模式以最有效率的方式提供使用者最新內容。

Command and Query Responsibility Segregation (CQRS) Pattern

模式說明

隔離讀取資料和更新資料的操作,這個模式會最大化效能、延展性和安全性,同時提供高度系統彈性操作,以及預防來自不同領域層的合併更新所造成的衝突。

情境描述

傳統的資料管理系統,CRUD 操作皆是針對相同的資料儲存體進行處理,當資料量龐大時進行讀寫操作將會非常沒有效率。

解決方案

Command and Query Responsibility Segregation (CQRS) Pattern

(參考資源: Command and Query Responsibility Segregation (CQRS) Pattern )

使用情況

透過平行處理的方式針對資料進行多項協同領域的複雜寫入操作,以及需要有效率的進行讀取操作時,適合使用。

經驗分享

透過 Amazon 雲端服務實作 App 的 API 時,透過 Amazon EC2 、 Google BigQuery 和 Google Docs Spreadsheet 雲端服務分別實作命令模式和查詢模式,以最有效率的方式提供使用者最新內容。

相關資源

雲端服務 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 開源專案進行資料分析處理。

相關資源