2014/11/27

AWS lambdaでS3 Objectをコピーする

lambdaというか、JavaScriptの勉強的にこんなlambdaスクリプト作った。やりたかったのは、

  1. S3 BucketにObjectがPUTされる。
  2. 同じBucketに、ファイル名に"copy-"と付与して、コピーを置く。
ってだけ。

--------------
var async = require('async');
var AWS = require('aws-sdk');

var s3 = new AWS.S3();

exports.handler = function(event, context) {
  var Bucket = event.Records[0].s3.bucket.name;
  var srcKey = event.Records[0].s3.object.key;
  var dstKey = "copy-" + srcKey;

  if (srcKey.substr(0,5) ==  'copy-') {
    return;
  }

  async.waterfall([
    function download(callback) {
      console.log('download start:' + srcKey);
      s3.getObject({
        Bucket: Bucket,
        Key: srcKey
      }, function(err, data) {
           if (err) { callback(err); }
           try {
             callback(null, data);
           } catch (e) {
             callback(e);
           }
         }
      );
    },
    function upload(arg1, callback) {
      console.log('upload start:' + dstKey);
      console.log('data:' + arg1.Body);
      s3.putObject({
        Bucket: Bucket,
        Key: dstKey,
        Body: arg1.Body
      }, function(err, data) {
           if (err) { callback(err); }
           try {
             callback(null);
           } catch (e) {
             callback(e);
           }
         }
      );
    }
  ], function (err) {
    if (err) { console.log('Error:' + err); }
    console.log('all done. ');
  });
};
--------------
そしてファイルを置いたら勝手にコピーされる。


はい。