diff --git a/lib/plugins/aws/deploy/lib/checkForChanges.js b/lib/plugins/aws/deploy/lib/checkForChanges.js index fcb72af4a..bbc7bc0e5 100644 --- a/lib/plugins/aws/deploy/lib/checkForChanges.js +++ b/lib/plugins/aws/deploy/lib/checkForChanges.js @@ -41,7 +41,17 @@ module.exports = { return this.provider.request('S3', 'listObjectsV2', params - ).then((result) => { + ).catch((reason) => { + if (!_.includes(reason.message, 'The specified bucket does not exist')) { + return BbPromise.reject(reason); + } + const stackName = this.provider.naming.getStackName(); + return BbPromise.reject(new this.serverless.classes.Error([ + `The serverless deployment bucket "${params.Bucket}" does not exist.`, + `Create it manually if you want to reuse the CloudFormation stack "${stackName}",`, + 'or delete the stack if it is no longer required.', + ].join(' '))); + }).then((result) => { if (result && result.Contents && result.Contents.length) { const objects = result.Contents; diff --git a/lib/plugins/aws/deploy/lib/checkForChanges.test.js b/lib/plugins/aws/deploy/lib/checkForChanges.test.js index 5345f397b..4a8e9fb4f 100644 --- a/lib/plugins/aws/deploy/lib/checkForChanges.test.js +++ b/lib/plugins/aws/deploy/lib/checkForChanges.test.js @@ -135,6 +135,23 @@ describe('checkForChanges', () => { }); }); + it('should translate error if rejected due to missing bucket', () => { + listObjectsV2Stub + .rejects(new serverless.classes.Error('The specified bucket does not exist')); + + return expect(awsDeploy.getMostRecentObjects()).to.be.rejectedWith([ + `The serverless deployment bucket "${awsDeploy.bucketName}" does not exist.`, + 'Create it manually if you want to reuse the CloudFormation stack "my-service-dev",', + 'or delete the stack if it is no longer required.', + ].join(' ')); + }); + + it('should throw original error if rejected not due to missing bucket', () => { + listObjectsV2Stub + .rejects(new serverless.classes.Error('Other reason')); + return expect(awsDeploy.getMostRecentObjects()).to.be.rejectedWith('Other reason'); + }); + it('should resolve if result array is empty', () => { const serviceObjects = { Contents: [],