From 6a15f45f0d1662bc68703e4c014e828a28c4cf14 Mon Sep 17 00:00:00 2001 From: Nikola Tosic Date: Thu, 27 Oct 2016 10:52:35 +0200 Subject: [PATCH 1/7] Adding support for S3 function code updates. Updated mocks and README --- README.md | 25 ++++++++ package.json | 3 +- test/unit/deploy_task_test.js | 12 +++- utils/deploy_task.js | 112 ++++++++++++++++++++++++++-------- 4 files changed, 126 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index cec1a5b..7a6fa8e 100644 --- a/README.md +++ b/README.md @@ -327,6 +327,31 @@ grunt.initConfig({ You could then run `grunt lambda_package lambda_deploy` and it'll automatically create the package and deploy it without having to specify a package name. +##### options.deploy_mode +Type: `String` +Default value: `zip` + +Can be `zip` or `s3`. Determines how the code will be uploaded to lambda - via direct upload or via S3. For larger archives, +S3 may be more suitable. + +##### options.S3bucketName +Type: `String` +Default value: `null` + +Mandatory if `options.deploy_mode='s3'`. S3 bucket to upload code archive to. + +##### options.S3Prefix +Type: `String` +Default value: `` + +Used only for `options.deploy_mode='s3'`. S3 bucket prefix to be used when uploading code archive. + +##### options.S3MultiUploadPartSize +Type: `String` +Default value `5mb` + +For larger archives, determines chunk size for s3 multi-upload. Minimum value is '5mb'. + ##### options.profile Type: `String` Default value: `null` diff --git a/package.json b/package.json index aa9e517..a7f65f0 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,8 @@ "aws-sdk": "~2.2.32", "proxy-agent": "latest", "npm": "^2.10.0", - "q": "^1.4.1" + "q": "^1.4.1", + "bytes": "^2.4.0" }, "devDependencies": { "grunt-contrib-jshint": "^0.9.2", diff --git a/test/unit/deploy_task_test.js b/test/unit/deploy_task_test.js index d584f18..ffb16d8 100644 --- a/test/unit/deploy_task_test.js +++ b/test/unit/deploy_task_test.js @@ -40,6 +40,7 @@ var deployTaskTest = {}; var awsSDKMock, lambdaAPIMock, + s3APIMock, defaultGruntConfig, proxyAgentMock; @@ -70,6 +71,14 @@ deployTaskTest.setUp = function(done) { updateAlias: sinon.stub().callsArgWithAsync(1, null, {}) }; + s3APIMock = { + ManagedUpload : function(params){ + return { + send : sinon.stub(), + } + } + }; + awsSDKMock = { SharedIniFileCredentials: sinon.stub(), EC2MetadataCredentials: sinon.stub(), @@ -80,7 +89,8 @@ deployTaskTest.setUp = function(done) { }, Lambda: function(params) { return lambdaAPIMock; - } + }, + S3: s3APIMock }; proxyAgentMock = sinon.spy(); diff --git a/utils/deploy_task.js b/utils/deploy_task.js index fd6c675..143dff2 100644 --- a/utils/deploy_task.js +++ b/utils/deploy_task.js @@ -14,6 +14,7 @@ var AWS = require('aws-sdk'); var Q = require('q'); var arnParser = require('./arn_parser'); var dateFacade = require('./date_facade'); +var bytes = require('bytes'); var deployTask = {}; @@ -39,18 +40,22 @@ deployTask.getHandler = function (grunt) { aliases: null, enablePackageVersionAlias: false, subnetIds: null, - securityGroupIds: null + securityGroupIds: null, + deploy_mode: 'zip', + S3bucketName: null, + S3Prefix: '', + S3MultiUploadPartSize: '5mb' }); - + if (options.profile !== null) { var credentials = new AWS.SharedIniFileCredentials({profile: options.profile}); AWS.config.credentials = credentials; } //Adding proxy if exists - if(process.env.https_proxy !== undefined) { + if (process.env.https_proxy !== undefined) { AWS.config.update({ - httpOptions: { agent: proxy(process.env.https_proxy) } + httpOptions: {agent: proxy(process.env.https_proxy)} }); } @@ -83,6 +88,12 @@ deployTask.getHandler = function (grunt) { var package_version = grunt.config.get('lambda_deploy.' + this.target + '.version'); var package_name = grunt.config.get('lambda_deploy.' + this.target + '.package_name'); var archive_name = grunt.config.get('lambda_deploy.' + this.target + '.archive_name'); + var deploy_mode = grunt.config.get('lambda_deploy.' + this.target + '.deploy_mode'); + var s3_bucket_name = grunt.config.get('lambda_deploy.' + this.target + '.S3bucketName'); + var s3_prefix = grunt.config.get('lambda_deploy.' + this.target + '.S3Prefix') || ''; + var s3_part_size = grunt.config.get('lambda_deploy.' + this.target + '.S3MultiUploadPartSize') || '5mb'; + var is_s3_upload = deploy_mode == 's3'; + var s3_key = is_s3_upload ? s3_prefix + path.basename(deploy_package) : undefined; if (deploy_arn === null && deploy_function === null) { grunt.fail.warn('You must specify either an arn or a function name.'); @@ -150,10 +161,10 @@ deployTask.getHandler = function (grunt) { } if (options.subnetIds !== null && options.securityGroupIds !== null) { - configParams.VpcConfig = { - SubnetIds : options.subnetIds, - SecurityGroupIds : options.securityGroupIds - }; + configParams.VpcConfig = { + SubnetIds: options.subnetIds, + SecurityGroupIds: options.securityGroupIds + }; } var updateConfig = function (func_name, func_options) { @@ -248,38 +259,91 @@ deployTask.getHandler = function (grunt) { } }; - grunt.log.writeln('Uploading...'); - fs.readFile(deploy_package, function (err, data) { - if (err) { - grunt.fail.warn('Could not read package file (' + deploy_package + '), verify the lambda package ' + - 'location is correct, and that you have already created the package using lambda_package.'); + var uploadPackageToS3 = function (package_data) { + var upload_params = { + Bucket: s3_bucket_name, + Key: s3_key, + Body: package_data + }, + managed_upload = new AWS.S3.ManagedUpload({params: upload_params, partSize: bytes(s3_part_size)}), + deferred = Q.defer(); + + if (is_s3_upload) { + managed_upload.send(function (err) { + if (err) { + grunt.fail.warn('S3 Upload failed: ' + err); + deferred.reject(); + } + + grunt.log.writeln('S3 Upload success'); + deferred.resolve(); + }); + } else { + deferred.resolve(); } - var codeParams = { - FunctionName: deploy_function, - ZipFile: data - }; + return deferred.promise; + }; - lambda.updateFunctionCode(codeParams, function (err, data) { + var updateFunctionCode = function (code_params) { + var deferred = Q.defer(); + lambda.updateFunctionCode(code_params, function (err, data) { if (err) { grunt.fail.warn('Package upload failed, check you have lambda:UpdateFunctionCode permissions and that your package is not too big to upload.'); + deferred.reject(); } grunt.log.writeln('Package deployed.'); + deferred.resolve(); + }); + return deferred.promise; + }; + + grunt.log.writeln('Uploading...'); + fs.readFile(deploy_package, function (err, data) { + if (err) { + grunt.fail.warn('Could not read package file (' + deploy_package + '), verify the lambda package ' + + 'location is correct, and that you have already created the package using lambda_package.'); + } + var code_params; + + if (is_s3_upload) { + code_params = { + FunctionName: deploy_function, + S3Bucket: s3_bucket_name, + S3Key: s3_key + }; + } else { + code_params = { + FunctionName: deploy_function, + ZipFile: data + }; + } + + uploadPackageToS3(data).then(function () { + return updateFunctionCode(code_params); + }).then(function () { updateConfig(deploy_function, configParams) - .then(function () {return createVersion(deploy_function);}) - .then(function () {return setAliases(deploy_function);}) - .then(function () {return setPackageVersionAlias(deploy_function);}) + .then(function () { + return createVersion(deploy_function); + }) + .then(function () { + return setAliases(deploy_function); + }) + .then(function () { + return setPackageVersionAlias(deploy_function); + }) .then(function () { done(true); }).catch(function (err) { - grunt.fail.warn('Uncaught exception: ' + err.message); - }); + grunt.fail.warn('Uncaught exception: ' + err.message); + }); }); }); }); }; -}; +} + module.exports = deployTask; From fdddb8c7fe811906fbd0e6c1793f5632bf0bb3a0 Mon Sep 17 00:00:00 2001 From: Nikola Tosic Date: Fri, 18 Nov 2016 07:29:37 +0100 Subject: [PATCH 2/7] Change package name --- package.json | 4 +- utils/deploy_task.js | 344 +++++++++++++++++++++---------------------- 2 files changed, 173 insertions(+), 175 deletions(-) diff --git a/package.json b/package.json index a7f65f0..c2aa112 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "grunt-aws-lambda", + "name": "toshke-grunt-aws-lambda", "description": "A grunt plugin to help develop AWS Lambda functions.", "version": "0.13.0", "homepage": "https://github.com/Tim-B/grunt-aws-lambda", @@ -9,7 +9,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/Tim-B/grunt-aws-lambda.git" + "url": "git://github.com/toshke/grunt-aws-lambda.git" }, "bugs": { "url": "https://github.com/Tim-B/grunt-aws-lambda/issues" diff --git a/utils/deploy_task.js b/utils/deploy_task.js index 143dff2..b8d81c6 100644 --- a/utils/deploy_task.js +++ b/utils/deploy_task.js @@ -134,214 +134,212 @@ deployTask.getHandler = function (grunt) { lambda.getFunction({FunctionName: deploy_function}, function (err, data) { - if (err) { - if (err.statusCode === 404) { - grunt.fail.warn('Unable to find lambda function ' + deploy_function + ', verify the lambda function name and AWS region are correct.'); - } else { - grunt.log.error('AWS API request failed with ' + err.statusCode + ' - ' + err); - grunt.fail.warn('Check your AWS credentials, region and permissions are correct.'); + if (err) { + if (err.statusCode === 404) { + grunt.fail.warn('Unable to find lambda function ' + deploy_function + ', verify the lambda function name and AWS region are correct.'); + } else { + grunt.log.error('AWS API request failed with ' + err.statusCode + ' - ' + err); + grunt.fail.warn('Check your AWS credentials, region and permissions are correct.'); + } } - } - var current = data.Configuration; - var configParams = {}; - var version = '$LATEST'; + var current = data.Configuration; + var configParams = {}; + var version = '$LATEST'; - if (options.timeout !== null) { - configParams.Timeout = options.timeout; - } - - if (options.memory !== null) { - configParams.MemorySize = options.memory; - } - - if (options.handler !== null) { - configParams.Handler = options.handler; - } + if (options.timeout !== null) { + configParams.Timeout = options.timeout; + } - if (options.subnetIds !== null && options.securityGroupIds !== null) { - configParams.VpcConfig = { - SubnetIds: options.subnetIds, - SecurityGroupIds: options.securityGroupIds - }; - } + if (options.memory !== null) { + configParams.MemorySize = options.memory; + } - var updateConfig = function (func_name, func_options) { - var deferred = Q.defer(); - if (Object.keys(func_options).length > 0) { - func_options.FunctionName = func_name; - lambda.updateFunctionConfiguration(func_options, function (err, data) { - if (err) { - grunt.fail.warn('Could not update config, check that values and permissions are valid'); - deferred.reject(); - } else { - grunt.log.writeln('Config updated.'); - deferred.resolve(); - } - }); - } else { - grunt.log.writeln('No config updates to make.'); - deferred.resolve(); + if (options.handler !== null) { + configParams.Handler = options.handler; } - return deferred.promise; - }; - var createVersion = function (func_name) { - var deferred = Q.defer(); - if (options.enableVersioning) { - lambda.publishVersion({FunctionName: func_name, Description: getDeploymentDescription()}, function (err, data) { - if (err) { - grunt.fail.warn('Publishing version for function ' + func_name + ' failed with message ' + err.message); - deferred.reject(); - } else { - version = data.Version; - grunt.log.writeln('Version ' + version + ' published.'); - deferred.resolve(); - } - }); - } else { - deferred.resolve(); + if (options.subnetIds !== null && options.securityGroupIds !== null) { + configParams.VpcConfig = { + SubnetIds: options.subnetIds, + SecurityGroupIds: options.securityGroupIds + }; } - return deferred.promise; - }; + var updateConfig = function (func_name, func_options) { + var deferred = Q.defer(); + if (Object.keys(func_options).length > 0) { + func_options.FunctionName = func_name; + lambda.updateFunctionConfiguration(func_options, function (err, data) { + if (err) { + grunt.fail.warn('Could not update config, check that values and permissions are valid'); + deferred.reject(); + } else { + grunt.log.writeln('Config updated.'); + deferred.resolve(); + } + }); + } else { + grunt.log.writeln('No config updates to make.'); + deferred.resolve(); + } + return deferred.promise; + }; - var createOrUpdateAlias = function (func_name, set_alias) { - var deferred = Q.defer(); + var createVersion = function (func_name) { + var deferred = Q.defer(); + if (options.enableVersioning) { + lambda.publishVersion({FunctionName: func_name, Description: getDeploymentDescription()}, function (err, data) { + if (err) { + grunt.fail.warn('Publishing version for function ' + func_name + ' failed with message ' + err.message); + deferred.reject(); + } else { + version = data.Version; + grunt.log.writeln('Version ' + version + ' published.'); + deferred.resolve(); + } + }); + } else { + deferred.resolve(); + } - var params = { - FunctionName: func_name, - Name: set_alias + return deferred.promise; }; + var createOrUpdateAlias = function (func_name, set_alias) { + var deferred = Q.defer(); - lambda.getAlias(params, function (err, data) { - params.FunctionVersion = version; - params.Description = getDeploymentDescription(); - var aliasFunction = 'updateAlias'; - if (err) { - if (err.statusCode === 404) { - aliasFunction = 'createAlias'; - } else { - grunt.fail.warn('Listing aliases for ' + func_name + ' failed with message ' + err.message); - deferred.reject(); - return; - } - } - lambda[aliasFunction](params, function (err, data) { + var params = { + FunctionName: func_name, + Name: set_alias + }; + + + lambda.getAlias(params, function (err, data) { + params.FunctionVersion = version; + params.Description = getDeploymentDescription(); + var aliasFunction = 'updateAlias'; if (err) { - grunt.fail.warn(aliasFunction + ' for ' + func_name + ' failed with message ' + err.message); - deferred.reject(); - } else { - grunt.log.writeln('Alias ' + set_alias + ' updated pointing to version ' + version + '.'); - deferred.resolve(); + if (err.statusCode === 404) { + aliasFunction = 'createAlias'; + } else { + grunt.fail.warn('Listing aliases for ' + func_name + ' failed with message ' + err.message); + deferred.reject(); + return; + } } + lambda[aliasFunction](params, function (err, data) { + if (err) { + grunt.fail.warn(aliasFunction + ' for ' + func_name + ' failed with message ' + err.message); + deferred.reject(); + } else { + grunt.log.writeln('Alias ' + set_alias + ' updated pointing to version ' + version + '.'); + deferred.resolve(); + } + }); }); - }); - return deferred.promise; - }; + return deferred.promise; + }; - var setAliases = function (func_name) { - if (options.aliases) { - var promises = []; - options.aliases.forEach(function (alias) { - promises.push(createOrUpdateAlias(func_name, alias)); - }); - return Q.all(promises); - } - }; + var setAliases = function (func_name) { + if (options.aliases) { + var promises = []; + options.aliases.forEach(function (alias) { + promises.push(createOrUpdateAlias(func_name, alias)); + }); + return Q.all(promises); + } + }; - var setPackageVersionAlias = function (func_name) { - if (options.enablePackageVersionAlias && package_version) { - return createOrUpdateAlias(func_name, package_version.replace(/\./g, '-')); - } - }; - - var uploadPackageToS3 = function (package_data) { - var upload_params = { - Bucket: s3_bucket_name, - Key: s3_key, - Body: package_data - }, - managed_upload = new AWS.S3.ManagedUpload({params: upload_params, partSize: bytes(s3_part_size)}), - deferred = Q.defer(); - - if (is_s3_upload) { - managed_upload.send(function (err) { + var setPackageVersionAlias = function (func_name) { + if (options.enablePackageVersionAlias && package_version) { + return createOrUpdateAlias(func_name, package_version.replace(/\./g, '-')); + } + }; + + var uploadPackageToS3 = function (package_data) { + var upload_params = { + Bucket: s3_bucket_name, + Key: s3_key, + Body: package_data + }, + managed_upload = new AWS.S3.ManagedUpload({params: upload_params, partSize: bytes(s3_part_size)}), + deferred = Q.defer(); + + if (is_s3_upload) { + managed_upload.send(function (err) { + if (err) { + grunt.fail.warn('S3 Upload failed: ' + err); + deferred.reject(); + } + + grunt.log.writeln('S3 Upload success'); + deferred.resolve(); + }); + } else { + deferred.resolve(); + } + + return deferred.promise; + }; + + var updateFunctionCode = function (code_params) { + var deferred = Q.defer(); + lambda.updateFunctionCode(code_params, function (err, data) { if (err) { - grunt.fail.warn('S3 Upload failed: ' + err); + grunt.fail.warn('Package upload failed, check you have lambda:UpdateFunctionCode permissions and that your package is not too big to upload.'); deferred.reject(); } - grunt.log.writeln('S3 Upload success'); + grunt.log.writeln('Package deployed.'); deferred.resolve(); }); - } else { - deferred.resolve(); - } - - return deferred.promise; - }; + return deferred.promise; + }; - var updateFunctionCode = function (code_params) { - var deferred = Q.defer(); - lambda.updateFunctionCode(code_params, function (err, data) { + grunt.log.writeln('Uploading...'); + fs.readFile(deploy_package, function (err, data) { if (err) { - grunt.fail.warn('Package upload failed, check you have lambda:UpdateFunctionCode permissions and that your package is not too big to upload.'); - deferred.reject(); + grunt.fail.warn('Could not read package file (' + deploy_package + '), verify the lambda package ' + + 'location is correct, and that you have already created the package using lambda_package.'); } - grunt.log.writeln('Package deployed.'); - deferred.resolve(); - }); - return deferred.promise; - }; - - grunt.log.writeln('Uploading...'); - fs.readFile(deploy_package, function (err, data) { - if (err) { - grunt.fail.warn('Could not read package file (' + deploy_package + '), verify the lambda package ' + - 'location is correct, and that you have already created the package using lambda_package.'); - } - - var code_params; - - if (is_s3_upload) { - code_params = { - FunctionName: deploy_function, - S3Bucket: s3_bucket_name, - S3Key: s3_key - }; - } else { - code_params = { - FunctionName: deploy_function, - ZipFile: data - }; - } + var code_params; + + if (is_s3_upload) { + code_params = { + FunctionName: deploy_function, + S3Bucket: s3_bucket_name, + S3Key: s3_key + }; + } else { + code_params = { + FunctionName: deploy_function, + ZipFile: data + }; + } - uploadPackageToS3(data).then(function () { - return updateFunctionCode(code_params); - }).then(function () { - updateConfig(deploy_function, configParams) - .then(function () { - return createVersion(deploy_function); - }) - .then(function () { - return setAliases(deploy_function); - }) - .then(function () { - return setPackageVersionAlias(deploy_function); - }) - .then(function () { - done(true); - }).catch(function (err) { + uploadPackageToS3(data).then(function () { + return updateFunctionCode(code_params); + }).then(function () { + return updateConfig(deploy_function, configParams); + }).then(function () { + return createVersion(deploy_function); + }).then(function () { + return setAliases(deploy_function); + }).then(function () { + return setPackageVersionAlias(deploy_function); + }).then(function () { + done(true); + }).catch(function (err) { grunt.fail.warn('Uncaught exception: ' + err.message); }); + }); - }); - }); + } + ); }; } From d20be2d9ba5a9aa4d164780143c9a49bfe58385c Mon Sep 17 00:00:00 2001 From: Nikola Tosic Date: Thu, 29 Dec 2016 12:45:46 +0100 Subject: [PATCH 3/7] Using AWS options when constructing lambda client --- package.json | 2 +- utils/deploy_task.js | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index c2aa112..c70da18 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "toshke-grunt-aws-lambda", "description": "A grunt plugin to help develop AWS Lambda functions.", - "version": "0.13.0", + "version": "0.13.1", "homepage": "https://github.com/Tim-B/grunt-aws-lambda", "author": { "name": "Tim-B", diff --git a/utils/deploy_task.js b/utils/deploy_task.js index b8d81c6..a392e7c 100644 --- a/utils/deploy_task.js +++ b/utils/deploy_task.js @@ -109,9 +109,8 @@ deployTask.getHandler = function (grunt) { var done = this.async(); - var lambda = new AWS.Lambda({ - apiVersion: '2015-03-31' - }); + options.apiVersion = '2015-03-31' + var lambda = new AWS.Lambda(options); var getDeploymentDescription = function () { var description = 'Deployed '; From 8b6f6cac3c30cae55940ba0c22c78059123c5561 Mon Sep 17 00:00:00 2001 From: Nikola Tosic Date: Thu, 29 Dec 2016 14:59:23 +0100 Subject: [PATCH 4/7] Included LAMBDA_TASK_ROOT in lambda_invoke task --- package.json | 2 +- utils/invoke_task.js | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c70da18..1ba9bbe 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "toshke-grunt-aws-lambda", "description": "A grunt plugin to help develop AWS Lambda functions.", - "version": "0.13.1", + "version": "0.13.3", "homepage": "https://github.com/Tim-B/grunt-aws-lambda", "author": { "name": "Tim-B", diff --git a/utils/invoke_task.js b/utils/invoke_task.js index a9db0b9..1f43cb3 100644 --- a/utils/invoke_task.js +++ b/utils/invoke_task.js @@ -103,8 +103,13 @@ invokeTask.getHandler = function (grunt) { var lambda = invokeTask.loadFunction(options.file_name); var event = JSON.parse(fs.readFileSync(path.resolve(options.event), "utf8")); + + //set environment variables + process.env['LAMBDA_TASK_ROOT'] = process.env['PWD']; + + //invoke process lambda[options.handler](event, context, callback); }; }; -module.exports = invokeTask; \ No newline at end of file +module.exports = invokeTask; From 4a7f2df4297aa7948495ab18ccf8f00e75feaff3 Mon Sep 17 00:00:00 2001 From: Nikola Tosic Date: Thu, 29 Dec 2016 15:02:13 +0100 Subject: [PATCH 5/7] Fixing lint errors --- test/unit/deploy_task_test.js | 6 +++--- utils/deploy_task.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/unit/deploy_task_test.js b/test/unit/deploy_task_test.js index ffb16d8..6aa40b9 100644 --- a/test/unit/deploy_task_test.js +++ b/test/unit/deploy_task_test.js @@ -75,7 +75,7 @@ deployTaskTest.setUp = function(done) { ManagedUpload : function(params){ return { send : sinon.stub(), - } + }; } }; @@ -92,7 +92,7 @@ deployTaskTest.setUp = function(done) { }, S3: s3APIMock }; - + proxyAgentMock = sinon.spy(); fsMock.reset(); @@ -101,7 +101,7 @@ deployTaskTest.setUp = function(done) { fsMock.setFileContent('some-package.zip', 'abc123'); mockery.registerMock('aws-sdk', awsSDKMock); - + mockery.registerMock('proxy-agent', proxyAgentMock); var dateFacadeMock = { diff --git a/utils/deploy_task.js b/utils/deploy_task.js index a392e7c..8f4dc7c 100644 --- a/utils/deploy_task.js +++ b/utils/deploy_task.js @@ -92,7 +92,7 @@ deployTask.getHandler = function (grunt) { var s3_bucket_name = grunt.config.get('lambda_deploy.' + this.target + '.S3bucketName'); var s3_prefix = grunt.config.get('lambda_deploy.' + this.target + '.S3Prefix') || ''; var s3_part_size = grunt.config.get('lambda_deploy.' + this.target + '.S3MultiUploadPartSize') || '5mb'; - var is_s3_upload = deploy_mode == 's3'; + var is_s3_upload = deploy_mode === 's3'; var s3_key = is_s3_upload ? s3_prefix + path.basename(deploy_package) : undefined; if (deploy_arn === null && deploy_function === null) { @@ -109,7 +109,7 @@ deployTask.getHandler = function (grunt) { var done = this.async(); - options.apiVersion = '2015-03-31' + options.apiVersion = '2015-03-31'; var lambda = new AWS.Lambda(options); var getDeploymentDescription = function () { @@ -340,7 +340,7 @@ deployTask.getHandler = function (grunt) { } ); }; -} +}; module.exports = deployTask; From 6bbb4bff713d5d70a3ef5cf1371110dad2666f08 Mon Sep 17 00:00:00 2001 From: Nikola Tosic Date: Thu, 29 Dec 2016 15:09:51 +0100 Subject: [PATCH 6/7] Reverted package.json to use for PR --- package.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 1ba9bbe..aa9e517 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "toshke-grunt-aws-lambda", + "name": "grunt-aws-lambda", "description": "A grunt plugin to help develop AWS Lambda functions.", - "version": "0.13.3", + "version": "0.13.0", "homepage": "https://github.com/Tim-B/grunt-aws-lambda", "author": { "name": "Tim-B", @@ -9,7 +9,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/toshke/grunt-aws-lambda.git" + "url": "git://github.com/Tim-B/grunt-aws-lambda.git" }, "bugs": { "url": "https://github.com/Tim-B/grunt-aws-lambda/issues" @@ -35,8 +35,7 @@ "aws-sdk": "~2.2.32", "proxy-agent": "latest", "npm": "^2.10.0", - "q": "^1.4.1", - "bytes": "^2.4.0" + "q": "^1.4.1" }, "devDependencies": { "grunt-contrib-jshint": "^0.9.2", From aa676d7dc7968a57bc590925a3c47fecbbe6783b Mon Sep 17 00:00:00 2001 From: Nikola Tosic Date: Thu, 29 Dec 2016 15:14:23 +0100 Subject: [PATCH 7/7] Adding bytes dependency --- package.json | 107 ++++++++++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index aa9e517..040d154 100644 --- a/package.json +++ b/package.json @@ -1,55 +1,56 @@ { - "name": "grunt-aws-lambda", - "description": "A grunt plugin to help develop AWS Lambda functions.", - "version": "0.13.0", - "homepage": "https://github.com/Tim-B/grunt-aws-lambda", - "author": { - "name": "Tim-B", - "email": "tim@galacticcode.com" - }, - "repository": { - "type": "git", - "url": "git://github.com/Tim-B/grunt-aws-lambda.git" - }, - "bugs": { - "url": "https://github.com/Tim-B/grunt-aws-lambda/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/Tim-B/grunt-aws-lambda/blob/master/LICENSE-MIT" - } - ], - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "grunt" - }, - "dependencies": { - "temporary": "~0.0.8", - "archiver": "~0.14.4", - "mkdirp": "~0.5.0", - "rimraf": "~2.2.8", - "glob": "~4.3.0", - "aws-sdk": "~2.2.32", - "proxy-agent": "latest", - "npm": "^2.10.0", - "q": "^1.4.1" - }, - "devDependencies": { - "grunt-contrib-jshint": "^0.9.2", - "grunt-contrib-clean": "^0.5.0", - "grunt-contrib-nodeunit": "^0.3.3", - "mockery": "^1.4.0", - "grunt": "~0.4.5", - "adm-zip": "~0.4.4", - "sinon": "^1.17.3" - }, - "peerDependencies": { - "grunt": ">=0.4.0" - }, - "keywords": [ - "gruntplugin" - ] + "name": "grunt-aws-lambda", + "description": "A grunt plugin to help develop AWS Lambda functions.", + "version": "0.13.0", + "homepage": "https://github.com/Tim-B/grunt-aws-lambda", + "author": { + "name": "Tim-B", + "email": "tim@galacticcode.com" + }, + "repository": { + "type": "git", + "url": "git://github.com/Tim-B/grunt-aws-lambda.git" + }, + "bugs": { + "url": "https://github.com/Tim-B/grunt-aws-lambda/issues" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/Tim-B/grunt-aws-lambda/blob/master/LICENSE-MIT" + } + ], + "engines": { + "node": ">= 0.8.0" + }, + "scripts": { + "test": "grunt" + }, + "dependencies": { + "archiver": "~0.14.4", + "aws-sdk": "~2.2.32", + "bytes": "^2.4.0", + "glob": "~4.3.0", + "mkdirp": "~0.5.0", + "npm": "^2.10.0", + "proxy-agent": "latest", + "q": "^1.4.1", + "rimraf": "~2.2.8", + "temporary": "~0.0.8" + }, + "devDependencies": { + "grunt-contrib-jshint": "^0.9.2", + "grunt-contrib-clean": "^0.5.0", + "grunt-contrib-nodeunit": "^0.3.3", + "mockery": "^1.4.0", + "grunt": "~0.4.5", + "adm-zip": "~0.4.4", + "sinon": "^1.17.3" + }, + "peerDependencies": { + "grunt": ">=0.4.0" + }, + "keywords": [ + "gruntplugin" + ] }