{ "name": "zip-s3", "description": "AWS Lamda Function", "version": "0.0.1", "private": "true", "devDependencies": { "aws-sdk": "^2.1.4", "grunt": "^0.4.5", "grunt-aws-lambda": "^0.3.0" }, "dependencies": { "promise": "^6.0.1", "s3-upload-stream": "^1.0.7", "archiver": "^0.13.1" }, "bundledDependencies": [ "promise", "s3-upload-stream", "archiver" ] }
npm install
exports.handler = function (data, context) { context.done(null, ''); }
{ bucket : 'from-bucket', keys : ['/123/test.txt', '/456/test2.txt'], outputBucket : 'to-bucket', outputKey : 'result.zip' }
var AWS = require('aws-sdk'); var Promise = require('promise'); var s3Stream = require('s3-upload-stream')(new AWS.S3()); var archiver = require('archiver'); var s3 = new AWS.S3();
var archive = archiver('zip'); var upload = s3Stream.upload({ "Bucket": data.outputBucket, "Key": data.outputKey }); archive.pipe(upload);
var allDonePromise = new Promise(function(resolveAllDone) { upload.on('uploaded', function (details) { resolveAllDone(); }); }); allDonePromise.then(function() { context.done(null, ''); });
var getObjectPromises = []; for(var i in data.keys) { (function(itemKey) { itemKey = decodeURIComponent(itemKey).replace(/\+/g,' '); var getPromise = new Promise(function(resolveGet) { s3.getObject({ Bucket: data.bucket, Key : itemKey }, function(err, fileData) { if (err) { console.log(itemKey, err, err.stack); resolveGet(); } else { var itemName = itemKey.substr(itemKey.lastIndexOf('/')); archive .append(fileData.Body, { name: itemName }); resolveGet(); } }); }); getObjectPromises.push(getPromise); })(data.keys[i]); } Promise.all(getObjectPromises).then(function() { archive.finalize(); });
var AWS = require('aws-sdk'); var Promise = require('promise'); var s3Stream = require('s3-upload-stream')(new AWS.S3()); var archiver = require('archiver'); var s3 = new AWS.S3(); exports.handler = function (data, context) { var archive = archiver('zip'); var upload = s3Stream.upload({ "Bucket": data.outputBucket, "Key": data.outputKey }); archive.pipe(upload); var allDonePromise = new Promise(function(resolveAllDone) { upload.on('uploaded', function (details) { resolveAllDone(); }); }); allDonePromise.then(function() { context.done(null, ''); }); var getObjectPromises = []; for(var i in data.keys) { (function(itemKey) { itemKey = decodeURIComponent(itemKey).replace(/\+/g,' '); var getPromise = new Promise(function(resolveGet) { s3.getObject({ Bucket: data.bucket, Key : itemKey }, function(err, data) { if (err) { console.log(itemKey, err, err.stack); resolveGet(); } else { var itemName = itemKey.substr(itemKey.lastIndexOf('/')); archive .append(data.Body, { name: itemName }); resolveGet(); } }); }); getObjectPromises.push(getPromise); })(data.keys[i]); } Promise.all(getObjectPromises).then(function() { archive.finalize(); }); };
module.exports = function(grunt) { grunt.initConfig({ lambda_invoke: { default: { } }, lambda_package: { default: { } }, lambda_deploy: { default: { function: 'zip-s3' } } }); grunt.loadNpmTasks('grunt-aws-lambda'); };
[default] aws_access_key_id = ... aws_secret_access_key = ...
grunt lambda_package lambda_deploy
JSONObject requestData = new JSONObject(); requestData.put("bucket", "from-bucket"); requestData.put("outputBucket","to-bucket"); requestData.put("outputKey", "result.zip"); JSONArray keys = new JSONArray(); keys.put(URLEncoder.encode("/123/1.txt","UTF-8")); keys.put(URLEncoder.encode("/456/2.txt","UTF-8")); requestData.put("keys", keys);
AWSCredentials myCredentials = new BasicAWSCredentials(accessKeyID, secretKey); AWSLambdaClient awsLambda = new AWSLambdaClient(myCredentials); InvokeAsyncRequest req = new InvokeAsyncRequest(); req.setFunctionName("zip-s3"); req.setInvokeArgs(requestData.toString()); InvokeAsyncResult res = awsLambda.invokeAsync(req);
Source: https://habr.com/ru/post/247661/