Lately, I’ve been developing a Lambda function to create a pair of keys, store one in a parameter and return the other to the user. Today I got my first clean run, and I’m writing this to celebrate.
As part of learning lots of things along the way, because I hadn’t developed anything on AWS before, I found out that AWS reports errors in many different ways. Here are those that occurred to me in the last few hours.
See: AWS Lambda Invoke Errors (documentation)
Error — InvalidZipFileException
{ InvalidZipFileException: Lambda was not able to unzip the file
       <stack trace...>
     message: 'Lambda was not able to unzip the file',
     code: 'InvalidZipFileException',
     time: 2017-09-16T16:04:04.558Z,
     requestId: '<request id...>',
     statusCode: 502,
     retryable: true } }
- This error occurred because the zip file I had uploaded was wrong: the files it contained were stored into a directory.
 - This is a Lambda creation error, and it’s quite complete.
 - Unhandled / Handled classification is limited to Lambda execution.
 
Error — Process exited
{ errorMessage: 'RequestId: <request id...> Process exited before completing request' }
- This error occurred because I threw a validation error.
 - I could catch this error, but don’t, so it’s classified as Unhandled.
 - The logs show my error and its stack trace.
 
17:12:39 START RequestId: <request id...> Version: $LATEST 17:12:39 2017-09-16T17:12:39.442Z <request id...> Error: Expected a pair ID for your keys. at setPairId (/var/task/createPairOfKeys.js:9832:15) at handler (/var/task/createPairOfKeys.js:9805:9) 17:12:39 END RequestId: <request id...> 17:12:39 REPORT RequestId: <request id...> Duration: 203.72 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 78 MB 17:12:39 RequestId: <request id...> Process exited before completing request
Error — Timed out
{ errorMessage: '2017-09-16T17:32:08.746Z <request id...> Task timed out after 10.00 seconds' }
- This error occurred because generating a pair of keys is not fast (bigint maths involved) and, in my few tests, it sometimes needed more than 40 seconds.
 - Surprisingly, my MacBook is faster than AWS Lambda. A few times it took less than 1 second, most of the times less than 6 seconds, and only once it timed out at 10 seconds.
 - I can’t catch this error, so it’s classified as Unhandled.
 
Error — AccessDeniedException
{ errorMessage: 'User: <user arn...> is not authorized to perform: ssm:PutParameter on resource: <resource arn...>',
        errorType: 'AccessDeniedException',
        stackTrace: [Object] } } }
- This error occurred because the role I had assigned to my Lambda function didn’t have the right to write SSM parameters.
 - I catch this error and swallow it, so it’s classified as Handled.
 
Error — ParameterAlreadyExists
{ errorMessage: 'The parameter already exists. To overwrite this value, set the overwrite option in the request to true.',
        errorType: 'ParameterAlreadyExists',
        stackTrace: [Object] } } }
- This error occurred because I explicitly create my SSM parameter with overwrite set to false. Not gonna change it, this is by design.
 - Notice how this is an exception whose name doesn’t end with Exception.
 - I catch this error and swallow it, so it’s classified as Handled.
 
