AWS LamdaとS3のクロスリージョンレプリケーションで安心感を得る方法


AWSつかってますかー？ [@srockstyle](http://twitter.com/srockstyle)です。

今日はAWSのS3のお話です。

## ファイルがあがったら自動で別バケットにバックアップ

一つのバケットだけに依存していると不安になるときありませんか？
S3は99.9999999くらい落ちないとはいえ、それでも0.0000000001くらいの確率で落ちるわけで、あとS3に問題なくても手でファイルやバケット本体を消しちゃったとかありますよね。

そんなときに備えて手を打っときましょう。

### AWS Lamdaでオブジェクト作成時に別バケットにコピー

手っ取り早いのはAWS LamdaでS3の通知をうけて別バケットにコピーしちゃいましょう。Lamdaスクリプトはイベントドリブンで好きな通知に合わせてファイルを別バケットに送信してくれます。

```JavaScript

// S3 Sync Script
console.log('Loading event');
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});

// lamda start
exports.handler = function(event, context) {
  console.log('Received event:');
  console.log(JSON.stringify(event, null, '  '));

  // Basic
  var source_bucket = event.Records[0].s3.bucket.name;
  var target_bucket = [ターゲットのバケット名];
  var key = event.Records[0].s3.object.key;

  // Sync Start
  s3.copyObject(
    {
      Bucket:target_bucket,
      Key:key,
      CopySource: source_bucket + "/" +  key,
    },
    function(err,data) {
      if (err) {
        console.log('error sync object ' + key + ' from bucket ' + bucket + '.');
        context.done('error','error sync file'+err);
      }
      else {
        console.log('CONTENT TYPE:',data.ContentType);
        context.done(null,'');
      }
    }
  );
};
```

これで対象のbucketにコピーされるはずです。Lamdaスクリプトを設定するときはS3:ObjectCreatedを指定してください。他の通知は以下のドキュメントに書いてありました！

 * [Amazon S3 イベント通知の設定](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/NotificationHowTo.html)

でもこれとは別にS3だけで同じことができる機能があります。
それがS3のクロスリージョンレプリケーションです。

## S3のクロスリージョンレプリケーションで別リージョンのバケットにファイルをコピー

クロスリージョンレプリケーションは、メインとなるリージョンとは違うリージョンに作られたS3バケットに対してファイルをコピーする機能です。イメージとしてはRDBのマスター・スレーブのレプリケーションとほぼ同じです。
とあるバケット上で行った操作、作成・編集・削除などを別バケットにも瞬時に反映するっていうやつです。

やってみた感じだとリアルタイムとまではいかなくてもかなり素早く別バケットにファイルをコピーしてくれます。

それでは設定しましょ。こっちはコードを書くことなくほとんどAWSマネジメントコンソール上でできちゃいます。

### 設定方法（マスター・スレーブ共通）

 ![S3_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/2820/e639d2f3-0c10-9625-fd23-0385c5b069e4.png "S3_Management_Console.png")


まずS3の画面を開いてバケットを選択したら「プロパティ」からメニューを出します。クロスリージョンレプリケーションというメニューがあるので、クリックします。
![S3_Management_Console2.png](https://qiita-image-store.s3.amazonaws.com/0/2820/5aeb970d-b41b-8727-2622-991f714a23e2.png "S3_Management_Console2.png")
すると「バージョニングを有効にしないとレプリケーションできないよう」と注意書きが流れます。マスターのバケット、スレーブのバケット共にこのバージョニングを有効化しておいてください。バージョニングの説明は後述しますね。

### 設定方法（マスター）

クロスリージョンレプリケーションは一方的に送るだけなので、MySQLとかと違って片方だけ設定すれば大丈夫です。なのでマスター側の設定がおわれば基本的にクロスリージョンレプリケーションは完了します。
![S3_Management_Console 3.png](https://qiita-image-store.s3.amazonaws.com/0/2820/c9c5cd12-e8a9-f6ce-7d90-206de5f1c47f.png "S3_Management_Console 3.png")
クロスリージョンレプリケーションを有効化にチェックをいれましょう。

ただ、バージョニングをしている場合に注意点ですが、古いものを削除していかないとコストがかかっていくので、ライフサイクルの設定をきちんと行いましょう。ライフサイクルは下のバージョニングの項目で説明します。
![S3_Management_Console4.png](https://qiita-image-store.s3.amazonaws.com/0/2820/fe862492-0324-1d66-a721-65f27e4b782b.png "S3_Management_Console4.png")
そしたらレプリケーション先のリージョンとバケットを指定して、ロールを作成します。ロール作成画面がもどると保存できるようになるので、保存ボタンを押して完了です。

注意しなくちゃいけないのは、メッセージもでてますがあくまで新規ファイルのみレプリケーションされ、既存のファイルはコピーされないということです。既存も必要であれば移行バッチかaws-cliとか使ってコピー作業をすませておきましょう。

## バージョニング

バージョニングを有効にしていると、ファイルを削除しても時間はかかりますが復旧できたりします。ただ注意点が一つ。

ライフサイクルの設定を忘れずに行いましょう！これわすれるとS3の料金があばばばばばばばばってなります。

### ライフサイクルの設定

これはクロスリージョンレプリケーションのバケット両方に行います。例えば、指定時間経過したら本当にバックアップファイルも削除する、みたいなときにもつかいます。

![S3_Management_Console 5.png](https://qiita-image-store.s3.amazonaws.com/0/2820/a5b893f1-cffb-5bea-eac6-291786f64b19.png "S3_Management_Console 5.png")
まずはクロスリージョンレプリケーションの上にあるバージョニングをクリックしてください。

その中に「ルールを作成する」という項目があるので、それをクリック。

![S3_Management_Console6.png](https://qiita-image-store.s3.amazonaws.com/0/2820/14db8512-d86d-4fb1-4fa9-db4ac71ac744.png "S3_Management_Console6.png")

次の画面で色々でてきます。
![S3_Management_Console 7.png](https://qiita-image-store.s3.amazonaws.com/0/2820/a0378e64-77d1-4b7f-fb4f-d35b75a94453.png "S3_Management_Console 7.png")

ここでメニューを選んで、完全に削除するには何日という設定をします。

![S3_Management_Console8.png](https://qiita-image-store.s3.amazonaws.com/0/2820/5b78692e-fd91-d79d-e552-a6e5ea123807.png "S3_Management_Console8.png")


最後に名前を決めて保存です。これで完了です。

バージョニングの注意点ですが、アーカイブの保存先がGlacierに保存されていくようなので、それほど高くはならないけどコストを気にするならライフサイクル設定をしておくこと、そしてGlacier -> S3への復活までにはしばらく時間がかかることは留意しておいてくださいね。

## まとめ

本来ならバッチ専用のサーバを作ってCrontabに登録とかしなくてはいけないところが、AWSの設定だけでできてしまいました。

昔に比べるとサーバ管理がすごく楽になりましたね。やっぱりAWS様神ですね！　おつかれさまでした！

-----------------------
[ブログもよろしくね！](http://www.srockstyle.com/)