最近node.jsを実案件で利用することが幾つかあり、AWSサービスをnodeから利用したいケースがあります。
そこで今回はnodeからS3へファイルをアップロードしてみたいと思います。

nodeでS3アクセスするには、knoxというモジュールがあります。
他にもs3-clientというknoxをもとにした簡易機能のモジュールがありますが、簡単さと引換に
ヘッダーを付けられない等の制限があるので、いろいろな機能を利用したい場合はknoxがよいかと思います。

今回は、redisからのpublishをトリガーにしてメッセージ内容をS3へJSONファイルとしてアップロードして
みたいと思います。

まず、S3にはアップロード用のバケットを用意しておき(ここではmemocra-jsonというバケットにしました)、
内容を確認しやすいように、webサイト設定をしておきます。

そしてEC2側では、既にnode, redis本体はインストールされている前提で、knox,redisのnodeモジュールを
追加でインストールします。

# npm install -g knox
# npm install -g redis

次にコードを書きます。
knox.createClientでアクセスキー、シークレットキーと対象バケットを指定し、クライアントオブジェクトを
作成します。

var knox = require('knox');var s3Client = knox.createClient({
key:'xxxxxxxxxxxxxx',
secret:'yyyyyyyyyyyyyyyyyyyyyyyyyyyy',
bucket:'memocra-json'
});

また、redisサーバーのjson_createというチャンネルをsubscribeするようにします。

var redis = require('redis');
var sub = redis.createClient({host:'10.0.0.200', port:6379});
sub.subscribe('json_create');

受信時には、受信内容と日時をJSON化して、その文字列をknoxクライアントのputメソッドでS3へ
アップロードします。
この際、ヘッダーにpublic-readをつけることで、WEBアクセスが可能になります。

sub.on('message', function(channel, message){
var json = JSON.stringify({msg:message, datetime:(new Date())});
var s3_path = 'json/'+message+'.json';
var headers = {'Content-Length': json.length,
'Content-Type': 'application/json',
'x-amz-acl': 'public-read'};
var req = s3Client.put(s3_path, headers);
req.on('response', function(res){
if(res.statusCode != 200){
console.log(&guot;Error! code=&guot;+res.statusCode);
}
else{
console.log(&guot;Done!&guot;);
}
});
req.on('error', function(err){
console.log('Error='+err);
});
req.end(json);
});

ここまで準備ができたら、起動します。

$ node sample.js

次にredis-cliを起動し、json_createチャンネルでpublishします。

# redis-cli
redis 127.0.0.1:6379> publish json_create hello
(integer) 1
redis 127.0.0.1:6379> publish json_create konnichiwa
(integer) 1

そうすると、node側では完了メッセージが2つ表示され、2件の処理が終わったことがわかります。

$ node sample.js
Done!
Done!

バケットを見ると、正しく2つファイルができています。

ブラウザで中身を見てみます。

内容も正しいようです。

もちろんこれ以外にも、ファイルをそのままアップロード、ダウンロード、削除する機能などもあり、
nodeでもS3のファイルを操作することができます。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら