node.jsでS3にバックアップを送り
続けるコードを書いてみた話
S3にセミリアルタイム同期
with node.js
node-s3maの紹介
ARAKI Yasuhiro (ar1@)
自己紹介
名前
• 荒木 靖宏(twitter: ar1)
肩書
• プリンシパルソリューション
アーキテクト

好きなAWSサービス
• Amazon Virtual Private
Cloud
• AWS Direct Connect
クラウドストレージ Amazon S3
世界中の8拠点から選択

S3
東京リージョン
データ置くだけ。イ
ンフラ、電源、気に
しない。
容量無制限。

保存するデータは、
自動で暗号化する
ことも可能
データセンターA

バケット

データセンターB

データセンターC

3か所以上で
自動複製

安価な従量課金
ファイル(バイナリ、
テキスト、画像、動画)

例:1GB/月 – 約10円

高い耐久性で
データ失わない:
99.999999999%
Simple(シンプルに使えること)
ファイルのPUT/GET/DELETE/LIST/COPY
•

これだけ。とってもシンプル
Plug & Play: クラウドストレージを簡
単に使うための3rdパーティーソリュー
ションが豊富に存在。ソリューション
を使う事で簡単に利用する事が可能

SDK: アプリケーションデベロッパーは、
S3 SDKを使ってアプリケーションを開
発することが可能

Internet Web
Services API
HTTP(S)

S3
& /or
Glacier

S3

AWS Storage
Gateway
node-s3ma
Automatic local file backup to two of S3
buckets.
node-s3maの動作
Region

node-s3ma
1)ファイル保存

2)S3にPUT

3)S3にバケット間
COPY命令

指定したディレクトリ以
下のファイル更新を検出

Region
node-s3maをつかってみる
インストール
• npm install node-watch aws-sdk mime

設定ファイル
{
"watchDir": "/tmp",
"accessKeyId": "AKIA******",
"secretAccessKey": "**********",
"region": "us-west-2",
"bucket": "*******-oregon",
"topPrefix": "backup/",
"bucketSync": "**********-ireland",
"topPrefixSync": "backup/",
"endpointSync": "https://s3-eu-west-1.amazonaws.com"
}
node-s3maの機能
nodeが動けばどんな環境でも動く(はず)
ファイルの変更監視
• inotify (linux)
• WindowsやMacなどなどでも動かすためにnode-watch.js

並列転送
• nodeなんでC10Kとか
• コア数分はマルチプロセス動作

mime-typeの自動判別
• mime.jsの使用。拡張子毎に任意に設定可能
協力したい?
https://github.com/armaniacs/node-s3ma/
• コアコードは100行弱です!
• いっしょに試してくれる人募集
• 特にLinuxとMac以外で試していただける方
使用例
S3を使って静的なウェブサイトを
ホスティングする
S3でウェブサイトをホスティングする理由
運用いらず
• データがなくならないので、バックアップの必要なし
• ハードウェア障害でサイトにアクセスできなくなる心配な
し
• 容量無制限なのでディスクがあふれる心配なし
• 大量トラフィックによりサイトが落ちる心配なし
• 操作はシンプルで簡単

安い
• 従量課金で1ヶ月10円からはじめられる

技術で料金を下げることが可能
例: 月間10000PVのサイトが月157円
想定スペック
• ページ数100
• 1ページ当たりのファイル数 30
• 1ページ当たりの平均サイズ 1MB
• 月間PV 10000
項目

単価

ストレージ

10円/GB

リクエスト

0.4円/10000リクエスト

転送量

15.7円/GB

合計

金額
1円
12円
144円

157円
S3を使って静的Webサイトを公開する手順
1. Webサイト用にS3のバケットを設定する。
2. バケット内のファイルがアップロードした際、自動的
に公開されるようバケットポリシーを追加する。
続くスライドではここを説明します

3. 手元でnode-s3maを動かす
4. S3のwebsite endpointにアクセスし、ウェブサイトが表
示されることを確認する。
S3を使って静的なウェブサイトを
ホスティングするためのバケット設定方法
Webサイト用にバケットを設定する
[All Buckets]をクリックしてバケット一覧ページを表示します。

1. [All Buckets]をクリック
Webサイト用にバケットを設定する
虫めがねボタンをクリックして右側にバケットのプロパティを表示します

1. 虫めがねボタンをクリック
Webサイト用にバケットを設定する
[Static Website Hosting]をクリックし、静的ウェブサイト用の設定項目を表
示します。

1. [Static Website Hosting]をクリック
Webサイト用にバケットを設定する
[Enable website hosting]を選択し、Index 、Error Documentに
ファイル名を入力したら、[Save]ボタンをクリックし設定を有効にします。
1. [Enable website hosting]をクリック

2. [index.html]と入力
3. [error.html]と入力

4. [Save]をクリック
Webサイト用にバケットを設定する
Endpointを確認しておきます。
•

Endpoint経由でアクセスすることで、パス指定なしのURLでアクセスした場合に、Index
Documentに指定したファイル(index.html)が、ファイルが存在しないURLにアクセスし
た場合にError Documentに指定したファイル(error.html)が表示されるようになります。

Endpointを確認しておきます。
バケットポリシーを設定する
バケットポリシーを設定し、このバケットにアップロードされたファイルは
自動的に公開されるように設定します。
プロパティから[Permissions]をクリックし、[Add bucket policy]をクリックし
て、Bucket Policy Editorを起動します。
1. [Permissions]をクリック

2. [Add bucket policy]をクリック
バケットポリシーを設定する
Editorが表示されたら、下側にある [Sample Bucket Policies]をクリックし、
サンプルページを表示します。サンプルページは別ウィンドウで開きます。

1. [Sample Bucket Policies]をクリック
バケットポリシーを設定する
[Granting Permission to Anonymous User]を見つけて、その内容をコピーし
ます。

1. この部分をコピー
バケットポリシーを設定する
コピーしたポリシーをEditorに貼り付けます。

1. この部分に貼り付け
バケットポリシーを設定する
貼り付けた内容の[bucket]という部分を自分のバケット名に書きかえます。
書きかえ終えたら、[Save]ボタンをクリックし設定を保存します。

1. この部分を自分のバケット名に書きかえる

2. [Save]をクリック
バケットポリシーを設定する
バケットポリシーの保存が正常に完了すると
[Add bucket policy]が[Edit bucket policy]に変わります。

Edit bucket policyに変わっている

node.jsでS3にバックアップを送り続けるコードを書いてみた話。Node s3maの紹介-jawsugさいたま