From c8e0107a33e01d69d76e1b0f41c2cc8351ec3bcf Mon Sep 17 00:00:00 2001 From: Yamil Asusta Date: Tue, 3 Feb 2015 11:26:00 -0400 Subject: [PATCH 01/10] Fixed variable declaration style --- lib/main.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/main.js b/lib/main.js index 9bb14e73..5759c9b3 100644 --- a/lib/main.js +++ b/lib/main.js @@ -1,20 +1,19 @@ "use strict"; -var -aws = require( "aws-sdk" ), -exec = require( "child_process" ).exec, -fs = require( "fs" ), -os = require( "os" ), -packageJson = require( "./../package.json" ), -path = require( "path" ); - -var Lambda = function( ) { +var aws = require('aws-sdk'); +var exec = require('child_process').exec; +var fs = require('fs'); +var os = require('os'); +var packageJson = require('./../package.json'); +var path = require('path'); + +var Lambda = function() { this.version = packageJson.version; return this; }; -Lambda.prototype._createEnvFile = function( ) { +Lambda.prototype._createSampleFileFile = function( ) { var envfile = process.cwd() + "/.env", envexamplefile = __dirname + "/.env.example"; From d3c2aafe9b41d1af6243e03ab2515cc7de134c34 Mon Sep 17 00:00:00 2001 From: Yamil Asusta Date: Tue, 3 Feb 2015 11:40:48 -0400 Subject: [PATCH 02/10] Refactor setup process --- lib/main.js | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/lib/main.js b/lib/main.js index 5759c9b3..7d18e4df 100644 --- a/lib/main.js +++ b/lib/main.js @@ -13,35 +13,22 @@ var Lambda = function() { return this; }; -Lambda.prototype._createSampleFileFile = function( ) { - var - envfile = process.cwd() + "/.env", - envexamplefile = __dirname + "/.env.example"; - - if ( !fs.existsSync( envfile ) ) { - console.log( ".env file successfully created" ) - fs.writeFileSync( envfile, fs.readFileSync( envexamplefile) ); - } - -}; - -Lambda.prototype._createEventJsonFile = function( ) { - var - eventfile = process.cwd() + "/event.json", - eventexamplefile = __dirname + "/event.json.example"; - - if ( !fs.existsSync( eventfile ) ) { - console.log( "event.json file successfully created" ) - fs.writeFileSync( eventfile, fs.readFileSync( eventexamplefile ) ); +Lambda.prototype._createSampleFile = function(file) { + var exampleFile = process.cwd() + '/' + file; + var boilerplateFile = __dirname + '/' + file + '.example'; + + if (!fs.existsSync(exampleFile)) { + fs.writeFileSync(exampleFile, fs.readFileSync(boilerplateFile)); + console.log(exampleFile + ' file successfully created'); } }; Lambda.prototype.setup = function( ) { - console.log( "Running setup." ); - this._createEnvFile( ); - this._createEventJsonFile( ); - console.log( "Setup done. Edit the .env and event.json files as needed." ); + console.log('Running setup.'); + this._createSampleFile('.env'); + this._createSampleFile('event.json'); + console.log('Setup done. Edit the .env and event.json files as needed.'); }; Lambda.prototype.run = function( program ) { From 7c3b9d26007d60decbe7d863ef14a821f03672bc Mon Sep 17 00:00:00 2001 From: Yamil Asusta Date: Tue, 3 Feb 2015 11:55:40 -0400 Subject: [PATCH 03/10] Fix style --- lib/main.js | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/lib/main.js b/lib/main.js index 7d18e4df..28356d7d 100644 --- a/lib/main.js +++ b/lib/main.js @@ -24,51 +24,48 @@ Lambda.prototype._createSampleFile = function(file) { }; -Lambda.prototype.setup = function( ) { +Lambda.prototype.setup = function() { console.log('Running setup.'); this._createSampleFile('.env'); this._createSampleFile('event.json'); console.log('Setup done. Edit the .env and event.json files as needed.'); }; -Lambda.prototype.run = function( program ) { - this._createEventJsonFile( ); - - var - dir = program.directory, - splitHandler = program.handler.split( "." ), - filename = splitHandler[0] + ".js", - handlername = splitHandler[1]; +Lambda.prototype.run = function(program) { + this._createSampleFile('event.json'); + + var dir = program.directory; + var splitHandler = program.handler.split('.'); + var filename = splitHandler[0] + '.js'; + var handlername = splitHandler[1]; - var - handler = require( process.cwd() + "/" + filename )[handlername], - event = require( process.cwd() + "/event.json" ); + var handler = require(process.cwd() + '/' + filename)[handlername], + var event = require(process.cwd() + '/event.json'); - this._runHandler( handler, event ); + this._runHandler(handler, event); } -Lambda.prototype._runHandler = function( handler, event ) { +Lambda.prototype._runHandler = function(handler, event) { var context = { - done: function( ) { + done: function() { process.exit(0); } } - handler( event, context ); + handler(event, context); }; -Lambda.prototype._zipfileTmpPath = function( program ) { - var - ms_since_epoch = +new Date, - filename = program.functionName + "-" + ms_since_epoch + ".zip", - zipfile = path.join( os.tmpDir(), filename ); +Lambda.prototype._zipfileTmpPath = function(program) { + var ms_since_epoch = +new Date; + var filename = program.functionName + '-' + ms_since_epoch + '.zip'; + var zipfile = path.join(os.tmpDir(), filename); return zipfile; }; -Lambda.prototype._params = function( program, buffer ) { +Lambda.prototype._params = function(program, buffer) { var params = { - FunctionName: program.functionName + "-" + program.environment, + FunctionName: program.functionName + '-' + program.environment, FunctionZip: buffer, Handler: program.handler, Mode: program.mode, From 4e4bf4362455847a377f5814acbeeb3acf2b21c6 Mon Sep 17 00:00:00 2001 From: Yamil Asusta Date: Tue, 3 Feb 2015 12:31:32 -0400 Subject: [PATCH 04/10] Fix style --- lib/main.js | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/lib/main.js b/lib/main.js index 28356d7d..08fe7467 100644 --- a/lib/main.js +++ b/lib/main.js @@ -33,30 +33,30 @@ Lambda.prototype.setup = function() { Lambda.prototype.run = function(program) { this._createSampleFile('event.json'); - + var dir = program.directory; var splitHandler = program.handler.split('.'); var filename = splitHandler[0] + '.js'; var handlername = splitHandler[1]; - var handler = require(process.cwd() + '/' + filename)[handlername], + var handler = require(process.cwd() + '/' + filename)[handlername]; var event = require(process.cwd() + '/event.json'); this._runHandler(handler, event); -} +}; Lambda.prototype._runHandler = function(handler, event) { var context = { done: function() { process.exit(0); } - } + }; handler(event, context); }; Lambda.prototype._zipfileTmpPath = function(program) { - var ms_since_epoch = +new Date; + var ms_since_epoch = +new Date(); var filename = program.functionName + '-' + ms_since_epoch + '.zip'; var zipfile = path.join(os.tmpDir(), filename); @@ -79,24 +79,17 @@ Lambda.prototype._params = function(program, buffer) { return params; }; -Lambda.prototype.deploy = function( program ) { - this._createEnvFile( ); - - aws.config.update({ - accessKeyId: program.accessKey, - secretAccessKey: program.secretKey, - region: program.region - }); - - var - _this = this, - lambda = new aws.Lambda( { apiVersion: "2014-11-11" } ), - zipfile = _this._zipfileTmpPath( program ); +Lambda.prototype.deploy = function(program) { + this._createSampleFile('.env'); + + var _this = this; + var zipfile = _this._zipfileTmpPath(program); + var regions = program.regions.split(','); // zip up but ignore .git, .dotfiles, .log files, and the event.json file. - console.log( "Generating zip file" ); - exec( "zip -roq " + zipfile + " * -x '.git' -x '*/\.*' -x '*/\*.log' -x 'event.json'", function( err, stdout, stderr ) { - if ( err ) { + console.log('Generating zip file'); + exec( "zip -roq " + zipfile + " * -x '.git' -x '*/\.*' -x '*/\*.log' -x 'event.json'", function(err, stdout, stderr) { + if (err) { throw err; } @@ -122,3 +115,4 @@ Lambda.prototype.deploy = function( program ) { module.exports = new Lambda( ); +module.exports = new Lambda(); From ba6bd67267be3a200794ddd8dc50fa8942b6559c Mon Sep 17 00:00:00 2001 From: Yamil Asusta Date: Tue, 3 Feb 2015 12:35:04 -0400 Subject: [PATCH 05/10] Allow version tag, multi region --- lib/main.js | 55 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/lib/main.js b/lib/main.js index 08fe7467..15de3ebd 100644 --- a/lib/main.js +++ b/lib/main.js @@ -6,6 +6,7 @@ var fs = require('fs'); var os = require('os'); var packageJson = require('./../package.json'); var path = require('path'); +var async = require('async'); var Lambda = function() { this.version = packageJson.version; @@ -65,7 +66,7 @@ Lambda.prototype._zipfileTmpPath = function(program) { Lambda.prototype._params = function(program, buffer) { var params = { - FunctionName: program.functionName + '-' + program.environment, + FunctionName: program.functionName + '-' + program.environment + (program.version ? '/' + program.version: ''), FunctionZip: buffer, Handler: program.handler, Mode: program.mode, @@ -93,26 +94,38 @@ Lambda.prototype.deploy = function(program) { throw err; } - console.log( "Reading zip file to memory" ); - var - buffer = fs.readFileSync( zipfile ), - params = _this._params( program, buffer ); - - console.log( "Uploading zip file to AWS Lambda with parameters:" ); - console.log( params ); - - lambda.uploadFunction( params, function( err, data ) { - if ( err ) { - console.log( err ); - } else { - console.log( "Zip file done uploading. Results follow:" ); - console.log( data ); + console.log('Reading zip file to memory'); + var buffer = fs.readFileSync(zipfile); + var params = _this._params(program, buffer); + + async.each(regions, function(region, cb) { + console.log('Working in region: ' + region); + console.log('Uploading zip file to AWS Lambda with parameters:'); + console.log(params); + + aws.config.update({ + accessKeyId: program.accessKey, + secretAccessKey: program.secretKey, + region: region + }); + + var lambda = new aws.Lambda({ apiVersion: '2014-11-11' }); + + lambda.uploadFunction(params, function(err, data) { + if (err) { + cb(err); + } + console.log('Zip file done uploading. Results follow:'); + console.log(data); + cb(); + }); + + }, function(err) { + if (err) { + console.log(err); } - } ); - - } ); -} - -module.exports = new Lambda( ); + }); + }); +}; module.exports = new Lambda(); From c9e2febda8e27b795c91bb1bcd1f9abef8bfcad0 Mon Sep 17 00:00:00 2001 From: Yamil Asusta Date: Tue, 3 Feb 2015 12:35:19 -0400 Subject: [PATCH 06/10] add asyncjs --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 084fb867..82eae952 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "should": "" }, "dependencies": { + "async": "^0.9.0", "aws-sdk": "^2.0.28", "commander": "^2.5.0", "dotenv": "^0.4.0" From d5351e7adaac016a1ec21aace1f0552b18ddf4bc Mon Sep 17 00:00:00 2001 From: Yamil Asusta Date: Tue, 3 Feb 2015 12:42:38 -0400 Subject: [PATCH 07/10] Fix part of style, allow version tag --- bin/node-lambda | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/bin/node-lambda b/bin/node-lambda index 668e7caa..c606b2ad 100755 --- a/bin/node-lambda +++ b/bin/node-lambda @@ -1,26 +1,25 @@ #!/usr/bin/env node -var -dotenv = require( "dotenv" ), -lambda = require( "../lib/main.js" ), -program = require( "commander" ); -packageJson = require( process.cwd() + "/package.json" ); - -dotenv.load( ); - -var -AWS_ENVIRONMENT = process.env.AWS_ENVIRONMENT || "development", -AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID || "missing", -AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY || "missing", -AWS_REGION = process.env.AWS_REGION || "us-east-1", -AWS_FUNCTION_NAME = process.env.AWS_FUNCTION_NAME || packageJson.name, -AWS_HANDLER = process.env.AWS_HANDLER || "index.handler", -AWS_MODE = "event", -AWS_ROLE = process.env.AWS_ROLE || "missing", -AWS_MEMORY_SIZE = process.env.AWS_MEMORY_SIZE || 128, -AWS_TIMEOUT = process.env.AWS_TIMEOUT || 3, -AWS_DESCRIPTION = process.env.AWS_DESCRIPTION || "", -AWS_RUNTIME = process.env.AWS_RUNTIME || "nodejs"; +var dotenv = require('dotenv'); +var lambda = require('../lib/main.js'); +var program = require('commander'); +var packageJson = require(process.cwd() + '/package.json'); + +dotenv.load(); + +var AWS_ENVIRONMENT = process.env.AWS_ENVIRONMENT || 'development'; +var AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID || 'missing'; +var AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY || 'missing'; +var AWS_REGION = process.env.AWS_REGION || 'us-east-1'; +var AWS_FUNCTION_NAME = process.env.AWS_FUNCTION_NAME || packageJson.name; +var AWS_HANDLER = process.env.AWS_HANDLER || 'index.handler'; +var AWS_MODE = 'event'; +var AWS_ROLE = process.env.AWS_ROLE || 'missing'; +var AWS_MEMORY_SIZE = process.env.AWS_MEMORY_SIZE || 128; +var AWS_TIMEOUT = process.env.AWS_TIMEOUT || 3; +var AWS_DESCRIPTION = process.env.AWS_DESCRIPTION || ''; +var AWS_RUNTIME = process.env.AWS_RUNTIME || 'nodejs'; +var AWS_FUNCTION_VERSION = process.env.AWS_FUNCTION_VERSION || packageJson.version; program .version( lambda.version ) @@ -38,6 +37,7 @@ program .option( "-t, --timeout [" + AWS_TIMEOUT + "]", "Lambda Timeout", AWS_TIMEOUT ) .option( "-d, --description [" + AWS_DESCRIPTION + "]", "Lambda Description", AWS_DESCRIPTION ) .option( "-u, --runtime [" + AWS_RUNTIME + "]", "Lambda Runtime", AWS_RUNTIME ) + .option( "-v, --version [" + AWS_FUNCTION_VERSION + "]", "Lambda Function Version", AWS_FUNCTION_VERSION ) .action( function( prg ) { lambda.deploy( prg ); } ); @@ -59,6 +59,4 @@ program lambda.setup( ); } ) - - program.parse( process.argv ); From 984490dbdf131ef07d72f4bc47957863bae1d566 Mon Sep 17 00:00:00 2001 From: Yamil Asusta Date: Tue, 3 Feb 2015 12:52:53 -0400 Subject: [PATCH 08/10] Version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 82eae952..6550a61c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-lambda", - "version": "0.1.5", + "version": "0.2.0", "description": "Command line tool for locally running and remotely deploying your node.js applications to Amazon Lambda.", "main": "lib/main.js", "directories": { From d937f4dd93757d3573b7491750b39b2bf7ed0dd9 Mon Sep 17 00:00:00 2001 From: Yamil Asusta Date: Tue, 3 Feb 2015 12:56:14 -0400 Subject: [PATCH 09/10] Update test version --- test/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/main.js b/test/main.js index 63e6cde4..38437a30 100644 --- a/test/main.js +++ b/test/main.js @@ -28,7 +28,7 @@ describe( "dotenv", function( ) { } ); it( "version should be set", function( ) { - result.version.should.eql( "0.1.5" ); + result.version.should.eql( "0.2.0" ); } ); describe( "_zipfileTmpPath", function( ) { From c2a1bd090ffb8c0ec628bac96a300c7628d16a04 Mon Sep 17 00:00:00 2001 From: Yamil Asusta Date: Tue, 3 Feb 2015 13:14:31 -0400 Subject: [PATCH 10/10] Fix quote style --- bin/node-lambda | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/bin/node-lambda b/bin/node-lambda index c606b2ad..4b92c6b6 100755 --- a/bin/node-lambda +++ b/bin/node-lambda @@ -23,38 +23,38 @@ var AWS_FUNCTION_VERSION = process.env.AWS_FUNCTION_VERSION || packageJson.versi program .version( lambda.version ) - .command( "deploy" ) - .description( "Deploy your application to Amazon Lambda" ) - .option( "-e, --environment [" + AWS_ENVIRONMENT + "]", "Choose environment {development, stating, production}", AWS_ENVIRONMENT ) - .option( "-a, --accessKey [" + AWS_ACCESS_KEY_ID + "]", "AWS Access Key", AWS_ACCESS_KEY_ID ) - .option( "-s, --secretKey [" + AWS_SECRET_ACCESS_KEY + "]", "AWS Secret Key", AWS_SECRET_ACCESS_KEY ) - .option( "-r, --region [" + AWS_REGION + "]", "AWS Region", AWS_REGION ) - .option( "-n, --functionName [" + AWS_FUNCTION_NAME + "]", "Lambda FunctionName", AWS_FUNCTION_NAME ) - .option( "-h, --handler [" + AWS_HANDLER + "]", "Lambda Handler {index.handler}", AWS_HANDLER ) - .option( "-m, --mode [" + AWS_MODE + "]", "Lambda Mode", AWS_MODE ) - .option( "-o, --role [" + AWS_ROLE + "]", "Amazon role", AWS_ROLE ) - .option( "-m, --memorySize [" + AWS_MEMORY_SIZE + "]", "Lambda Memory Size", AWS_MEMORY_SIZE ) - .option( "-t, --timeout [" + AWS_TIMEOUT + "]", "Lambda Timeout", AWS_TIMEOUT ) - .option( "-d, --description [" + AWS_DESCRIPTION + "]", "Lambda Description", AWS_DESCRIPTION ) - .option( "-u, --runtime [" + AWS_RUNTIME + "]", "Lambda Runtime", AWS_RUNTIME ) - .option( "-v, --version [" + AWS_FUNCTION_VERSION + "]", "Lambda Function Version", AWS_FUNCTION_VERSION ) + .command( 'deploy' ) + .description( 'Deploy your application to Amazon Lambda' ) + .option( '-e, --environment [' + AWS_ENVIRONMENT + ']', 'Choose environment {development, stating, production}', AWS_ENVIRONMENT ) + .option( '-a, --accessKey [' + AWS_ACCESS_KEY_ID + ']', 'AWS Access Key', AWS_ACCESS_KEY_ID ) + .option( '-s, --secretKey [' + AWS_SECRET_ACCESS_KEY + ']', 'AWS Secret Key', AWS_SECRET_ACCESS_KEY ) + .option( '-r, --region [' + AWS_REGION + ']', 'AWS Region', AWS_REGION ) + .option( '-n, --functionName [' + AWS_FUNCTION_NAME + ']', 'Lambda FunctionName', AWS_FUNCTION_NAME ) + .option( '-h, --handler [' + AWS_HANDLER + ']', 'Lambda Handler {index.handler}', AWS_HANDLER ) + .option( '-m, --mode [' + AWS_MODE + ']', 'Lambda Mode', AWS_MODE ) + .option( '-o, --role [' + AWS_ROLE + ']', 'Amazon role', AWS_ROLE ) + .option( '-m, --memorySize [' + AWS_MEMORY_SIZE + ']', 'Lambda Memory Size', AWS_MEMORY_SIZE ) + .option( '-t, --timeout [' + AWS_TIMEOUT + ']', 'Lambda Timeout', AWS_TIMEOUT ) + .option( '-d, --description [' + AWS_DESCRIPTION + ']', 'Lambda Description', AWS_DESCRIPTION ) + .option( '-u, --runtime [' + AWS_RUNTIME + ']', 'Lambda Runtime', AWS_RUNTIME ) + .option( '-v, --version [' + AWS_FUNCTION_VERSION + ']', 'Lambda Function Version', AWS_FUNCTION_VERSION ) .action( function( prg ) { lambda.deploy( prg ); } ); program .version( lambda.version ) - .command( "run" ) - .description( "Run your Amazon Lambda application locally" ) - .option( "-h, --handler [" + AWS_HANDLER + "]", "Lambda Handler {index.handler}", AWS_HANDLER ) + .command( 'run' ) + .description( 'Run your Amazon Lambda application locally' ) + .option( '-h, --handler [' + AWS_HANDLER + ']', 'Lambda Handler {index.handler}', AWS_HANDLER ) .action( function( prg ) { lambda.run( prg ); } ); program .version( lambda.version ) - .command( "setup" ) - .description( "Sets up the .env file." ) + .command( 'setup' ) + .description( 'Sets up the .env file.' ) .action( function( prg ) { lambda.setup( ); } )